yadflow 3.13.0 → 3.13.2

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.
@@ -347,474 +347,6 @@
347
347
  "tslib": "^2.4.0"
348
348
  }
349
349
  },
350
- "node_modules/@esbuild/aix-ppc64": {
351
- "version": "0.28.1",
352
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
353
- "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
354
- "cpu": [
355
- "ppc64"
356
- ],
357
- "dev": true,
358
- "license": "MIT",
359
- "optional": true,
360
- "os": [
361
- "aix"
362
- ],
363
- "peer": true,
364
- "engines": {
365
- "node": ">=18"
366
- }
367
- },
368
- "node_modules/@esbuild/android-arm": {
369
- "version": "0.28.1",
370
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
371
- "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
372
- "cpu": [
373
- "arm"
374
- ],
375
- "dev": true,
376
- "license": "MIT",
377
- "optional": true,
378
- "os": [
379
- "android"
380
- ],
381
- "peer": true,
382
- "engines": {
383
- "node": ">=18"
384
- }
385
- },
386
- "node_modules/@esbuild/android-arm64": {
387
- "version": "0.28.1",
388
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
389
- "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
390
- "cpu": [
391
- "arm64"
392
- ],
393
- "dev": true,
394
- "license": "MIT",
395
- "optional": true,
396
- "os": [
397
- "android"
398
- ],
399
- "peer": true,
400
- "engines": {
401
- "node": ">=18"
402
- }
403
- },
404
- "node_modules/@esbuild/android-x64": {
405
- "version": "0.28.1",
406
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
407
- "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
408
- "cpu": [
409
- "x64"
410
- ],
411
- "dev": true,
412
- "license": "MIT",
413
- "optional": true,
414
- "os": [
415
- "android"
416
- ],
417
- "peer": true,
418
- "engines": {
419
- "node": ">=18"
420
- }
421
- },
422
- "node_modules/@esbuild/darwin-arm64": {
423
- "version": "0.28.1",
424
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
425
- "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
426
- "cpu": [
427
- "arm64"
428
- ],
429
- "dev": true,
430
- "license": "MIT",
431
- "optional": true,
432
- "os": [
433
- "darwin"
434
- ],
435
- "peer": true,
436
- "engines": {
437
- "node": ">=18"
438
- }
439
- },
440
- "node_modules/@esbuild/darwin-x64": {
441
- "version": "0.28.1",
442
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
443
- "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
444
- "cpu": [
445
- "x64"
446
- ],
447
- "dev": true,
448
- "license": "MIT",
449
- "optional": true,
450
- "os": [
451
- "darwin"
452
- ],
453
- "peer": true,
454
- "engines": {
455
- "node": ">=18"
456
- }
457
- },
458
- "node_modules/@esbuild/freebsd-arm64": {
459
- "version": "0.28.1",
460
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
461
- "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
462
- "cpu": [
463
- "arm64"
464
- ],
465
- "dev": true,
466
- "license": "MIT",
467
- "optional": true,
468
- "os": [
469
- "freebsd"
470
- ],
471
- "peer": true,
472
- "engines": {
473
- "node": ">=18"
474
- }
475
- },
476
- "node_modules/@esbuild/freebsd-x64": {
477
- "version": "0.28.1",
478
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
479
- "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
480
- "cpu": [
481
- "x64"
482
- ],
483
- "dev": true,
484
- "license": "MIT",
485
- "optional": true,
486
- "os": [
487
- "freebsd"
488
- ],
489
- "peer": true,
490
- "engines": {
491
- "node": ">=18"
492
- }
493
- },
494
- "node_modules/@esbuild/linux-arm": {
495
- "version": "0.28.1",
496
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
497
- "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
498
- "cpu": [
499
- "arm"
500
- ],
501
- "dev": true,
502
- "license": "MIT",
503
- "optional": true,
504
- "os": [
505
- "linux"
506
- ],
507
- "peer": true,
508
- "engines": {
509
- "node": ">=18"
510
- }
511
- },
512
- "node_modules/@esbuild/linux-arm64": {
513
- "version": "0.28.1",
514
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
515
- "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
516
- "cpu": [
517
- "arm64"
518
- ],
519
- "dev": true,
520
- "license": "MIT",
521
- "optional": true,
522
- "os": [
523
- "linux"
524
- ],
525
- "peer": true,
526
- "engines": {
527
- "node": ">=18"
528
- }
529
- },
530
- "node_modules/@esbuild/linux-ia32": {
531
- "version": "0.28.1",
532
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
533
- "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
534
- "cpu": [
535
- "ia32"
536
- ],
537
- "dev": true,
538
- "license": "MIT",
539
- "optional": true,
540
- "os": [
541
- "linux"
542
- ],
543
- "peer": true,
544
- "engines": {
545
- "node": ">=18"
546
- }
547
- },
548
- "node_modules/@esbuild/linux-loong64": {
549
- "version": "0.28.1",
550
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
551
- "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
552
- "cpu": [
553
- "loong64"
554
- ],
555
- "dev": true,
556
- "license": "MIT",
557
- "optional": true,
558
- "os": [
559
- "linux"
560
- ],
561
- "peer": true,
562
- "engines": {
563
- "node": ">=18"
564
- }
565
- },
566
- "node_modules/@esbuild/linux-mips64el": {
567
- "version": "0.28.1",
568
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
569
- "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
570
- "cpu": [
571
- "mips64el"
572
- ],
573
- "dev": true,
574
- "license": "MIT",
575
- "optional": true,
576
- "os": [
577
- "linux"
578
- ],
579
- "peer": true,
580
- "engines": {
581
- "node": ">=18"
582
- }
583
- },
584
- "node_modules/@esbuild/linux-ppc64": {
585
- "version": "0.28.1",
586
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
587
- "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
588
- "cpu": [
589
- "ppc64"
590
- ],
591
- "dev": true,
592
- "license": "MIT",
593
- "optional": true,
594
- "os": [
595
- "linux"
596
- ],
597
- "peer": true,
598
- "engines": {
599
- "node": ">=18"
600
- }
601
- },
602
- "node_modules/@esbuild/linux-riscv64": {
603
- "version": "0.28.1",
604
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
605
- "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
606
- "cpu": [
607
- "riscv64"
608
- ],
609
- "dev": true,
610
- "license": "MIT",
611
- "optional": true,
612
- "os": [
613
- "linux"
614
- ],
615
- "peer": true,
616
- "engines": {
617
- "node": ">=18"
618
- }
619
- },
620
- "node_modules/@esbuild/linux-s390x": {
621
- "version": "0.28.1",
622
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
623
- "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
624
- "cpu": [
625
- "s390x"
626
- ],
627
- "dev": true,
628
- "license": "MIT",
629
- "optional": true,
630
- "os": [
631
- "linux"
632
- ],
633
- "peer": true,
634
- "engines": {
635
- "node": ">=18"
636
- }
637
- },
638
- "node_modules/@esbuild/linux-x64": {
639
- "version": "0.28.1",
640
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
641
- "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
642
- "cpu": [
643
- "x64"
644
- ],
645
- "dev": true,
646
- "license": "MIT",
647
- "optional": true,
648
- "os": [
649
- "linux"
650
- ],
651
- "peer": true,
652
- "engines": {
653
- "node": ">=18"
654
- }
655
- },
656
- "node_modules/@esbuild/netbsd-arm64": {
657
- "version": "0.28.1",
658
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
659
- "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
660
- "cpu": [
661
- "arm64"
662
- ],
663
- "dev": true,
664
- "license": "MIT",
665
- "optional": true,
666
- "os": [
667
- "netbsd"
668
- ],
669
- "peer": true,
670
- "engines": {
671
- "node": ">=18"
672
- }
673
- },
674
- "node_modules/@esbuild/netbsd-x64": {
675
- "version": "0.28.1",
676
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
677
- "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
678
- "cpu": [
679
- "x64"
680
- ],
681
- "dev": true,
682
- "license": "MIT",
683
- "optional": true,
684
- "os": [
685
- "netbsd"
686
- ],
687
- "peer": true,
688
- "engines": {
689
- "node": ">=18"
690
- }
691
- },
692
- "node_modules/@esbuild/openbsd-arm64": {
693
- "version": "0.28.1",
694
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
695
- "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
696
- "cpu": [
697
- "arm64"
698
- ],
699
- "dev": true,
700
- "license": "MIT",
701
- "optional": true,
702
- "os": [
703
- "openbsd"
704
- ],
705
- "peer": true,
706
- "engines": {
707
- "node": ">=18"
708
- }
709
- },
710
- "node_modules/@esbuild/openbsd-x64": {
711
- "version": "0.28.1",
712
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
713
- "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
714
- "cpu": [
715
- "x64"
716
- ],
717
- "dev": true,
718
- "license": "MIT",
719
- "optional": true,
720
- "os": [
721
- "openbsd"
722
- ],
723
- "peer": true,
724
- "engines": {
725
- "node": ">=18"
726
- }
727
- },
728
- "node_modules/@esbuild/openharmony-arm64": {
729
- "version": "0.28.1",
730
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
731
- "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
732
- "cpu": [
733
- "arm64"
734
- ],
735
- "dev": true,
736
- "license": "MIT",
737
- "optional": true,
738
- "os": [
739
- "openharmony"
740
- ],
741
- "peer": true,
742
- "engines": {
743
- "node": ">=18"
744
- }
745
- },
746
- "node_modules/@esbuild/sunos-x64": {
747
- "version": "0.28.1",
748
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
749
- "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
750
- "cpu": [
751
- "x64"
752
- ],
753
- "dev": true,
754
- "license": "MIT",
755
- "optional": true,
756
- "os": [
757
- "sunos"
758
- ],
759
- "peer": true,
760
- "engines": {
761
- "node": ">=18"
762
- }
763
- },
764
- "node_modules/@esbuild/win32-arm64": {
765
- "version": "0.28.1",
766
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
767
- "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
768
- "cpu": [
769
- "arm64"
770
- ],
771
- "dev": true,
772
- "license": "MIT",
773
- "optional": true,
774
- "os": [
775
- "win32"
776
- ],
777
- "peer": true,
778
- "engines": {
779
- "node": ">=18"
780
- }
781
- },
782
- "node_modules/@esbuild/win32-ia32": {
783
- "version": "0.28.1",
784
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
785
- "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
786
- "cpu": [
787
- "ia32"
788
- ],
789
- "dev": true,
790
- "license": "MIT",
791
- "optional": true,
792
- "os": [
793
- "win32"
794
- ],
795
- "peer": true,
796
- "engines": {
797
- "node": ">=18"
798
- }
799
- },
800
- "node_modules/@esbuild/win32-x64": {
801
- "version": "0.28.1",
802
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
803
- "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
804
- "cpu": [
805
- "x64"
806
- ],
807
- "dev": true,
808
- "license": "MIT",
809
- "optional": true,
810
- "os": [
811
- "win32"
812
- ],
813
- "peer": true,
814
- "engines": {
815
- "node": ">=18"
816
- }
817
- },
818
350
  "node_modules/@eslint-community/eslint-utils": {
819
351
  "version": "4.9.1",
820
352
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
@@ -1938,16 +1470,16 @@
1938
1470
  }
1939
1471
  },
1940
1472
  "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
1941
- "version": "5.0.7",
1942
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz",
1943
- "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==",
1473
+ "version": "5.0.8",
1474
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
1475
+ "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
1944
1476
  "dev": true,
1945
1477
  "license": "MIT",
1946
1478
  "dependencies": {
1947
1479
  "balanced-match": "^4.0.2"
1948
1480
  },
1949
1481
  "engines": {
1950
- "node": "18 || 20 || >=22"
1482
+ "node": "20 || >=22"
1951
1483
  }
1952
1484
  },
1953
1485
  "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
@@ -2139,9 +1671,9 @@
2139
1671
  }
2140
1672
  },
2141
1673
  "node_modules/brace-expansion": {
2142
- "version": "1.1.15",
2143
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
2144
- "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
1674
+ "version": "1.1.16",
1675
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
1676
+ "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
2145
1677
  "dev": true,
2146
1678
  "license": "MIT",
2147
1679
  "dependencies": {
@@ -2356,50 +1888,6 @@
2356
1888
  "node": ">=10.13.0"
2357
1889
  }
2358
1890
  },
2359
- "node_modules/esbuild": {
2360
- "version": "0.28.1",
2361
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
2362
- "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
2363
- "dev": true,
2364
- "hasInstallScript": true,
2365
- "license": "MIT",
2366
- "optional": true,
2367
- "peer": true,
2368
- "bin": {
2369
- "esbuild": "bin/esbuild"
2370
- },
2371
- "engines": {
2372
- "node": ">=18"
2373
- },
2374
- "optionalDependencies": {
2375
- "@esbuild/aix-ppc64": "0.28.1",
2376
- "@esbuild/android-arm": "0.28.1",
2377
- "@esbuild/android-arm64": "0.28.1",
2378
- "@esbuild/android-x64": "0.28.1",
2379
- "@esbuild/darwin-arm64": "0.28.1",
2380
- "@esbuild/darwin-x64": "0.28.1",
2381
- "@esbuild/freebsd-arm64": "0.28.1",
2382
- "@esbuild/freebsd-x64": "0.28.1",
2383
- "@esbuild/linux-arm": "0.28.1",
2384
- "@esbuild/linux-arm64": "0.28.1",
2385
- "@esbuild/linux-ia32": "0.28.1",
2386
- "@esbuild/linux-loong64": "0.28.1",
2387
- "@esbuild/linux-mips64el": "0.28.1",
2388
- "@esbuild/linux-ppc64": "0.28.1",
2389
- "@esbuild/linux-riscv64": "0.28.1",
2390
- "@esbuild/linux-s390x": "0.28.1",
2391
- "@esbuild/linux-x64": "0.28.1",
2392
- "@esbuild/netbsd-arm64": "0.28.1",
2393
- "@esbuild/netbsd-x64": "0.28.1",
2394
- "@esbuild/openbsd-arm64": "0.28.1",
2395
- "@esbuild/openbsd-x64": "0.28.1",
2396
- "@esbuild/openharmony-arm64": "0.28.1",
2397
- "@esbuild/sunos-x64": "0.28.1",
2398
- "@esbuild/win32-arm64": "0.28.1",
2399
- "@esbuild/win32-ia32": "0.28.1",
2400
- "@esbuild/win32-x64": "0.28.1"
2401
- }
2402
- },
2403
1891
  "node_modules/escalade": {
2404
1892
  "version": "3.2.0",
2405
1893
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -112,6 +112,19 @@ Append-only ledger (an array). Each entry:
112
112
  `source: "bridge"` marks an approval synced from a hub review PR/MR by `yad-review-gate action: sync`
113
113
  (via `yad-hub-bridge`). Manual approvals omit `source` and are never altered by `sync`.
114
114
 
115
+ A **bridge** approval carries four more fields, all written by `sync` and all about *what was approved*
116
+ rather than *who approved*:
117
+
118
+ | Field | Meaning |
119
+ |-------|---------|
120
+ | `artifactHash` | the content fingerprint the approval is bound to (`sha256:…`). The gate drops any approval whose hash ≠ the artifact's current one — this is revoke-on-change. For architecture it is the locked contract surface, for stories the whole `stories/` set. |
121
+ | `approvedAt` | when the platform says the review was submitted. Used to tell a genuine re-approval from the same review read again; **absent on GitLab**, which exposes no per-approval timestamp. |
122
+ | `pr` | the PR/MR number the approval arrived on. The second proof of a genuine re-approval, and the only one available on GitLab: a re-opened review is always a new PR, so an approval on a different number cannot be the old one re-read. Records written before this field existed are stamped once, from the `hub-prs.json` pointer they were recorded against. |
123
+ | `engagement` | `verified` when the approval carried the companion's engagement marker, else `none`. Advisory unless `hub.review.requireEngagement` is on. |
124
+
125
+ `date` is when the sync **recorded** the approval, not when it was given — it is preserved across an
126
+ unchanged re-sync so that re-reading a review never churns the ledger.
127
+
115
128
  ## `comments.json`
116
129
  Append-only ledger (an array), the machine-readable counterpart to the `reviews/*--comments.md` markdown
117
130
  ("who reviewed/commented", as `approvals.json` is "who approved"). Written by `yad-review-gate`'s
@@ -10,7 +10,7 @@ predicate (`../yad-review-gate/references/gating.md`) runs unchanged. The bridge
10
10
  |---|---|
11
11
  | GitHub review `APPROVED` / GitLab MR approval (`approved_by`) | an `approved` record in `approvals.json`, role resolved from the roster (owner/reviewer) or derived domain-owner, tagged `"source": "bridge"` |
12
12
  | GitHub `COMMENTED` / `CHANGES_REQUESTED`; GitLab discussions/notes | a line under `## <name> (<role>)` in `reviews/<artifact>--<date>--comments.md` + a `comments.json` record; **never** an approval. `CHANGES_REQUESTED` is also flagged as blocking in the comments file |
13
- | GitHub review dismissed / GitLab approval revoked | the prior bridge `approved` record for that approver is removed on re-sync (see idempotency) |
13
+ | GitHub review dismissed / GitLab approval revoked | the prior bridge `approved` record for that approver is removed on re-sync **while the step is open**; once the step is `done` the record is kept as the audit trail of why it passed (see idempotency) |
14
14
 
15
15
  `approvals.json` records from the bridge carry `"source": "bridge"`; **manual** approvals have no such
16
16
  tag and are **never** touched by `sync` — the two coexist.
@@ -82,10 +82,21 @@ login and requested too — otherwise an escalated step is structurally unsatisf
82
82
  ## Idempotent re-sync
83
83
 
84
84
  - Key bridge approvals on `(step, approver, role, domain)`. On re-sync, **upsert** — do not append a
85
- duplicate. Remove any bridge approval whose platform review was dismissed/revoked.
86
- - Key synced comments on the platform comment id so the same comment is not appended twice.
87
- - Update the step's `hub-prs.json` `lastSyncedAt` after a successful sync.
88
- - Running `sync` twice with no platform change is a no-op on the ledger.
85
+ duplicate.
86
+ - **On an OPEN step**, remove any bridge approval whose platform review was dismissed/revoked: the
87
+ platform is the live source of truth while the review is in flight.
88
+ - **On a step already `done`**, the record is only added to or refreshed in place — an approval the
89
+ platform no longer reports is **kept**. Those approvals are the audit record of *why* the gate
90
+ passed; a roster edit, an approval reset, or a degraded-but-successful read would otherwise erase
91
+ them and leave the step `done` with zero approvals.
92
+ - Key synced comments on the platform comment id so the same comment is not appended twice. Comment
93
+ rounds are recorded for an **open** step only, so re-visiting a merged review does not append a new
94
+ round per pass.
95
+ - Update the step's `hub-prs.json` `lastSyncedAt` when the sync **learned something** — every sync on
96
+ an open step, and on a closed one only when the approval record actually changed (a re-opened review
97
+ that was re-approved). An identical re-sync leaves it alone, so the ledger does not churn.
98
+ - Running `sync` twice with no platform change is a no-op on the ledger — byte-identical, including
99
+ `comments.json` and the dated `reviews/*.md` side files.
89
100
 
90
101
  ## Contract re-lock invalidates prior platform approvals too
91
102
 
@@ -201,6 +212,40 @@ the default branch: `yad gate ci --branch <review-branch> --pr <n> --merged` (th
201
212
  unlike advisory `yad gate sync`). File-only mode (no platform) keeps `yad gate sync` as the local writer.
202
213
  The file ledger is still the source of truth.
203
214
 
215
+ Because CI records the `hub-prs.json` pointer only at merge, a review the ledger has never seen still
216
+ has to be nameable — otherwise `sync` refuses a PR that is sitting merged on the platform. With no
217
+ recorded pointer, `yad gate sync <epic> <artifact>` resolves the PR/MR from the review branch
218
+ (`review/<epic>/<artifact>`) itself, and `--pr <n>` names it outright:
219
+
220
+ ```bash
221
+ yad gate sync EP-x architecture.md --pr 42 # advisory in bridge mode; the writer without the bridge
222
+ ```
223
+
224
+ An explicit `--pr` also **overrides** a recorded pointer, since a re-opened review is a new PR the
225
+ ledger has not seen. Before its reviewers are bound to the artifact's hash, the number is confirmed to
226
+ be the PR for that artifact's review branch — a mismatch is refused, and a platform that cannot answer
227
+ warns and proceeds. The bridge rule is unchanged: the resolved pointer is adopted into the ledger only
228
+ on the writer path, so a human never leaves a gate-state file in their working tree for `ledger-guard`
229
+ to reject.
230
+
231
+ **In bridge mode `gate sync` stays advisory even with `--pr`** — it prints the predicate and writes
232
+ nothing, because CI owns the ledger. The recovery that actually writes is the command CI itself runs,
233
+ on the default branch: `yad gate ci --branch <review-branch> --pr <n> --merged`.
234
+
235
+ **Serialization.** Both wired jobs push the ledger to the default branch, and on GitLab the scheduled
236
+ sweep's recent-MR window overlaps whatever the merge-push pipeline is handling — so they are pinned to
237
+ one at a time (`concurrency: yad-gate-mergesync` on GitHub, `resource_group: yad-gate-mergesync` on
238
+ GitLab). Without it both runs produce the same advance, one pushes, and the other rebases onto it and
239
+ lands a duplicate `chore(gate): advance …` commit under a different SHA — unreviewed churn, since
240
+ those commits carry `[skip ci]` and go straight to the default branch. An already-wired GitLab hub
241
+ picks the `resource_group` up on the next `yad update` / `yad check --fix`.
242
+
243
+ **`yad gate open` does not create or push the review branch.** It opens a PR/MR *against*
244
+ `review/<epic>/<artifact>`, so that branch must already be **on origin** — a local-only branch is no
245
+ use, because `gh pr create --head` does not push either. `yad open-pr`, run from the branch, pushes it
246
+ and then delegates here. Opening with the branch absent is refused up front, before any ledger write,
247
+ rather than failing inside `gh`/`glab`; an origin that cannot be reached at all only warns.
248
+
204
249
  ### Manual end-to-end verification (GitHub)
205
250
 
206
251
  1. On a scratch hub: `yad setup` (platform github, roster with a second account) → `yad check --fix`
@@ -17,8 +17,10 @@
17
17
  # RECONCILE (schedule, every 15 min): the safety net. The merge job's `closed` event fires once and
18
18
  # never repeats, so a transient API/GraphQL/push failure (or a fail-closed degraded approval read)
19
19
  # would otherwise strand a merged review until someone reran it by hand. This periodic job discovers
20
- # recently-merged review PRs from the API and advances any not yet done (idempotent a step already
21
- # `done` is skipped). On GitHub a scheduled workflow runs automatically once committed (no setup).
20
+ # recently-merged review PRs from the API and advances any not yet done. Idempotent: a step that is
21
+ # already `done` is never re-advanced (the chain is one-way), and re-syncing it writes nothing unless
22
+ # its approvals genuinely changed — so re-visiting a merged review for a week costs one no-op read per
23
+ # pass, not a commit. On GitHub a scheduled workflow runs automatically once committed (no setup).
22
24
  #
23
25
  # CI never approves and never merges — the merge click is the human approval act.
24
26
  #
@@ -73,7 +75,8 @@ jobs:
73
75
 
74
76
  reconcile:
75
77
  # Safety net: recover any merged review PR whose merge-time run failed transiently (the `closed`
76
- # event never re-fires). Idempotent — `yad gate ci` skips a step that is already `done`.
78
+ # event never re-fires). Idempotent — `yad gate ci` never re-advances a step that is already `done`,
79
+ # and a re-sync of one writes nothing unless its approvals actually changed.
77
80
  if: github.event_name == 'schedule'
78
81
  runs-on: ubuntu-latest
79
82
  concurrency: