@xemahq/xema 0.57.1 → 0.58.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.
@@ -2599,355 +2599,355 @@
2599
2599
  },
2600
2600
  {
2601
2601
  "package": "@xemahq/xema",
2602
- "version": "0.57.1",
2602
+ "version": "0.58.0",
2603
2603
  "path": "edition/adapter-host-versions.mjs",
2604
2604
  "sha256": "sha256:1b7ebd3592f4da1225fba74aaba912e7d85fbceeb1626f7dcdac83491cbb4d69"
2605
2605
  },
2606
2606
  {
2607
2607
  "package": "@xemahq/xema",
2608
- "version": "0.57.1",
2608
+ "version": "0.58.0",
2609
2609
  "path": "edition/authorization-base.mjs",
2610
2610
  "sha256": "sha256:815c9be9f71731dcc805d85da2d733350ddb6fbdf32b6f1cf34f228ce6381c7c"
2611
2611
  },
2612
2612
  {
2613
2613
  "package": "@xemahq/xema",
2614
- "version": "0.57.1",
2614
+ "version": "0.58.0",
2615
2615
  "path": "edition/build-ledger.mjs",
2616
2616
  "sha256": "sha256:05202cbdd606aee086c8e9c62d28be68c429653a8b1d73a289ed0fe4ff14da85"
2617
2617
  },
2618
2618
  {
2619
2619
  "package": "@xemahq/xema",
2620
- "version": "0.57.1",
2620
+ "version": "0.58.0",
2621
2621
  "path": "edition/canonical-evidence-json.mjs",
2622
2622
  "sha256": "sha256:3b32f6786c9fb1c0deadf2f687077356a503b0db766392d2e0254aa1ab78feec"
2623
2623
  },
2624
2624
  {
2625
2625
  "package": "@xemahq/xema",
2626
- "version": "0.57.1",
2626
+ "version": "0.58.0",
2627
2627
  "path": "edition/canonical-repository-url.mjs",
2628
2628
  "sha256": "sha256:f36e4f7cbe7849789422ec2f0ebce2d62f7dc3684afecc3ac51a32560e72d8a1"
2629
2629
  },
2630
2630
  {
2631
2631
  "package": "@xemahq/xema",
2632
- "version": "0.57.1",
2632
+ "version": "0.58.0",
2633
2633
  "path": "edition/collected-refusals.mjs",
2634
2634
  "sha256": "sha256:ae21c069dbff0afa9aca18b7b909d5de405df2277f6431bc3fda20528115bcd1"
2635
2635
  },
2636
2636
  {
2637
2637
  "package": "@xemahq/xema",
2638
- "version": "0.57.1",
2638
+ "version": "0.58.0",
2639
2639
  "path": "edition/connector-source-authority.mjs",
2640
2640
  "sha256": "sha256:ea94475f4324737673accd7de1303c44db1cbc4dac61a865a06cd83abe310164"
2641
2641
  },
2642
2642
  {
2643
2643
  "package": "@xemahq/xema",
2644
- "version": "0.57.1",
2644
+ "version": "0.58.0",
2645
2645
  "path": "edition/cosign-certificate-constraints.mjs",
2646
2646
  "sha256": "sha256:bb9ba7038f1de9211c9cbcf99f02255f3623ce72d86c71fdcfa146a4e0edbd9a"
2647
2647
  },
2648
2648
  {
2649
2649
  "package": "@xemahq/xema",
2650
- "version": "0.57.1",
2650
+ "version": "0.58.0",
2651
2651
  "path": "edition/develop-graph.mjs",
2652
2652
  "sha256": "sha256:decebd437c9f4c8bdd6bee3baabfdc340fd7b9d175aca7e702cb330e912708d5"
2653
2653
  },
2654
2654
  {
2655
2655
  "package": "@xemahq/xema",
2656
- "version": "0.57.1",
2656
+ "version": "0.58.0",
2657
2657
  "path": "edition/dispatched-runtime-components.mjs",
2658
2658
  "sha256": "sha256:9712823d183a60108cd002b2d36a9e5c0867b9d576dd02825264a18f7b8ece69"
2659
2659
  },
2660
2660
  {
2661
2661
  "package": "@xemahq/xema",
2662
- "version": "0.57.1",
2662
+ "version": "0.58.0",
2663
2663
  "path": "edition/distribution-paths.mjs",
2664
2664
  "sha256": "sha256:d78a5c8405bc6c25d36fcec61b0030e1fdacac7d528e698adb96f906f4b70279"
2665
2665
  },
2666
2666
  {
2667
2667
  "package": "@xemahq/xema",
2668
- "version": "0.57.1",
2668
+ "version": "0.58.0",
2669
2669
  "path": "edition/edition-artifact.mjs",
2670
2670
  "sha256": "sha256:3b588c9c50f64f3e7a45b954fe7b5fc67e11fc8ce3e7b323727af4541d29ae7f"
2671
2671
  },
2672
2672
  {
2673
2673
  "package": "@xemahq/xema",
2674
- "version": "0.57.1",
2674
+ "version": "0.58.0",
2675
2675
  "path": "edition/edition-channel.mjs",
2676
2676
  "sha256": "sha256:3c0c1564dc50be133cad500452d953353aa5beb703142c05a17bbce8175ba9f3"
2677
2677
  },
2678
2678
  {
2679
2679
  "package": "@xemahq/xema",
2680
- "version": "0.57.1",
2680
+ "version": "0.58.0",
2681
2681
  "path": "edition/edition-chart-set.mjs",
2682
2682
  "sha256": "sha256:f9f16b58279c8c2619a39c5cc92bdbc334543d1a324304cd5d3b120d66dc8f3a"
2683
2683
  },
2684
2684
  {
2685
2685
  "package": "@xemahq/xema",
2686
- "version": "0.57.1",
2686
+ "version": "0.58.0",
2687
2687
  "path": "edition/edition-config.mjs",
2688
2688
  "sha256": "sha256:58af55e9a2b36ca23485246d44a295260afa240bcdc0649c697563b36085ddaa"
2689
2689
  },
2690
2690
  {
2691
2691
  "package": "@xemahq/xema",
2692
- "version": "0.57.1",
2692
+ "version": "0.58.0",
2693
2693
  "path": "edition/edition-constants.mjs",
2694
2694
  "sha256": "sha256:217fa5b1fa25cb50ee4e1b46ea5e086061ff1f44e00198e1dc28f52376f236a0"
2695
2695
  },
2696
2696
  {
2697
2697
  "package": "@xemahq/xema",
2698
- "version": "0.57.1",
2698
+ "version": "0.58.0",
2699
2699
  "path": "edition/edition-contract-parse.mjs",
2700
2700
  "sha256": "sha256:e2c6e66378f878499f44b62d060ae50197f40757b2044d9ce05290e367dfe21d"
2701
2701
  },
2702
2702
  {
2703
2703
  "package": "@xemahq/xema",
2704
- "version": "0.57.1",
2704
+ "version": "0.58.0",
2705
2705
  "path": "edition/edition-contract.json",
2706
2706
  "sha256": "sha256:566a17301ad15b94a06fef12b26bbe39e292ed2bf30a2659a9bf07ce5ce487e0"
2707
2707
  },
2708
2708
  {
2709
2709
  "package": "@xemahq/xema",
2710
- "version": "0.57.1",
2710
+ "version": "0.58.0",
2711
2711
  "path": "edition/edition-kind.mjs",
2712
2712
  "sha256": "sha256:b4f3358ffa81bbafb8c37d158b9e01032a7358c38b9d6e5aca409091f989e47a"
2713
2713
  },
2714
2714
  {
2715
2715
  "package": "@xemahq/xema",
2716
- "version": "0.57.1",
2716
+ "version": "0.58.0",
2717
2717
  "path": "edition/edition-protocol.mjs",
2718
2718
  "sha256": "sha256:f02ea6427e2fd7ceea2c3cb49f3fa6d85b982870e487082a7466f8037cd2bed9"
2719
2719
  },
2720
2720
  {
2721
2721
  "package": "@xemahq/xema",
2722
- "version": "0.57.1",
2722
+ "version": "0.58.0",
2723
2723
  "path": "edition/edition-publisher.mjs",
2724
2724
  "sha256": "sha256:8803b41067d81acbc35a8974426f606b5b8168b7a9c2581c16586a86f36db50f"
2725
2725
  },
2726
2726
  {
2727
2727
  "package": "@xemahq/xema",
2728
- "version": "0.57.1",
2728
+ "version": "0.58.0",
2729
2729
  "path": "edition/edition-source-pins.mjs",
2730
2730
  "sha256": "sha256:b141474fff33b06734fb62cd2552752b991c8267bb1c9bccb22a81dd80e91c6c"
2731
2731
  },
2732
2732
  {
2733
2733
  "package": "@xemahq/xema",
2734
- "version": "0.57.1",
2734
+ "version": "0.58.0",
2735
2735
  "path": "edition/edition-workspace.mjs",
2736
2736
  "sha256": "sha256:892b360f9f80d2308b0b12f9b99658ae06173878d9b71cf5d6fc8bd717b3c86e"
2737
2737
  },
2738
2738
  {
2739
2739
  "package": "@xemahq/xema",
2740
- "version": "0.57.1",
2740
+ "version": "0.58.0",
2741
2741
  "path": "edition/evidence-checkout.mjs",
2742
2742
  "sha256": "sha256:31fb669769b31de4c6f2b2501bb96959548172ef166e7568edbbfed7f5079a11"
2743
2743
  },
2744
2744
  {
2745
2745
  "package": "@xemahq/xema",
2746
- "version": "0.57.1",
2746
+ "version": "0.58.0",
2747
2747
  "path": "edition/evidence-grammars.mjs",
2748
2748
  "sha256": "sha256:4bea69437af5a36c139b5b41d0ecf2d1ddcf3f871e10c78e3d351f608eedca3b"
2749
2749
  },
2750
2750
  {
2751
2751
  "package": "@xemahq/xema",
2752
- "version": "0.57.1",
2752
+ "version": "0.58.0",
2753
2753
  "path": "edition/evidence-trust-pin.mjs",
2754
2754
  "sha256": "sha256:eb46e4d6a79dfac5536b7a439ab9df7dd4b03af369bdcfa9fcdd522aa1aab8dd"
2755
2755
  },
2756
2756
  {
2757
2757
  "package": "@xemahq/xema",
2758
- "version": "0.57.1",
2758
+ "version": "0.58.0",
2759
2759
  "path": "edition/first-party-source-ids.mjs",
2760
2760
  "sha256": "sha256:20cb1ad7cfb8c6e6686a6be5a51289da4bba76c20b58d9c1b5b6b3813a38dc1c"
2761
2761
  },
2762
2762
  {
2763
2763
  "package": "@xemahq/xema",
2764
- "version": "0.57.1",
2764
+ "version": "0.58.0",
2765
2765
  "path": "edition/fulcio-certificate-extensions.mjs",
2766
2766
  "sha256": "sha256:6f1f5a8ea110a489f7aff4bfb8e0b2d058919fe3e8ba4a1e5e8396fca24861b7"
2767
2767
  },
2768
2768
  {
2769
2769
  "package": "@xemahq/xema",
2770
- "version": "0.57.1",
2770
+ "version": "0.58.0",
2771
2771
  "path": "edition/git-json.mjs",
2772
2772
  "sha256": "sha256:d0d25cda0c19007becabc9a2827c3dcf759b295cd0b41596eb4480c9549a1f21"
2773
2773
  },
2774
2774
  {
2775
2775
  "package": "@xemahq/xema",
2776
- "version": "0.57.1",
2776
+ "version": "0.58.0",
2777
2777
  "path": "edition/git-source-auth.mjs",
2778
2778
  "sha256": "sha256:c1b32aa6f7d59798db58238d632cafeadbd4f07376396a31acdeb5f0ac56dcac"
2779
2779
  },
2780
2780
  {
2781
2781
  "package": "@xemahq/xema",
2782
- "version": "0.57.1",
2782
+ "version": "0.58.0",
2783
2783
  "path": "edition/image-delivery-entitlement-descriptor.mjs",
2784
2784
  "sha256": "sha256:4726b66116f01bf2523fafe2b7a356591eca8fb5ca6bd8b154dd4821873e921b"
2785
2785
  },
2786
2786
  {
2787
2787
  "package": "@xemahq/xema",
2788
- "version": "0.57.1",
2788
+ "version": "0.58.0",
2789
2789
  "path": "edition/image-evidence-replay-state.mjs",
2790
2790
  "sha256": "sha256:eba0cf1d38af0ab2f00c5099fa8bc2edc543136ce92f895544d4d284b3d6af0f"
2791
2791
  },
2792
2792
  {
2793
2793
  "package": "@xemahq/xema",
2794
- "version": "0.57.1",
2794
+ "version": "0.58.0",
2795
2795
  "path": "edition/image-evidence.mjs",
2796
2796
  "sha256": "sha256:c6a202f3fc8efe97f00c7e69532c656646bdc5c93365d68676046c3aabd33233"
2797
2797
  },
2798
2798
  {
2799
2799
  "package": "@xemahq/xema",
2800
- "version": "0.57.1",
2800
+ "version": "0.58.0",
2801
2801
  "path": "edition/image-subject-identity.mjs",
2802
2802
  "sha256": "sha256:6a64e44f9865f68484540e3264a1d87040ae021dfa6ee4b79239e66805754ac1"
2803
2803
  },
2804
2804
  {
2805
2805
  "package": "@xemahq/xema",
2806
- "version": "0.57.1",
2806
+ "version": "0.58.0",
2807
2807
  "path": "edition/kernel-capability-domain.mjs",
2808
2808
  "sha256": "sha256:3ecf887dd8d399e91a8285f6f115f6e418fb59bbf3f004539fe65ec667219356"
2809
2809
  },
2810
2810
  {
2811
2811
  "package": "@xemahq/xema",
2812
- "version": "0.57.1",
2812
+ "version": "0.58.0",
2813
2813
  "path": "edition/kernel-contract-authority.mjs",
2814
2814
  "sha256": "sha256:9de2645dca22274cad9fa68d0364bf57e4de704e9d49a8bbadde0e322ae317df"
2815
2815
  },
2816
2816
  {
2817
2817
  "package": "@xemahq/xema",
2818
- "version": "0.57.1",
2818
+ "version": "0.58.0",
2819
2819
  "path": "edition/kernel-contract-source-path-set.mjs",
2820
2820
  "sha256": "sha256:bc4756f217d80fd8f802932f47da71ab14e782873fa9fa977002a94e058d8a9e"
2821
2821
  },
2822
2822
  {
2823
2823
  "package": "@xemahq/xema",
2824
- "version": "0.57.1",
2824
+ "version": "0.58.0",
2825
2825
  "path": "edition/kernel-package.mjs",
2826
2826
  "sha256": "sha256:e97a9491991d8332a4feed14ac48fe393e44d12c63bdfec89fac8b5b4ea2a574"
2827
2827
  },
2828
2828
  {
2829
2829
  "package": "@xemahq/xema",
2830
- "version": "0.57.1",
2830
+ "version": "0.58.0",
2831
2831
  "path": "edition/lib.mjs",
2832
2832
  "sha256": "sha256:f98c9eb6c50dbaf6c89c5fa9d42f682042265a2d41687a9d2b35f16c0b139326"
2833
2833
  },
2834
2834
  {
2835
2835
  "package": "@xemahq/xema",
2836
- "version": "0.57.1",
2836
+ "version": "0.58.0",
2837
2837
  "path": "edition/no-follow-file.mjs",
2838
2838
  "sha256": "sha256:c17bdf5e441f3c079aa06d4b48bbed05cad087855b9ad2a5e6dc43d5ee2b17c3"
2839
2839
  },
2840
2840
  {
2841
2841
  "package": "@xemahq/xema",
2842
- "version": "0.57.1",
2842
+ "version": "0.58.0",
2843
2843
  "path": "edition/operation-requirements.mjs",
2844
2844
  "sha256": "sha256:d3b6807953f162ab4204dcd1a0f752e0f9b447726fc17a12534d28abe8e570b0"
2845
2845
  },
2846
2846
  {
2847
2847
  "package": "@xemahq/xema",
2848
- "version": "0.57.1",
2848
+ "version": "0.58.0",
2849
2849
  "path": "edition/pin-source.mjs",
2850
2850
  "sha256": "sha256:32fa918729a83587b4d3bca6e5fe381f5a525397ebc49d52729ec1f8cf216c37"
2851
2851
  },
2852
2852
  {
2853
2853
  "package": "@xemahq/xema",
2854
- "version": "0.57.1",
2854
+ "version": "0.58.0",
2855
2855
  "path": "edition/sigstore-bundle-media-type.mjs",
2856
2856
  "sha256": "sha256:e0aa5a3992f0385ddbbe69eb0307d642ac428ef516c8394816ac4fd52e0ac39c"
2857
2857
  },
2858
2858
  {
2859
2859
  "package": "@xemahq/xema",
2860
- "version": "0.57.1",
2860
+ "version": "0.58.0",
2861
2861
  "path": "edition/source-authority.mjs",
2862
2862
  "sha256": "sha256:9c351f60e8ea838f445f89c3709c60b7f13b021b78d6e40eaef91350a793f0ff"
2863
2863
  },
2864
2864
  {
2865
2865
  "package": "@xemahq/xema",
2866
- "version": "0.57.1",
2866
+ "version": "0.58.0",
2867
2867
  "path": "edition/strict-json.mjs",
2868
2868
  "sha256": "sha256:f95778396df7f38b086f55d2ec4f3b6644a8aeff2b32282a62829145fb544562"
2869
2869
  },
2870
2870
  {
2871
2871
  "package": "@xemahq/xema",
2872
- "version": "0.57.1",
2872
+ "version": "0.58.0",
2873
2873
  "path": "edition/string-order.mjs",
2874
2874
  "sha256": "sha256:b3210cd273e4b2e01fb8b1a91e28734cd211d4010c080d0ce95f5e5ff631cffb"
2875
2875
  },
2876
2876
  {
2877
2877
  "package": "@xemahq/xema",
2878
- "version": "0.57.1",
2878
+ "version": "0.58.0",
2879
2879
  "path": "edition/third-party-admission.mjs",
2880
2880
  "sha256": "sha256:7e32f631a8948e2b93a5cfa163390d52d2a8d9ade87a637c7fe1fc6351fe5974"
2881
2881
  },
2882
2882
  {
2883
2883
  "package": "@xemahq/xema",
2884
- "version": "0.57.1",
2884
+ "version": "0.58.0",
2885
2885
  "path": "edition/third-party-certificate-extensions.mjs",
2886
2886
  "sha256": "sha256:3293267b09452199f605001d8c14070d1c822b77390caee4088e17b059b7b05d"
2887
2887
  },
2888
2888
  {
2889
2889
  "package": "@xemahq/xema",
2890
- "version": "0.57.1",
2890
+ "version": "0.58.0",
2891
2891
  "path": "edition/third-party-source-pins.mjs",
2892
2892
  "sha256": "sha256:6f12feb9061bd4ea3e5aeab3f369c081ab58da335c0d281e21b250251e1c0dd9"
2893
2893
  },
2894
2894
  {
2895
2895
  "package": "@xemahq/xema",
2896
- "version": "0.57.1",
2896
+ "version": "0.58.0",
2897
2897
  "path": "edition/trust-policy-arming.mjs",
2898
2898
  "sha256": "sha256:f6ed96ee1d0b7698b1eea5066ba10abef1babeede8403a7c481bba53636cb1a5"
2899
2899
  },
2900
2900
  {
2901
2901
  "package": "@xemahq/xema",
2902
- "version": "0.57.1",
2902
+ "version": "0.58.0",
2903
2903
  "path": "edition/trust-policy-image-ownership.mjs",
2904
2904
  "sha256": "sha256:be0c787c6a75124f0143fc0ce3b127a94e3bb7f6aa64e282c91dd84e566e550e"
2905
2905
  },
2906
2906
  {
2907
2907
  "package": "@xemahq/xema",
2908
- "version": "0.57.1",
2908
+ "version": "0.58.0",
2909
2909
  "path": "edition/trusted-executable.mjs",
2910
2910
  "sha256": "sha256:37d46cdbc999ddd55d4ea8aeed4850ddd1efde89ed7b532f5a2ddec87105d796"
2911
2911
  },
2912
2912
  {
2913
2913
  "package": "@xemahq/xema",
2914
- "version": "0.57.1",
2914
+ "version": "0.58.0",
2915
2915
  "path": "edition/verifier-binding.mjs",
2916
2916
  "sha256": "sha256:80732658617f5255258c538eeb2383331ec8553b44b58d552b567845a7b916aa"
2917
2917
  },
2918
2918
  {
2919
2919
  "package": "@xemahq/xema",
2920
- "version": "0.57.1",
2920
+ "version": "0.58.0",
2921
2921
  "path": "edition/verifier-files.mjs",
2922
2922
  "sha256": "sha256:cdd14a20a63f0f194a8abb55680a5a7e3ced1f09f8b210a90d349e655f6de0c0"
2923
2923
  },
2924
2924
  {
2925
2925
  "package": "@xemahq/xema",
2926
- "version": "0.57.1",
2926
+ "version": "0.58.0",
2927
2927
  "path": "edition/verifier-provenance.mjs",
2928
2928
  "sha256": "sha256:3e2fb8e07cf1f66b8ad6c7ac2555fe3af64ec7abeb07cecbaf1939a18c2b3663"
2929
2929
  },
2930
2930
  {
2931
2931
  "package": "@xemahq/xema",
2932
- "version": "0.57.1",
2932
+ "version": "0.58.0",
2933
2933
  "path": "edition/verify-catalogue-evidence.mjs",
2934
2934
  "sha256": "sha256:156d0ee39210658ec489609629c5b9cddd3ce5b3938d8980dcf8282ae4be60bb"
2935
2935
  },
2936
2936
  {
2937
2937
  "package": "@xemahq/xema",
2938
- "version": "0.57.1",
2938
+ "version": "0.58.0",
2939
2939
  "path": "edition/verify-image-evidence.mjs",
2940
2940
  "sha256": "sha256:958360f7889985c48abb048852c5bbba349cd7353ce4b532c4511b4902380fac"
2941
2941
  },
2942
2942
  {
2943
2943
  "package": "@xemahq/xema",
2944
- "version": "0.57.1",
2944
+ "version": "0.58.0",
2945
2945
  "path": "edition/workspace-sections.mjs",
2946
2946
  "sha256": "sha256:1d2aff08bcd9e94b644c85c5b55c90c05b6b02bab662731fe3fcd53fcdf86e93"
2947
2947
  },
2948
2948
  {
2949
2949
  "package": "@xemahq/xema",
2950
- "version": "0.57.1",
2950
+ "version": "0.58.0",
2951
2951
  "path": "scripts/build-evidence-verifier.mjs",
2952
2952
  "sha256": "sha256:5a688d20c47dc88aff37aa0c6cc02daf2c370a5bc610fef8446ce7be222d4c0b"
2953
2953
  },
@@ -21,6 +21,7 @@ import { fetchCatalogue, parseCatalogueRef } from './catalogue-fetch.mjs';
21
21
  import { readCataloguePin } from './catalogue-pin.mjs';
22
22
  import { CATALOGUE_TOKEN_ENV_FLAG, CATALOGUE_USERNAME_FLAG, COSIGN_FLAG, DEFINITION_FLAG, SOURCE_IMAGE_FLAG } from './customer-flags.mjs';
23
23
  import { freezeCustomerSources, lsRemoteRef } from './develop-freeze.mjs';
24
+ import { customerDevelopGitBundleVerifier } from './develop-git-bundles.mjs';
24
25
  import { isDevelopImageRef } from './develop-image-coordinate.mjs';
25
26
  import { assertCanonicalDistributionId } from './distribution-paths.mjs';
26
27
  import { LOCAL_WORKFLOW, assertEngineImage, assertExistingArtifactMatches, snapshotEditionTarget, workflowFromEnv, writeEditionArtifact } from './edition-artifact.mjs';
@@ -33,6 +34,7 @@ import { holdSource } from './git-source-auth.mjs';
33
34
  import { canonicalJson, sha256Digest } from './image-evidence.mjs';
34
35
  import { adoptCatalogueKernel } from './kernel-package.mjs';
35
36
  import { loadKernelDistributionSchemas, serializeJson } from './lib.mjs';
37
+ import { GitSourcedBundle } from './locked-bundle-signer.mjs';
36
38
  import { isSourcePinKey, sortedSnapshotPins, sourcePinKey } from './pin-source.mjs';
37
39
  import { PREVIOUS_SEAL_SIGNER_FLAG } from './previous-seal-registry.mjs';
38
40
  import { assertSealedImageLock } from './release-edition-artifact.mjs';
@@ -108,7 +110,7 @@ export function declaredSourceNamesOf(rawDefinition) {
108
110
  }
109
111
 
110
112
  /** Resolve and seal the customer edition of `channel`; returns the four locks and the frozen provenance pins. */
111
- export async function resolveCustomerChannelEdition({ channel, rawDefinition, catalogue, catalogueDigest, pins, sourceImages, env = process.env, sealOptions = {}, adoptKernel, materialize }) {
113
+ export async function resolveCustomerChannelEdition({ channel, rawDefinition, catalogue, catalogueDigest, pins, sourceImages, env = process.env, sealOptions = {}, adoptKernel, materialize, developGitBundles }) {
112
114
  const frozen = customerEditionPins({ channel, pins, declaredSourceNames: declaredSourceNamesOf(rawDefinition), catalogueDigest, definitionDigest: customerDefinitionDigest(rawDefinition) });
113
115
  const resolved = await resolveCustomerEdition({
114
116
  rawDefinition,
@@ -119,6 +121,7 @@ export async function resolveCustomerChannelEdition({ channel, rawDefinition, ca
119
121
  catalogueDigest,
120
122
  ...(adoptKernel === undefined ? {} : { adoptKernel }),
121
123
  ...(materialize === undefined ? {} : { materialize }),
124
+ ...(developGitBundles === undefined ? {} : { developGitBundles }),
122
125
  sealOwn: ({ distributionId, subjects }) => sealImageSubjects({ channel, distributionId, subjects, env, ...sealOptions }),
123
126
  });
124
127
  // The customer edition is sealed here: every biomeContentHash is recomputed through the
@@ -135,6 +138,8 @@ export async function resolveCustomerChannelEdition({ channel, rawDefinition, ca
135
138
  catalogue,
136
139
  catalogueDigest,
137
140
  storePublisherAnchorKeys: resolved.storePublisherAnchorKeys,
141
+ // A row the develop verifier kept carries its bundle and develop signer; the seal admits exactly those.
142
+ gitSourcedBundle: developGitBundles === undefined ? GitSourcedBundle.Refused : GitSourcedBundle.DevelopVerified,
138
143
  });
139
144
  return { ...resolved, distributionLock, pins: frozen };
140
145
  }
@@ -198,7 +203,8 @@ const COMMANDS = Object.freeze({
198
203
  values: ['--pins', '--out', '--registry', ENGINE_REPOSITORY_FLAG, ENGINE_SIGNER_FLAG, COSIGN_FLAG, IMAGES_FROM_FLAG, PREVIOUS_LOCK_FLAG, PREVIOUS_LOCK_SHA256_FLAG, PREVIOUS_SEAL_SIGNER_FLAG],
199
204
  switches: ['--local', FIRST_SEAL_FLAG],
200
205
  required: ['--pins', '--out', '--registry', ENGINE_REPOSITORY_FLAG, ENGINE_SIGNER_FLAG, COSIGN_FLAG],
201
- customer: { values: [DEFINITION_FLAG, ...CREDENTIAL_FLAGS, SOURCE_IMAGE_FLAG, COSIGN_FLAG, ENGINE_IMAGE_FLAG], required: ['--pins', '--out', '--registry', '--engine-image'], refused: [IMAGES_FROM_FLAG, PREVIOUS_LOCK_FLAG, PREVIOUS_LOCK_SHA256_FLAG, FIRST_SEAL_FLAG, PREVIOUS_SEAL_SIGNER_FLAG], cosign: true },
206
+ customer: { values: [DEFINITION_FLAG, ...CREDENTIAL_FLAGS, SOURCE_IMAGE_FLAG, COSIGN_FLAG, ENGINE_IMAGE_FLAG], required: ['--pins', '--out', '--registry', '--engine-image'], refused: [IMAGES_FROM_FLAG, PREVIOUS_LOCK_FLAG, PREVIOUS_LOCK_SHA256_FLAG, FIRST_SEAL_FLAG, PREVIOUS_SEAL_SIGNER_FLAG], cosign: true, developCosign: true },
207
+ // developCosign: on develop, --cosign verifies the git-sourced OCI bundles under the data root's pinned policy (develop-git-bundles.mjs).
202
208
  // A vendor resolve finds its engine itself; the old flag is refused by name, never read as a customer flag.
203
209
  removedFromVendor: { [ENGINE_IMAGE_FLAG]: `use ${ENGINE_REPOSITORY_FLAG} and ${ENGINE_SIGNER_FLAG}` },
204
210
  },
@@ -311,8 +317,9 @@ export function parseEditionVerbArgs(channel, argv) {
311
317
  }
312
318
  }
313
319
  const customer = spec.customer !== undefined && customerValues.some((flag) => options[flag] !== undefined);
314
- // `--cosign` of a customer form verifies a release catalogue; a vendor verb (develop `coverage`, `resolve`, `engine`) takes its own `--cosign`.
315
- if (customer && spec.customer?.cosign === true && options[COSIGN_FLAG] !== undefined && channel !== EditionChannel.Release) {
320
+ // `--cosign` of a customer form verifies a release catalogue, and on a develop resolve the git-sourced OCI bundles
321
+ // (`developCosign`); a vendor verb (develop `coverage`, `resolve`, `engine`) takes its own `--cosign`.
322
+ if (customer && spec.customer?.cosign === true && options[COSIGN_FLAG] !== undefined && channel !== EditionChannel.Release && spec.customer.developCosign !== true) {
316
323
  throw new Error(`${COSIGN_FLAG} verifies a release catalogue's evidence; a ${channel} ${command} takes none`);
317
324
  }
318
325
  if (channel === EditionChannel.Release && options[DEFINITION_FLAG] === undefined) {
@@ -331,9 +338,11 @@ export function parseEditionVerbArgs(channel, argv) {
331
338
  if (options[refused] !== undefined) {throw new Error(`a customer ${command} takes no ${refused}`);}
332
339
  }
333
340
  if (positional.length !== 0) {throw new Error(`a customer ${command} takes no <distribution-id>: the id is the definition's`);}
334
- if (spec.customer.cosign === true && channel === EditionChannel.Release) {
335
- if (options[COSIGN_FLAG] === undefined) {throw new Error(`a release ${command} requires ${COSIGN_FLAG} <absolute path of the cosign binary>`);}
336
- if (!isAbsolute(options[COSIGN_FLAG])) {throw new Error(`${COSIGN_FLAG} must be an absolute path, got ${JSON.stringify(options[COSIGN_FLAG])}`);}
341
+ if (spec.customer.cosign === true && channel === EditionChannel.Release && options[COSIGN_FLAG] === undefined) {
342
+ throw new Error(`a release ${command} requires ${COSIGN_FLAG} <absolute path of the cosign binary>`);
343
+ }
344
+ if (spec.customer.cosign === true && options[COSIGN_FLAG] !== undefined && !isAbsolute(options[COSIGN_FLAG])) {
345
+ throw new Error(`${COSIGN_FLAG} must be an absolute path, got ${JSON.stringify(options[COSIGN_FLAG])}`);
337
346
  }
338
347
  } else if (spec.positional ? positional.length !== 1 : positional.length !== 0) {
339
348
  throw new Error(`${command} takes ${spec.positional ? 'exactly one <distribution-id>' : 'no positional argument'}`);
@@ -400,6 +409,8 @@ async function resolveCustomer(channel, options, env) {
400
409
  pins: readStrictJsonFile(options['--pins']),
401
410
  sourceImages,
402
411
  env,
412
+ // Develop, under a declared customer policy: the git-sourced OCI bundles are verified with --cosign (none: refused when a subject exists).
413
+ developGitBundles: customerDevelopGitBundleVerifier({ channel, cosignBinary: options[COSIGN_FLAG], env }),
403
414
  });
404
415
  const evidenceTrustPolicy = await descriptorEvidenceTrust({ kind: EditionKind.Resolved, channel, consumesCatalogue: true });
405
416
  const target = snapshotEditionTarget(channel, id, pins, { registry: options['--registry'], engineImage: options['--engine-image'], sourceImages });
@@ -1,8 +1,11 @@
1
- // develop-git-bundles — the OCI bundle of a git-sourced biome, in a VENDOR DEVELOP edition only (XEMA-2456).
1
+ // develop-git-bundles — the OCI bundle of a git-sourced biome, in a DEVELOP edition only (XEMA-2456): a vendor develop
2
+ // resolve, or a customer develop resolve (`--definition`) whose data root declares a pinned evidence trust policy
3
+ // (`customerDevelopGitBundleVerifier`). Each is verified under the trust policy of ITS OWN data root.
2
4
  //
3
- // A release and a customer edition never carry an OCI bundle on a git-sourced row: the manifest's `bundleSource` names
4
- // an artifact the release lane builds, not one built from the pinned commit (resolve-distribution.mjs strips it, the
5
- // release refuses it). A develop edition freezes a git source at its develop head F, and the source's own develop lane
5
+ // A release edition never carries an OCI bundle on a git-sourced row: the manifest's `bundleSource` names an artifact
6
+ // the release lane builds, not one built from the pinned commit (resolve-distribution.mjs strips it, the release refuses
7
+ // it). A resolve without a verifier (a customer edition whose data root declares no policy, or any customer release)
8
+ // refuses it on a required row (`assertNoUnverifiedRequiredGitBundles`). A develop edition freezes a git source at its develop head F, and the source's own develop lane
6
9
  // publishes the bundle the manifest names, signed keyless by its develop workflow. This module proves that bundle is
7
10
  // the one F describes, and only then does the resolve keep it on the row, by DIGEST, with its develop bundle signer:
8
11
  //
@@ -32,6 +35,7 @@ import { canonicalPublicHttpsRepositoryUrl, repositoryOwnerName } from './canoni
32
35
  import { RefusalError } from './collected-refusals.mjs';
33
36
  import { EditionChannel } from './edition-channel.mjs';
34
37
  import { editionWorkspaceConfig } from './edition-config.mjs';
38
+ import { dataRoot as configuredDataRoot, editionsRoot } from './edition-workspace.mjs';
35
39
  import { loadPinnedDeclaredTrustPolicy } from './evidence-trust-pin.mjs';
36
40
  import { sourceTreeIdAt } from './external-source-walk.mjs';
37
41
  import { prepareTrustedCosignBinary } from './image-evidence.mjs';
@@ -61,6 +65,34 @@ export function developGitBundleSubjects({ lock, index }) {
61
65
 
62
66
  const subjectLabel = ({ biomeId, source }) => `biome "${biomeId}" (git source "${source.name}" at ${source.commit})`;
63
67
 
68
+ /**
69
+ * A resolve with no develop bundle verifier (a customer edition, either channel) drops a git-sourced row's OCI
70
+ * `bundleSource` (resolve-distribution.mjs, at the copy point). For a row the edition installs as `required`, that
71
+ * drop is never silent: biome-host would get a required biome with no bundle to fetch. Every such row is refused at
72
+ * once, naming the declared bundle and what is missing (XEMA-2456).
73
+ *
74
+ * @param {object} options
75
+ * @param {object} options.lock the resolved lock (its rows carry `installPolicy`)
76
+ * @param {object[]} options.index the index it was resolved from (it still holds the manifest's bundleSource)
77
+ * @param {string} options.required the kernel's `BiomeInstallPolicy.Required`
78
+ */
79
+ export function assertNoUnverifiedRequiredGitBundles({ lock, index, required }) {
80
+ const requiredRows = new Set(lock.biomes.filter((biome) => biome.installPolicy === required).map((biome) => biome.id));
81
+ const refused = developGitBundleSubjects({ lock, index })
82
+ .filter((subject) => requiredRows.has(subject.biomeId))
83
+ .map(
84
+ (subject) =>
85
+ new DevelopGitBundleError(
86
+ `${subjectLabel(subject)} is installPolicy required and its manifest declares an OCI bundleSource (${subject.entry.bundleSource.ociRef}), ` +
87
+ 'but this resolve verifies no git-sourced bundle, so its lock row would carry no bundleSource and no bundleSigner and biome-host could not install it. ' +
88
+ 'A develop resolve verifies it when its data root declares a pinned evidenceTrustPolicy (edition-workspace.json) holding the ONE develop ' +
89
+ `bundle-signer row of the source's repository, and it is given --cosign; a release carries such a biome only as an \`oci\` source with a third-party source pin`,
90
+ ),
91
+ );
92
+ if (refused.length === 1) {throw refused[0];}
93
+ if (refused.length > 1) {throw new BundleSignerRefusedError(refused);}
94
+ }
95
+
64
96
  /** The biome directory relative to its source repository: the index path is `<source name>/<directory>`. */
65
97
  function repositoryPathOf({ source, entry }) {
66
98
  const prefix = `${source.name}/`;
@@ -148,9 +180,10 @@ export async function verifyDevelopGitBundle({
148
180
  *
149
181
  * @param {object} options
150
182
  * @param {string|undefined} options.cosignBinary the cosign the trust policy pins by digest (`--cosign`)
151
- * @param {string} options.dataRoot
183
+ * @param {string} options.dataRoot the root whose pinned trust policy holds the develop bundle-signer rows
184
+ * @param {string} [options.registryRoot] the root whose image-registry-credentials.json the registry is read with (default: dataRoot)
152
185
  */
153
- export function createDevelopGitBundleVerifier({ cosignBinary, dataRoot, env = process.env, clientFor, treeIdAt }) {
186
+ export function createDevelopGitBundleVerifier({ cosignBinary, dataRoot, registryRoot = dataRoot, env = process.env, clientFor, treeIdAt }) {
154
187
  return Object.freeze({
155
188
  async verify({ subjects, checkouts, schemas }) {
156
189
  if (subjects.length === 0) {return new Map();}
@@ -162,7 +195,7 @@ export function createDevelopGitBundleVerifier({ cosignBinary, dataRoot, env = p
162
195
  const policy = loadPinnedDeclaredTrustPolicy({ dataRoot, declaration: editionWorkspaceConfig().evidenceTrustPolicy, schemas });
163
196
  const trustedCosign = prepareTrustedCosignBinary({ cosignBinary, policy });
164
197
  const context = { policy, policyRoot: dataRoot, schemas, trustedCosign };
165
- const registry = clientFor ?? createRegistryClientResolver({ dataRoot });
198
+ const registry = clientFor ?? createRegistryClientResolver({ dataRoot: registryRoot });
166
199
  try {
167
200
  return await verifyEach(subjects, (subject) =>
168
201
  verifyDevelopGitBundle({ subject, checkout: checkouts.get(subject.source.name), context, clientFor: registry, env, ...(treeIdAt === undefined ? {} : { treeIdAt }) }),
@@ -174,6 +207,27 @@ export function createDevelopGitBundleVerifier({ cosignBinary, dataRoot, env = p
174
207
  });
175
208
  }
176
209
 
210
+ /**
211
+ * The verifier a CUSTOMER resolve (`--definition`) hands `resolveCustomerDistribution`, or undefined. Only a develop
212
+ * resolve whose configured data root DECLARES an evidence trust policy gets one: the bundles are verified under that
213
+ * customer policy, held to its pin (`loadPinnedDeclaredTrustPolicy`, read only when a subject exists), never the
214
+ * vendor's. The registry is read with the editions root's credentials, as the customer's own images are. Without a
215
+ * declared policy (or on release) there is none, and a required git-sourced row declaring an OCI bundle is refused
216
+ * (`assertNoUnverifiedRequiredGitBundles`).
217
+ */
218
+ export function customerDevelopGitBundleVerifier({ channel, cosignBinary, env = process.env, clientFor, treeIdAt }) {
219
+ if (channel !== EditionChannel.Develop) {return undefined;}
220
+ if (editionWorkspaceConfig().evidenceTrustPolicy.policy === null) {return undefined;}
221
+ return createDevelopGitBundleVerifier({
222
+ cosignBinary,
223
+ dataRoot: configuredDataRoot(),
224
+ registryRoot: editionsRoot(),
225
+ env,
226
+ ...(clientFor === undefined ? {} : { clientFor }),
227
+ ...(treeIdAt === undefined ? {} : { treeIdAt }),
228
+ });
229
+ }
230
+
177
231
  /**
178
232
  * The OFFLINE verifier of a candidate re-seal: the bundle the pinned develop edition already verified for the SAME
179
233
  * source commit, carried forward unchanged, with the signer it was verified under (`pinnedBundleSigner`): the resolve
@@ -98,7 +98,8 @@ if (isEntryModule(import.meta.url)) {
98
98
  const pin = await repinEvidenceTrust(parseRepinArguments(process.argv.slice(2)));
99
99
  console.log(
100
100
  `[repin-evidence-trust] pinned policy ${pin.policyDigest}, verifier ${pin.verifier.bundleDigest}, ` +
101
- `kernel contract authority ${pin.kernelContractAuthority.sourceCommit} and ` +
101
+ // A customer data root states no kernel contract authority: its pin records none.
102
+ `kernel contract authority ${pin.kernelContractAuthority === null ? 'none' : pin.kernelContractAuthority.sourceCommit} and ` +
102
103
  `${pin.trustedOrasBinaryDigests.length} oras binary digest(s)`,
103
104
  );
104
105
  } catch (error) {
@@ -33,8 +33,9 @@ import {
33
33
  parseCustomerDefinition,
34
34
  parseImageRegistryMirror,
35
35
  } from './customer-definition.mjs';
36
+ import { assertNoUnverifiedRequiredGitBundles } from './develop-git-bundles.mjs';
36
37
  import { assertRosteredChartSetLock } from './edition-chart-set.mjs';
37
- import { EditionLockFile } from './edition-constants.mjs';
38
+ import { EditionChannel, EditionLockFile } from './edition-constants.mjs';
38
39
  import { editionsRoot } from './edition-workspace.mjs';
39
40
  import { subjectServingBiome } from './image-lock-service-rows.mjs';
40
41
  import { adoptCatalogueKernel } from './kernel-package.mjs';
@@ -268,8 +269,13 @@ export async function resolveCustomerDistribution({
268
269
  materialize,
269
270
  adoptKernel = adoptCatalogueKernel,
270
271
  fetchManifest = fetchRegistryManifest,
272
+ developGitBundles,
271
273
  }) {
272
274
  if (catalogueDigest === undefined) {throw new CatalogueError('a customer resolve names the digest of its catalogue');}
275
+ // Only a develop edition carries a git-sourced OCI bundle (develop-git-bundles.mjs); a release never verifies one.
276
+ if (developGitBundles !== undefined && catalogue.channel !== EditionChannel.Develop) {
277
+ throw new Error(`a git-sourced bundle verifier is a develop resolve's; the catalogue "${catalogue.offeringId}" is ${catalogue.channel}`);
278
+ }
273
279
  const schemas = await adoptKernel(catalogue);
274
280
  const { definition, mirror } = parseCustomerDefinition(schemas, rawDefinition);
275
281
  const composed = composeCustomerEdition({ schemas, definition, mirror, catalogue, sourceImages, pins });
@@ -284,6 +290,8 @@ export async function resolveCustomerDistribution({
284
290
  platformServiceIndex: { schemaVersion: 1, services: catalogue.platformServices },
285
291
  sourcesAvailable: false,
286
292
  storePublisherTrust: selectedStorePublisherTrust(catalogueCeiling(catalogue, schemas).storePublisherTrust, definition.storePublisherAnchorKeys),
293
+ // A develop resolve under a declared customer policy verifies its git-sourced OCI bundles and keeps them (by digest, with the signer).
294
+ ...(developGitBundles === undefined ? {} : { developGitBundles }),
287
295
  };
288
296
  let resolved;
289
297
  try {
@@ -295,6 +303,9 @@ export async function resolveCustomerDistribution({
295
303
  throw error;
296
304
  }
297
305
  const { lock, index } = resolved;
306
+ // Without a verifier no git-sourced OCI bundle is verified, so a required row that declares one is refused, never stripped.
307
+ // With one, resolve-distribution already refuses every such row it did not verify.
308
+ if (developGitBundles === undefined) {assertNoUnverifiedRequiredGitBundles({ lock, index, required: schemas.BiomeInstallPolicy.Required });}
298
309
  assertTrustCeilingAssignsCustomerBiomes(
299
310
  schemas,
300
311
  definition,
@@ -1823,7 +1823,8 @@ export function resolveUnadmittedDistributionFromInputs(
1823
1823
  // resolve verified for it (`develop-git-bundles.mjs`: the develop signer at the attested commit, content-bound to
1824
1824
  // the frozen one), by digest, and its develop bundle signer. A git-sourced OCI row the resolve did not verify is
1825
1825
  // refused, never stripped;
1826
- // - otherwise (release, customer, dist-check) it carries neither, as before; the release refuses the declaration.
1826
+ // - otherwise (release, customer, dist-check) it carries neither, as before; the release refuses the declaration,
1827
+ // and a customer resolve refuses it on a required row (develop-git-bundles.mjs `assertNoUnverifiedRequiredGitBundles`).
1827
1828
  // An OCI host-module bundle on a git-sourced biome is refused below in every channel. (An entry of a declared `oci`
1828
1829
  // source has a stamp but no record: not git.)
1829
1830
  const isGitSourced = (e) => e.source !== undefined && sourceRecords.has(e.source);
@@ -172,7 +172,9 @@ export function verifyBundleOnRegistry({ trustedCosign, policy, policyRoot, row,
172
172
  const cosign = registryCosign({ trustedCosign, policy, policyRoot, row, ociRef, env });
173
173
  const common = [...cosign.trustArgs, ...certificateConstraintArgs(row, workflowSha)];
174
174
  cosign.run('verify', [...common, ociRef]);
175
- cosign.run('verify-attestation', ['--type', COSIGN_SLSA_PROVENANCE_ALIAS, ...common, ociRef]);
175
+ // cosign refuses `verify-attestation --trusted-root` without `--new-bundle-format`; plain `verify` takes it as is.
176
+ const [offline, trustedRoot, rootPath, ...claims] = common;
177
+ cosign.run('verify-attestation', [offline, '--new-bundle-format', trustedRoot, rootPath, '--type', COSIGN_SLSA_PROVENANCE_ALIAS, ...claims, ociRef]);
176
178
  }
177
179
 
178
180
  const WORKFLOW_SHA = /^[0-9a-f]{40}$/u;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xemahq/xema",
3
- "version": "0.57.1",
3
+ "version": "0.58.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/xema-dev/xema-cli.git",
@@ -100,7 +100,7 @@
100
100
  "typecheck": "tsc --noEmit"
101
101
  },
102
102
  "xemaRelease": {
103
- "sourceDigest": "sha256:d587d9025bbf46bc076d6d88075347bd45fa0ca644c804a32a463157091f5bfa",
104
- "sha": "286425dc5a0bf4ee9b7a3b3c0b53271f3ec661ed"
103
+ "sourceDigest": "sha256:90788d0401718a3e8bfab84c8818ff21bde3b1218931ab71aedd032894bc346a",
104
+ "sha": "931d0b103540e14e34d6c726a5167640aa7a1c6e"
105
105
  }
106
106
  }