@serve.zone/appstore 33.4.0 → 33.6.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.
@@ -5,9 +5,9 @@
5
5
  "major": 1,
6
6
  "minor": 0
7
7
  },
8
- "revision": 33000004000000,
9
- "publishedAt": "2026-10-13T08:37:24.000Z",
10
- "sourceRevision": "e605f88182adedde3f83255f242132f32098746b",
8
+ "revision": 33000006000000,
9
+ "publishedAt": "2026-10-13T23:08:46.000Z",
10
+ "sourceRevision": "cf8998112ff9bff2587d6ec1fa5b379abc9d3021",
11
11
  "apps": [
12
12
  {
13
13
  "info": {
@@ -60,7 +60,7 @@
60
60
  "Docs": "https://serve.zone"
61
61
  }
62
62
  },
63
- "latestVersion": "1.28.3",
63
+ "latestVersion": "1.28.6",
64
64
  "versions": [
65
65
  {
66
66
  "version": "1.0.0",
@@ -7365,6 +7365,561 @@
7365
7365
  }
7366
7366
  },
7367
7367
  "configDigest": "sha256:e97d715e2f6486b27fe4c0200ad784cdfcccc4e63d7489e57ac42847f6293364"
7368
+ },
7369
+ {
7370
+ "version": "1.28.4",
7371
+ "config": {
7372
+ "image": "code.foss.global/serve.zone/cloudly@sha256:0dd5399877c894b86f55d7a56df2da597bfcb7d1c8ec8adec547bfebb5d091d9",
7373
+ "targetPorts": [
7374
+ {
7375
+ "name": "web",
7376
+ "port": 3000,
7377
+ "protocol": "http",
7378
+ "default": true
7379
+ }
7380
+ ],
7381
+ "envVars": [
7382
+ {
7383
+ "key": "SERVEZONE_ENVIRONMENT",
7384
+ "value": "production",
7385
+ "description": "Cloudly runtime environment.",
7386
+ "required": true
7387
+ },
7388
+ {
7389
+ "key": "SERVEZONE_PUBLIC_ORIGIN",
7390
+ "value": "https://${SERVICE_DOMAIN}",
7391
+ "description": "Canonical public Cloudly origin including protocol and optional public port.",
7392
+ "required": true
7393
+ },
7394
+ {
7395
+ "key": "SERVEZONE_LISTENPORT",
7396
+ "value": "3000",
7397
+ "description": "Internal Cloudly HTTP port inside the container.",
7398
+ "required": true
7399
+ },
7400
+ {
7401
+ "key": "SERVEZONE_SSLMODE",
7402
+ "value": "external",
7403
+ "description": "Use external TLS termination through Onebox or dcrouter.",
7404
+ "required": true
7405
+ },
7406
+ {
7407
+ "key": "SERVEZONE_SECRET_KEYRING_PATH",
7408
+ "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
7409
+ "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
7410
+ "required": true
7411
+ },
7412
+ {
7413
+ "key": "SERVEZONE_SECRET_KEYRING_FILE",
7414
+ "description": "Existing Cloudly Secrets v2 keyring. Onebox stores it encrypted and mounts it only as a root-readable file; retain the existing keyring when upgrading.",
7415
+ "required": true,
7416
+ "secret": true,
7417
+ "delivery": {
7418
+ "type": "file",
7419
+ "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
7420
+ "uid": 0,
7421
+ "gid": 0,
7422
+ "mode": 256
7423
+ }
7424
+ },
7425
+ {
7426
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
7427
+ "value": "/run/secrets/cloudly-workloadinit-approval.json",
7428
+ "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
7429
+ "required": true
7430
+ },
7431
+ {
7432
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
7433
+ "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
7434
+ "required": true,
7435
+ "secret": true,
7436
+ "delivery": {
7437
+ "type": "file",
7438
+ "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
7439
+ "uid": 0,
7440
+ "gid": 0,
7441
+ "mode": 256
7442
+ }
7443
+ },
7444
+ {
7445
+ "key": "MONGODB_URL",
7446
+ "value": "${MONGODB_URI}",
7447
+ "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
7448
+ "required": true
7449
+ },
7450
+ {
7451
+ "key": "MONGODB_NAME",
7452
+ "value": "${MONGODB_DATABASE}",
7453
+ "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
7454
+ "required": true
7455
+ },
7456
+ {
7457
+ "key": "MONGODB_USER",
7458
+ "value": "${MONGODB_USERNAME}",
7459
+ "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
7460
+ "required": true
7461
+ },
7462
+ {
7463
+ "key": "MONGODB_PASS",
7464
+ "value": "${MONGODB_PASSWORD}",
7465
+ "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
7466
+ "required": true
7467
+ },
7468
+ {
7469
+ "key": "S3_ENDPOINT",
7470
+ "value": "onebox-corestore",
7471
+ "description": "S3 endpoint host provisioned by Onebox Corestore.",
7472
+ "required": true
7473
+ },
7474
+ {
7475
+ "key": "S3_PORT",
7476
+ "value": "9000",
7477
+ "description": "S3 endpoint port provisioned by Onebox Corestore.",
7478
+ "required": true
7479
+ },
7480
+ {
7481
+ "key": "S3_USESSL",
7482
+ "value": "false",
7483
+ "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
7484
+ "required": true
7485
+ },
7486
+ {
7487
+ "key": "S3_BUCKET",
7488
+ "value": "${S3_BUCKET}",
7489
+ "description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
7490
+ "required": true
7491
+ },
7492
+ {
7493
+ "key": "S3_ACCESSKEY",
7494
+ "value": "${S3_ACCESS_KEY}",
7495
+ "description": "S3 access key provisioned by Onebox Corestore.",
7496
+ "required": true
7497
+ },
7498
+ {
7499
+ "key": "S3_SECRETKEY",
7500
+ "value": "${S3_SECRET_KEY}",
7501
+ "description": "S3 secret key provisioned by Onebox Corestore.",
7502
+ "required": true
7503
+ }
7504
+ ],
7505
+ "platformRequirements": {
7506
+ "mongodb": true,
7507
+ "s3": true
7508
+ },
7509
+ "platformOidc": {
7510
+ "redirectPath": "/auth/oidc/callback",
7511
+ "roles": [
7512
+ {
7513
+ "id": "admin",
7514
+ "label": "Administrator",
7515
+ "description": "Full Cloudly administration for this hosted instance."
7516
+ },
7517
+ {
7518
+ "id": "user",
7519
+ "label": "User",
7520
+ "description": "Standard authenticated Cloudly access for this hosted instance."
7521
+ }
7522
+ ],
7523
+ "environmentVariables": {
7524
+ "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
7525
+ "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
7526
+ "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
7527
+ "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
7528
+ "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
7529
+ },
7530
+ "clientAuthenticationMethod": "client_secret_basic"
7531
+ },
7532
+ "minOneboxVersion": "33.8.0",
7533
+ "changelog": "Move Cloudly to 33.19.2, a fixes-only patch over 33.19.1. A greenfield deployment, a legacy import's successor included, proves its namespace blank on the nodes of the Pallet clusters (phase switching or pallet) and nowhere else: a reservation whose service had no rollout plan yet asked every registered node, so a fleet that still keeps a Coreflow-owned Swarm cluster without a relay could never reserve one, and a legacy import's reserve preflight answered NO-GO with CORESTORE_INVENTORY_UNAVAILABLE and NAMESPACE_NOT_PROVEN_BLANK. The deployment preflight and reserveServiceDeployment read the same nodes; a Pallet node whose inventory cannot be read still blocks, a fleet with no Pallet cluster node refuses the reservation CORESTORE_INVENTORY_UNAVAILABLE, and an existing service's preflight still reads its plan's clusters. A greenfield rollout without a Pallet runtime spec is refused GREENFIELD_PALLET_RUNTIME_SPEC_REQUIRED, which is not retryable, instead of falling back to Coreflow placement onto Swarm nodes the namespace proof never covered: state the spec with setServiceRuntimeSpec, then promote again. A rollout with a Pallet spec plans onto the spec's nodes as before. A node's network compilation proves each workload lease once and each protected authority revision and allocation eligibility proof once per transaction (before, every lease was read up to three times per compilation and each read re-proved the same revision and proof, about 24 proof reads per endpoint), so a compilation with 100 endpoints reads 539 records instead of 2,839 (7.8 s instead of 19.8 s on Cloudly's test fixture), and every compilation signs and refuses exactly as before. Cloudly 33.19.2 adds no data step and no collection and keeps the data version 0.30.0, so an upgrade from 1.28.3 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.3 and requires Onebox 33.8.0. From 1.28.2 or earlier, the changes of Cloudly 33.18.3, 33.18.4, 33.18.5, 33.19.0 and 33.19.1 apply too: Runtime log intake no longer holds a node's request while its payload uploads: an admitted reportRuntimeAssignmentLogs costs one append transaction that queues the batch with its payload in the new collection cloudly_runtime_log_queue, and the node is answered once it commits. A background drain writes the payloads, up to 32 at once, and commits the ledger rows and removes the queue rows in coalesced transactions that fence no controller record; every other node request under a request budget counts as critical work, and the drain waits for it at most 1 s per step. A resend of a batch the ledger or the queue already holds is answered replay with nothing written, and while the queue is at its bounds (1024 batches, 64 MiB, 8 concurrent intakes) a report is refused at once with the retryable log-intake-saturated. Object writes list nothing (@lossless.org/client 1.23.3), workload logs are kept for at least 30 days whatever shorter logs.retentionMs a spec states, and one runtime log intake line, logged on its own timer at most once a minute, reports intake latency, queue depth, the drain and refusals. A node that applied its network head is no longer handed a successor that only drops the head's withdrawals, and a successor of the projection a node's receipt names lists only the tombstones its own step retires, so a node with more than 256 retired leases or handoffs stays within the contract's bound. Route verification reads the certificate a route presents on a connection of its own, without pooling or TLS session resumption, so it records the route's subject alternative names; a connection that exposes no certificate fails with TLS_PEER_CERTIFICATE_UNAVAILABLE and a certificate without names with TLS_SUBJECT_ALT_NAMES_MISSING. readServiceDeploymentStatus (@serve.zone/interfaces 32.54.0) reads a deployment operation's status without changing it, and a failed service deletion answers SERVICE_DELETION_FAILED and logs its cause. The first start after 1.28.2 or earlier creates the collection cloudly_runtime_log_queue. On the platform Corestore 32.2.4 (NoSQLDB 10.6.1) a collection creation waits at most 5 s for the open transactions on the Cloudly database, and a transaction an earlier Cloudly left open by exiting before its stop completed (it logs that its shutdown deadline passed) holds that database until its session expires 30 minutes later, so that first start fails with EFENCE_BUSY until then: after an unclean stop of the previous Cloudly, start this version no earlier than 30 minutes after that exit. Cloudly 33.19.1 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.2, 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.2 and requires Onebox 33.8.0. From 1.28.1 or earlier, Cloudly 33.18.2 advances a node's network configuration only once the node's authenticated application receipt names its head. Upgrade every node to Pallet 36.3.0 or later, speaking @serve.zone/interfaces 32.50.0 or later, before this Cloudly update: a node that sends no application receipt, Pallet 36.2.1 or earlier, or whose session speaks @serve.zone/interfaces below 32.50.0, keeps the projection it holds and receives no successor. The receipt wire contract is unchanged. The changes of Cloudly 33.18.2 and the releases before it that an upgrade from 1.28.1 or earlier also takes are described in the changelog of cloudly@1.28.2, which repeats those of every earlier template; this changelog keeps their upgrade path only, because a catalog changelog is bounded at 65536 characters. From 1.2.1 or earlier, startup runs the forward-only data migration from 0.20.0 to 0.21.0 through the step retire-cluster-relay-acme and then the steps runtime-session-protocol-offer to 0.22.0, deployment-machine-user-grants to 0.23.0, corestore-control-token-state to 0.24.0, runtime-log-attempts to 0.25.0, cluster-node-hostname-intent to 0.26.0, deployment-operation-route-evidence to 0.27.0, service-secret-target-predecessor to 0.28.0, route-claim-absent-owners to 0.29.0 and bounded-runtime-history to 0.30.0; retire-cluster-relay-acme drops the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logs every relay name whose A record Cloudly had written at Cloudflare: remove each such record at the provider. A cluster relay then requires a dcrouter that advertises dns.clientRecords and certificates.exactIssuance, SERVEZONE_SSLMODE=letsencrypt is refused (this template keeps external), and the typed API changes as the Breaking Changes of the Cloudly 33.0.0 changelog list; review them, stop Cloudly and take a verified backup before upgrading, because the 32.9 image refuses the migrated data and rollback requires a full restore. The upgrade is marked migration-required and backup-before-upgrade because hosts read these flags from the target version alone and every upgrade from 1.26.0 or earlier runs the 0.28.0 to 0.30.0 steps, one from 1.24.0 or earlier, and from 1.25.0 whose first start failed, the 0.25.0 to 0.28.0 steps before them, one from 1.19.0 or earlier the 0.24.0 to 0.25.0 step before that, one from 1.15.0 or earlier the 0.23.0 to 0.24.0 step before that, one from 1.8.0 or earlier the 0.22.0 to 0.23.0 step before that, one from 1.6.0 or earlier the 0.21.0 to 0.22.0 step before that and one from 1.2.1 or earlier the migration from 0.20.0 as well, and breaking and manual-review because every Cloudly before 33.17.3 refuses the 0.30.0 data, the 0.30.0 step deletes every archived deployment record, the 0.23.0 step removes stored grants forward-only, Cloudly 33.18.0 ignores APPSTORE_URL and loads the App Store catalog from its catalog registries and, from 1.7.0 or earlier, a username and password deployer, an administrator's deployment reservation and a machine identity or registry bearer issued earlier are refused. An installation on 1.1.10 or earlier also runs the 1.2.0 steps first, from 0.10.0, and requires completed Secrets v2 cutover retirement. Preserve existing user and storage identities, OIDC bindings, the encrypted keyring and WorkloadInit approval as dedicated root-readable files.",
7534
+ "breaking": true,
7535
+ "requiresManualReview": true,
7536
+ "migrationRequired": true,
7537
+ "backupBeforeUpgrade": true,
7538
+ "healthCheck": {
7539
+ "path": "/status",
7540
+ "port": 3000,
7541
+ "expectedStatus": 200
7542
+ }
7543
+ },
7544
+ "configDigest": "sha256:b069bdf3d8e9c9077a9fbe818abfb227b1677d576e2f51efbcc6829fdfc9e595"
7545
+ },
7546
+ {
7547
+ "version": "1.28.5",
7548
+ "config": {
7549
+ "image": "code.foss.global/serve.zone/cloudly@sha256:ff692cf950da26d1d50e717c06eff1c58201b699e6bb94d65a541cd861abbedc",
7550
+ "targetPorts": [
7551
+ {
7552
+ "name": "web",
7553
+ "port": 3000,
7554
+ "protocol": "http",
7555
+ "default": true
7556
+ }
7557
+ ],
7558
+ "envVars": [
7559
+ {
7560
+ "key": "SERVEZONE_ENVIRONMENT",
7561
+ "value": "production",
7562
+ "description": "Cloudly runtime environment.",
7563
+ "required": true
7564
+ },
7565
+ {
7566
+ "key": "SERVEZONE_PUBLIC_ORIGIN",
7567
+ "value": "https://${SERVICE_DOMAIN}",
7568
+ "description": "Canonical public Cloudly origin including protocol and optional public port.",
7569
+ "required": true
7570
+ },
7571
+ {
7572
+ "key": "SERVEZONE_LISTENPORT",
7573
+ "value": "3000",
7574
+ "description": "Internal Cloudly HTTP port inside the container.",
7575
+ "required": true
7576
+ },
7577
+ {
7578
+ "key": "SERVEZONE_SSLMODE",
7579
+ "value": "external",
7580
+ "description": "Use external TLS termination through Onebox or dcrouter.",
7581
+ "required": true
7582
+ },
7583
+ {
7584
+ "key": "SERVEZONE_SECRET_KEYRING_PATH",
7585
+ "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
7586
+ "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
7587
+ "required": true
7588
+ },
7589
+ {
7590
+ "key": "SERVEZONE_SECRET_KEYRING_FILE",
7591
+ "description": "Existing Cloudly Secrets v2 keyring. Onebox stores it encrypted and mounts it only as a root-readable file; retain the existing keyring when upgrading.",
7592
+ "required": true,
7593
+ "secret": true,
7594
+ "delivery": {
7595
+ "type": "file",
7596
+ "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
7597
+ "uid": 0,
7598
+ "gid": 0,
7599
+ "mode": 256
7600
+ }
7601
+ },
7602
+ {
7603
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
7604
+ "value": "/run/secrets/cloudly-workloadinit-approval.json",
7605
+ "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
7606
+ "required": true
7607
+ },
7608
+ {
7609
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
7610
+ "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
7611
+ "required": true,
7612
+ "secret": true,
7613
+ "delivery": {
7614
+ "type": "file",
7615
+ "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
7616
+ "uid": 0,
7617
+ "gid": 0,
7618
+ "mode": 256
7619
+ }
7620
+ },
7621
+ {
7622
+ "key": "MONGODB_URL",
7623
+ "value": "${MONGODB_URI}",
7624
+ "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
7625
+ "required": true
7626
+ },
7627
+ {
7628
+ "key": "MONGODB_NAME",
7629
+ "value": "${MONGODB_DATABASE}",
7630
+ "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
7631
+ "required": true
7632
+ },
7633
+ {
7634
+ "key": "MONGODB_USER",
7635
+ "value": "${MONGODB_USERNAME}",
7636
+ "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
7637
+ "required": true
7638
+ },
7639
+ {
7640
+ "key": "MONGODB_PASS",
7641
+ "value": "${MONGODB_PASSWORD}",
7642
+ "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
7643
+ "required": true
7644
+ },
7645
+ {
7646
+ "key": "S3_ENDPOINT",
7647
+ "value": "onebox-corestore",
7648
+ "description": "S3 endpoint host provisioned by Onebox Corestore.",
7649
+ "required": true
7650
+ },
7651
+ {
7652
+ "key": "S3_PORT",
7653
+ "value": "9000",
7654
+ "description": "S3 endpoint port provisioned by Onebox Corestore.",
7655
+ "required": true
7656
+ },
7657
+ {
7658
+ "key": "S3_USESSL",
7659
+ "value": "false",
7660
+ "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
7661
+ "required": true
7662
+ },
7663
+ {
7664
+ "key": "S3_BUCKET",
7665
+ "value": "${S3_BUCKET}",
7666
+ "description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
7667
+ "required": true
7668
+ },
7669
+ {
7670
+ "key": "S3_ACCESSKEY",
7671
+ "value": "${S3_ACCESS_KEY}",
7672
+ "description": "S3 access key provisioned by Onebox Corestore.",
7673
+ "required": true
7674
+ },
7675
+ {
7676
+ "key": "S3_SECRETKEY",
7677
+ "value": "${S3_SECRET_KEY}",
7678
+ "description": "S3 secret key provisioned by Onebox Corestore.",
7679
+ "required": true
7680
+ }
7681
+ ],
7682
+ "platformRequirements": {
7683
+ "mongodb": true,
7684
+ "s3": true
7685
+ },
7686
+ "backupExclusions": [
7687
+ {
7688
+ "storageRequest": "legacy-s3",
7689
+ "keyPrefixes": [
7690
+ "runtime-logs/"
7691
+ ],
7692
+ "reason": "Workload logs; a restore brings back state, not past logs."
7693
+ }
7694
+ ],
7695
+ "platformOidc": {
7696
+ "redirectPath": "/auth/oidc/callback",
7697
+ "roles": [
7698
+ {
7699
+ "id": "admin",
7700
+ "label": "Administrator",
7701
+ "description": "Full Cloudly administration for this hosted instance."
7702
+ },
7703
+ {
7704
+ "id": "user",
7705
+ "label": "User",
7706
+ "description": "Standard authenticated Cloudly access for this hosted instance."
7707
+ }
7708
+ ],
7709
+ "environmentVariables": {
7710
+ "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
7711
+ "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
7712
+ "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
7713
+ "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
7714
+ "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
7715
+ },
7716
+ "clientAuthenticationMethod": "client_secret_basic"
7717
+ },
7718
+ "minOneboxVersion": "33.8.0",
7719
+ "changelog": "Declare Cloudly's workload logs non-backup data without moving the image: this template runs the Cloudly 33.19.1 image of 1.28.3 and differs from 1.28.3 only in its changelog and two members. backupExclusions names the key prefix runtime-logs/ of Cloudly's own bucket, the object storage platformRequirements.s3 provisions (storage request legacy-s3), under which Cloudly keeps the payloads of workload logs, and requiresFeatures names storage.object-storage.backup-exclusions. A host that fulfils that feature leaves the objects under runtime-logs/ out of Cloudly's backups, and a restore brings back Cloudly's state, not its past workload logs: it neither restores nor removes objects under that prefix, and Cloudly reports a log batch whose payload it no longer has as a gap. A host that does not fulfil the feature keeps listing this version and refuses it as an install or upgrade target. From 1.28.3 the upgrade moves the template only: Cloudly runs the same image on the same data and no data step runs. 1.28.5 sorts above 1.28.4 but runs the older image, Cloudly 33.19.1 instead of 33.19.2: it exists for a host on 1.28.3 that moves its template without moving Cloudly. From 1.28.4, upgrade to 1.28.6, which carries the same declaration on the Cloudly 33.19.2 image of 1.28.4; 1.28.5 would run Cloudly 33.19.1 on that data, which it reads because Cloudly 33.19.2 added no data step and no collection, but without the fixes of 33.19.2. The rest of this changelog is that of 1.28.3 and holds for this template: Move Cloudly to 33.19.1, which carries Cloudly 33.18.3, 33.18.4, 33.18.5, 33.19.0 and 33.19.1 over 33.18.2. Runtime log intake no longer holds a node's request while its payload uploads: an admitted reportRuntimeAssignmentLogs costs one append transaction that queues the batch with its payload in the new collection cloudly_runtime_log_queue, and the node is answered once it commits. A background drain writes the payloads, up to 32 at once, and commits the ledger rows and removes the queue rows in coalesced transactions that fence no controller record; every other node request under a request budget counts as critical work, and the drain waits for it at most 1 s per step. A resend of a batch the ledger or the queue already holds is answered replay with nothing written, and while the queue is at its bounds (1024 batches, 64 MiB, 8 concurrent intakes) a report is refused at once with the retryable log-intake-saturated. Object writes list nothing (@lossless.org/client 1.23.3), workload logs are kept for at least 30 days whatever shorter logs.retentionMs a spec states, and one runtime log intake line, logged on its own timer at most once a minute, reports intake latency, queue depth, the drain and refusals. A node that applied its network head is no longer handed a successor that only drops the head's withdrawals, and a successor of the projection a node's receipt names lists only the tombstones its own step retires, so a node with more than 256 retired leases or handoffs stays within the contract's bound. Route verification reads the certificate a route presents on a connection of its own, without pooling or TLS session resumption, so it records the route's subject alternative names; a connection that exposes no certificate fails with TLS_PEER_CERTIFICATE_UNAVAILABLE and a certificate without names with TLS_SUBJECT_ALT_NAMES_MISSING. readServiceDeploymentStatus (@serve.zone/interfaces 32.54.0) reads a deployment operation's status without changing it, and a failed service deletion answers SERVICE_DELETION_FAILED and logs its cause. The first start creates the collection cloudly_runtime_log_queue. On the platform Corestore 32.2.4 (NoSQLDB 10.6.1) a collection creation waits at most 5 s for the open transactions on the Cloudly database, and a transaction an earlier Cloudly left open by exiting before its stop completed (it logs that its shutdown deadline passed) holds that database until its session expires 30 minutes later, so that first start fails with EFENCE_BUSY until then: after an unclean stop of the previous Cloudly, start this version no earlier than 30 minutes after that exit. Cloudly 33.19.1 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.2, 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.2 and requires Onebox 33.8.0. From 1.28.1 or earlier, the fixes of Cloudly 33.18.2 apply too: A node's network configuration advances only as fast as the node applies it: Cloudly signed a node's successor projection once the node stored its head, so every new version invalidated the application in flight. Cloudly now composes the successor only once the node's authenticated application receipt names the exact head, under a session speaking @serve.zone/interfaces 32.50.0 or later; a storage acknowledgement, a failed or absent application or a reconnect is no such proof, while a receipt whose nativeJournal is null, proving every packet table released, lets the node advance after a failed application too. Changes staged meanwhile coalesce into one successor from the current durable state; the producer reports the node awaiting-application, naming the held head, and logs one warning per held head. A withdrawn cluster ingress flow wanted again no longer lets the rest of the projection go on: the whole projection waits for the receipt. A rotated signing key still re-signs the held head at its own generation. Upgrade every node to Pallet 36.3.0 or later, speaking @serve.zone/interfaces 32.50.0 or later, before this Cloudly update: a node that sends no application receipt, Pallet 36.2.1 or earlier, or whose session speaks @serve.zone/interfaces below 32.50.0, keeps the projection it holds and receives no successor. The receipt wire contract is unchanged. Cloudly 33.18.2 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.1 and requires Onebox 33.8.0. The changes of the Cloudly releases before 33.18.2 that an upgrade from 1.28.0 or earlier also takes are described in the changelog of cloudly@1.28.2, which repeats those of every earlier template; this changelog keeps their upgrade path only, because a catalog changelog is bounded at 65536 characters. From 1.2.1 or earlier, startup runs the forward-only data migration from 0.20.0 to 0.21.0 through the step retire-cluster-relay-acme and then the steps runtime-session-protocol-offer to 0.22.0, deployment-machine-user-grants to 0.23.0, corestore-control-token-state to 0.24.0, runtime-log-attempts to 0.25.0, cluster-node-hostname-intent to 0.26.0, deployment-operation-route-evidence to 0.27.0, service-secret-target-predecessor to 0.28.0, route-claim-absent-owners to 0.29.0 and bounded-runtime-history to 0.30.0; retire-cluster-relay-acme drops the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logs every relay name whose A record Cloudly had written at Cloudflare: remove each such record at the provider. A cluster relay then requires a dcrouter that advertises dns.clientRecords and certificates.exactIssuance, SERVEZONE_SSLMODE=letsencrypt is refused (this template keeps external), and the typed API changes as the Breaking Changes of the Cloudly 33.0.0 changelog list; review them, stop Cloudly and take a verified backup before upgrading, because the 32.9 image refuses the migrated data and rollback requires a full restore. The upgrade is marked migration-required and backup-before-upgrade because hosts read these flags from the target version alone and every upgrade from 1.26.0 or earlier runs the 0.28.0 to 0.30.0 steps, one from 1.24.0 or earlier, and from 1.25.0 whose first start failed, the 0.25.0 to 0.28.0 steps before them, one from 1.19.0 or earlier the 0.24.0 to 0.25.0 step before that, one from 1.15.0 or earlier the 0.23.0 to 0.24.0 step before that, one from 1.8.0 or earlier the 0.22.0 to 0.23.0 step before that, one from 1.6.0 or earlier the 0.21.0 to 0.22.0 step before that and one from 1.2.1 or earlier the migration from 0.20.0 as well, and breaking and manual-review because every Cloudly before 33.17.3 refuses the 0.30.0 data, the 0.30.0 step deletes every archived deployment record, the 0.23.0 step removes stored grants forward-only, Cloudly 33.18.0 ignores APPSTORE_URL and loads the App Store catalog from its catalog registries and, from 1.7.0 or earlier, a username and password deployer, an administrator's deployment reservation and a machine identity or registry bearer issued earlier are refused. An installation on 1.1.10 or earlier also runs the 1.2.0 steps first, from 0.10.0, and requires completed Secrets v2 cutover retirement. Preserve existing user and storage identities, OIDC bindings, the encrypted keyring and WorkloadInit approval as dedicated root-readable files.",
7720
+ "breaking": true,
7721
+ "requiresManualReview": true,
7722
+ "migrationRequired": true,
7723
+ "backupBeforeUpgrade": true,
7724
+ "requiresFeatures": [
7725
+ "storage.object-storage.backup-exclusions"
7726
+ ],
7727
+ "healthCheck": {
7728
+ "path": "/status",
7729
+ "port": 3000,
7730
+ "expectedStatus": 200
7731
+ }
7732
+ },
7733
+ "configDigest": "sha256:15c6742639a1fbf402d0b3d080029600f6a828e53f3103f5c303d9be89c49c2f"
7734
+ },
7735
+ {
7736
+ "version": "1.28.6",
7737
+ "config": {
7738
+ "image": "code.foss.global/serve.zone/cloudly@sha256:0dd5399877c894b86f55d7a56df2da597bfcb7d1c8ec8adec547bfebb5d091d9",
7739
+ "targetPorts": [
7740
+ {
7741
+ "name": "web",
7742
+ "port": 3000,
7743
+ "protocol": "http",
7744
+ "default": true
7745
+ }
7746
+ ],
7747
+ "envVars": [
7748
+ {
7749
+ "key": "SERVEZONE_ENVIRONMENT",
7750
+ "value": "production",
7751
+ "description": "Cloudly runtime environment.",
7752
+ "required": true
7753
+ },
7754
+ {
7755
+ "key": "SERVEZONE_PUBLIC_ORIGIN",
7756
+ "value": "https://${SERVICE_DOMAIN}",
7757
+ "description": "Canonical public Cloudly origin including protocol and optional public port.",
7758
+ "required": true
7759
+ },
7760
+ {
7761
+ "key": "SERVEZONE_LISTENPORT",
7762
+ "value": "3000",
7763
+ "description": "Internal Cloudly HTTP port inside the container.",
7764
+ "required": true
7765
+ },
7766
+ {
7767
+ "key": "SERVEZONE_SSLMODE",
7768
+ "value": "external",
7769
+ "description": "Use external TLS termination through Onebox or dcrouter.",
7770
+ "required": true
7771
+ },
7772
+ {
7773
+ "key": "SERVEZONE_SECRET_KEYRING_PATH",
7774
+ "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
7775
+ "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
7776
+ "required": true
7777
+ },
7778
+ {
7779
+ "key": "SERVEZONE_SECRET_KEYRING_FILE",
7780
+ "description": "Existing Cloudly Secrets v2 keyring. Onebox stores it encrypted and mounts it only as a root-readable file; retain the existing keyring when upgrading.",
7781
+ "required": true,
7782
+ "secret": true,
7783
+ "delivery": {
7784
+ "type": "file",
7785
+ "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
7786
+ "uid": 0,
7787
+ "gid": 0,
7788
+ "mode": 256
7789
+ }
7790
+ },
7791
+ {
7792
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
7793
+ "value": "/run/secrets/cloudly-workloadinit-approval.json",
7794
+ "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
7795
+ "required": true
7796
+ },
7797
+ {
7798
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
7799
+ "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
7800
+ "required": true,
7801
+ "secret": true,
7802
+ "delivery": {
7803
+ "type": "file",
7804
+ "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
7805
+ "uid": 0,
7806
+ "gid": 0,
7807
+ "mode": 256
7808
+ }
7809
+ },
7810
+ {
7811
+ "key": "MONGODB_URL",
7812
+ "value": "${MONGODB_URI}",
7813
+ "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
7814
+ "required": true
7815
+ },
7816
+ {
7817
+ "key": "MONGODB_NAME",
7818
+ "value": "${MONGODB_DATABASE}",
7819
+ "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
7820
+ "required": true
7821
+ },
7822
+ {
7823
+ "key": "MONGODB_USER",
7824
+ "value": "${MONGODB_USERNAME}",
7825
+ "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
7826
+ "required": true
7827
+ },
7828
+ {
7829
+ "key": "MONGODB_PASS",
7830
+ "value": "${MONGODB_PASSWORD}",
7831
+ "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
7832
+ "required": true
7833
+ },
7834
+ {
7835
+ "key": "S3_ENDPOINT",
7836
+ "value": "onebox-corestore",
7837
+ "description": "S3 endpoint host provisioned by Onebox Corestore.",
7838
+ "required": true
7839
+ },
7840
+ {
7841
+ "key": "S3_PORT",
7842
+ "value": "9000",
7843
+ "description": "S3 endpoint port provisioned by Onebox Corestore.",
7844
+ "required": true
7845
+ },
7846
+ {
7847
+ "key": "S3_USESSL",
7848
+ "value": "false",
7849
+ "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
7850
+ "required": true
7851
+ },
7852
+ {
7853
+ "key": "S3_BUCKET",
7854
+ "value": "${S3_BUCKET}",
7855
+ "description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
7856
+ "required": true
7857
+ },
7858
+ {
7859
+ "key": "S3_ACCESSKEY",
7860
+ "value": "${S3_ACCESS_KEY}",
7861
+ "description": "S3 access key provisioned by Onebox Corestore.",
7862
+ "required": true
7863
+ },
7864
+ {
7865
+ "key": "S3_SECRETKEY",
7866
+ "value": "${S3_SECRET_KEY}",
7867
+ "description": "S3 secret key provisioned by Onebox Corestore.",
7868
+ "required": true
7869
+ }
7870
+ ],
7871
+ "platformRequirements": {
7872
+ "mongodb": true,
7873
+ "s3": true
7874
+ },
7875
+ "backupExclusions": [
7876
+ {
7877
+ "storageRequest": "legacy-s3",
7878
+ "keyPrefixes": [
7879
+ "runtime-logs/"
7880
+ ],
7881
+ "reason": "Workload logs; a restore brings back state, not past logs."
7882
+ }
7883
+ ],
7884
+ "platformOidc": {
7885
+ "redirectPath": "/auth/oidc/callback",
7886
+ "roles": [
7887
+ {
7888
+ "id": "admin",
7889
+ "label": "Administrator",
7890
+ "description": "Full Cloudly administration for this hosted instance."
7891
+ },
7892
+ {
7893
+ "id": "user",
7894
+ "label": "User",
7895
+ "description": "Standard authenticated Cloudly access for this hosted instance."
7896
+ }
7897
+ ],
7898
+ "environmentVariables": {
7899
+ "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
7900
+ "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
7901
+ "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
7902
+ "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
7903
+ "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
7904
+ },
7905
+ "clientAuthenticationMethod": "client_secret_basic"
7906
+ },
7907
+ "minOneboxVersion": "33.8.0",
7908
+ "changelog": "Declare Cloudly's workload logs non-backup data on the Cloudly 33.19.2 image of 1.28.4: this template differs from 1.28.4 only in its changelog and two members. backupExclusions names the key prefix runtime-logs/ of Cloudly's own bucket, the object storage platformRequirements.s3 provisions (storage request legacy-s3), under which Cloudly keeps the payloads of workload logs, and requiresFeatures names storage.object-storage.backup-exclusions. A host that fulfils that feature leaves the objects under runtime-logs/ out of Cloudly's backups, and a restore brings back Cloudly's state, not its past workload logs: it neither restores nor removes objects under that prefix, and Cloudly reports a log batch whose payload it no longer has as a gap. A host that does not fulfil the feature keeps listing this version and refuses it as an install or upgrade target. From 1.28.4 the upgrade moves the template only: Cloudly runs the same image on the same data and no data step runs. From 1.28.5, which carries the same declaration on the Cloudly 33.19.1 image of 1.28.3, it moves Cloudly to 33.19.2 as an upgrade from 1.28.3 does. The rest of this changelog is that of 1.28.4 and holds for this template: Move Cloudly to 33.19.2, a fixes-only patch over 33.19.1. A greenfield deployment, a legacy import's successor included, proves its namespace blank on the nodes of the Pallet clusters (phase switching or pallet) and nowhere else: a reservation whose service had no rollout plan yet asked every registered node, so a fleet that still keeps a Coreflow-owned Swarm cluster without a relay could never reserve one, and a legacy import's reserve preflight answered NO-GO with CORESTORE_INVENTORY_UNAVAILABLE and NAMESPACE_NOT_PROVEN_BLANK. The deployment preflight and reserveServiceDeployment read the same nodes; a Pallet node whose inventory cannot be read still blocks, a fleet with no Pallet cluster node refuses the reservation CORESTORE_INVENTORY_UNAVAILABLE, and an existing service's preflight still reads its plan's clusters. A greenfield rollout without a Pallet runtime spec is refused GREENFIELD_PALLET_RUNTIME_SPEC_REQUIRED, which is not retryable, instead of falling back to Coreflow placement onto Swarm nodes the namespace proof never covered: state the spec with setServiceRuntimeSpec, then promote again. A rollout with a Pallet spec plans onto the spec's nodes as before. A node's network compilation proves each workload lease once and each protected authority revision and allocation eligibility proof once per transaction (before, every lease was read up to three times per compilation and each read re-proved the same revision and proof, about 24 proof reads per endpoint), so a compilation with 100 endpoints reads 539 records instead of 2,839 (7.8 s instead of 19.8 s on Cloudly's test fixture), and every compilation signs and refuses exactly as before. Cloudly 33.19.2 adds no data step and no collection and keeps the data version 0.30.0, so an upgrade from 1.28.3 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.3 and requires Onebox 33.8.0. From 1.28.2 or earlier, the changes of Cloudly 33.18.3, 33.18.4, 33.18.5, 33.19.0 and 33.19.1 apply too: Runtime log intake no longer holds a node's request while its payload uploads: an admitted reportRuntimeAssignmentLogs costs one append transaction that queues the batch with its payload in the new collection cloudly_runtime_log_queue, and the node is answered once it commits. A background drain writes the payloads, up to 32 at once, and commits the ledger rows and removes the queue rows in coalesced transactions that fence no controller record; every other node request under a request budget counts as critical work, and the drain waits for it at most 1 s per step. A resend of a batch the ledger or the queue already holds is answered replay with nothing written, and while the queue is at its bounds (1024 batches, 64 MiB, 8 concurrent intakes) a report is refused at once with the retryable log-intake-saturated. Object writes list nothing (@lossless.org/client 1.23.3), workload logs are kept for at least 30 days whatever shorter logs.retentionMs a spec states, and one runtime log intake line, logged on its own timer at most once a minute, reports intake latency, queue depth, the drain and refusals. A node that applied its network head is no longer handed a successor that only drops the head's withdrawals, and a successor of the projection a node's receipt names lists only the tombstones its own step retires, so a node with more than 256 retired leases or handoffs stays within the contract's bound. Route verification reads the certificate a route presents on a connection of its own, without pooling or TLS session resumption, so it records the route's subject alternative names; a connection that exposes no certificate fails with TLS_PEER_CERTIFICATE_UNAVAILABLE and a certificate without names with TLS_SUBJECT_ALT_NAMES_MISSING. readServiceDeploymentStatus (@serve.zone/interfaces 32.54.0) reads a deployment operation's status without changing it, and a failed service deletion answers SERVICE_DELETION_FAILED and logs its cause. The first start after 1.28.2 or earlier creates the collection cloudly_runtime_log_queue. On the platform Corestore 32.2.4 (NoSQLDB 10.6.1) a collection creation waits at most 5 s for the open transactions on the Cloudly database, and a transaction an earlier Cloudly left open by exiting before its stop completed (it logs that its shutdown deadline passed) holds that database until its session expires 30 minutes later, so that first start fails with EFENCE_BUSY until then: after an unclean stop of the previous Cloudly, start this version no earlier than 30 minutes after that exit. Cloudly 33.19.1 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.2, 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.2 and requires Onebox 33.8.0. From 1.28.1 or earlier, Cloudly 33.18.2 advances a node's network configuration only once the node's authenticated application receipt names its head. Upgrade every node to Pallet 36.3.0 or later, speaking @serve.zone/interfaces 32.50.0 or later, before this Cloudly update: a node that sends no application receipt, Pallet 36.2.1 or earlier, or whose session speaks @serve.zone/interfaces below 32.50.0, keeps the projection it holds and receives no successor. The receipt wire contract is unchanged. The changes of Cloudly 33.18.2 and the releases before it that an upgrade from 1.28.1 or earlier also takes are described in the changelog of cloudly@1.28.2, which repeats those of every earlier template; this changelog keeps their upgrade path only, because a catalog changelog is bounded at 65536 characters. From 1.2.1 or earlier, startup runs the forward-only data migration from 0.20.0 to 0.21.0 through the step retire-cluster-relay-acme and then the steps runtime-session-protocol-offer to 0.22.0, deployment-machine-user-grants to 0.23.0, corestore-control-token-state to 0.24.0, runtime-log-attempts to 0.25.0, cluster-node-hostname-intent to 0.26.0, deployment-operation-route-evidence to 0.27.0, service-secret-target-predecessor to 0.28.0, route-claim-absent-owners to 0.29.0 and bounded-runtime-history to 0.30.0; retire-cluster-relay-acme drops the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logs every relay name whose A record Cloudly had written at Cloudflare: remove each such record at the provider. A cluster relay then requires a dcrouter that advertises dns.clientRecords and certificates.exactIssuance, SERVEZONE_SSLMODE=letsencrypt is refused (this template keeps external), and the typed API changes as the Breaking Changes of the Cloudly 33.0.0 changelog list; review them, stop Cloudly and take a verified backup before upgrading, because the 32.9 image refuses the migrated data and rollback requires a full restore. The upgrade is marked migration-required and backup-before-upgrade because hosts read these flags from the target version alone and every upgrade from 1.26.0 or earlier runs the 0.28.0 to 0.30.0 steps, one from 1.24.0 or earlier, and from 1.25.0 whose first start failed, the 0.25.0 to 0.28.0 steps before them, one from 1.19.0 or earlier the 0.24.0 to 0.25.0 step before that, one from 1.15.0 or earlier the 0.23.0 to 0.24.0 step before that, one from 1.8.0 or earlier the 0.22.0 to 0.23.0 step before that, one from 1.6.0 or earlier the 0.21.0 to 0.22.0 step before that and one from 1.2.1 or earlier the migration from 0.20.0 as well, and breaking and manual-review because every Cloudly before 33.17.3 refuses the 0.30.0 data, the 0.30.0 step deletes every archived deployment record, the 0.23.0 step removes stored grants forward-only, Cloudly 33.18.0 ignores APPSTORE_URL and loads the App Store catalog from its catalog registries and, from 1.7.0 or earlier, a username and password deployer, an administrator's deployment reservation and a machine identity or registry bearer issued earlier are refused. An installation on 1.1.10 or earlier also runs the 1.2.0 steps first, from 0.10.0, and requires completed Secrets v2 cutover retirement. Preserve existing user and storage identities, OIDC bindings, the encrypted keyring and WorkloadInit approval as dedicated root-readable files.",
7909
+ "breaking": true,
7910
+ "requiresManualReview": true,
7911
+ "migrationRequired": true,
7912
+ "backupBeforeUpgrade": true,
7913
+ "requiresFeatures": [
7914
+ "storage.object-storage.backup-exclusions"
7915
+ ],
7916
+ "healthCheck": {
7917
+ "path": "/status",
7918
+ "port": 3000,
7919
+ "expectedStatus": 200
7920
+ }
7921
+ },
7922
+ "configDigest": "sha256:110432c0d224cd8433e796c63092b603738ad89c98e9f8e2b4bff36d2056e90e"
7368
7923
  }
7369
7924
  ]
7370
7925
  },
@@ -8138,11 +8693,11 @@
8138
8693
  }
8139
8694
  ]
8140
8695
  },
8141
- "catalogDigest": "sha256:dc4d8856812fd16616dc5cb324b70cde0ed0218502adfd74a68f92d893c8bc84",
8696
+ "catalogDigest": "sha256:e86081be018dd1c01c4153c13493f4de9d00ea28abd9b8dddf67cfa4afd63880",
8142
8697
  "signatures": [
8143
8698
  {
8144
8699
  "keyId": "sha256:58956c3537cdf542430d6685261824776d6128ebb9a93b3d77b53f2d031ba854",
8145
- "signature": "104589a9af51bf762dc36e6844bc0f1fcdf28e7d0102fa1f2324cb1d2dad5c6ee422dfca8770ae1d9a9bc075500f726c1402610a9ef275fca243ebcd32ce660d"
8700
+ "signature": "e7c14935c07b1b3c47bd80aec573bf8f6dcf7bdc7bafc2f8155be75ab7412bbba57ffcdd4f97c924a0fe90fb2498b21f8ff1ebfcdd39652d1372fa3444bba006"
8146
8701
  }
8147
8702
  ]
8148
8703
  }