From 6bfa3c9cdb11b07d0d592cb223020baefc0571d3 Mon Sep 17 00:00:00 2001 From: Jente Rosseel Date: Wed, 19 Aug 2026 16:04:37 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9A=A1=20derive=20umbrella=20subchart=20?= =?UTF-8?q?packaging=20from=20in-repo=20sources?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every umbrella dependency is a file:// chart in this repository, so the checked-out commit already fixes the exact sources. The umbrella now declares open version constraints and the deploy fixture packages the current sources at render time; the checked-in Chart.lock and vendored archives are gone, and a chart version bump no longer requires touching the umbrella at all. The release gate keeps the one invariant that can still drift: every chart-bearing application must stay declared as an umbrella dependency. --- .gitignore | 4 + apps/_infra/deploy-k8s/Chart.lock | 48 --------- apps/_infra/deploy-k8s/Chart.yaml | 34 ++++--- .../deploy-k8s/charts/k8s-platform-0.9.2.tgz | Bin 13912 -> 0 bytes .../opencrane-agent-controller-0.9.2.tgz | Bin 8644 -> 0 bytes .../opencrane-artifact-preprocessor-0.9.2.tgz | Bin 2178 -> 0 bytes .../opencrane-artifact-scanner-0.9.2.tgz | Bin 2292 -> 0 bytes .../opencrane-artifact-service-0.8.0.tgz | Bin 1796 -> 0 bytes .../charts/opencrane-channel-proxy-0.9.2.tgz | Bin 2178 -> 0 bytes .../charts/opencrane-cognee-0.8.1.tgz | Bin 3779 -> 0 bytes .../charts/opencrane-litellm-0.8.0.tgz | Bin 2621 -> 0 bytes .../opencrane-managed-agent-runtime-0.8.0.tgz | Bin 2242 -> 0 bytes .../charts/opencrane-memory-gateway-0.9.2.tgz | Bin 2428 -> 0 bytes .../charts/opencrane-obot-0.8.0.tgz | Bin 4230 -> 0 bytes .../charts/opencrane-server-0.9.2.tgz | Bin 9910 -> 0 bytes .../opencrane-skill-authoring-0.8.0.tgz | Bin 1121 -> 0 bytes .../charts/opencrane-tool-runner-0.8.0.tgz | Bin 1119 -> 0 bytes .../deploy-k8s/charts/opencrane-ui-0.9.2.tgz | Bin 1183 -> 0 bytes .../platform/current-chart-sources.sh | 6 +- .../tests/current-chart-sources-contract.sh | 2 +- .../tests/post-deploy-health-contract.sh | 16 +-- docs/agents/versioning.md | 9 +- docs/ci-and-deploy.md | 16 +-- .../release-versioning-check.test.mjs | 23 ++--- .../release-versioning/chart-validation.mjs | 95 +++--------------- website/contributing/deploying.md | 12 +-- .../contributing/versions-and-migrations.md | 13 +-- 27 files changed, 86 insertions(+), 192 deletions(-) delete mode 100644 apps/_infra/deploy-k8s/Chart.lock delete mode 100644 apps/_infra/deploy-k8s/charts/k8s-platform-0.9.2.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-agent-controller-0.9.2.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-artifact-preprocessor-0.9.2.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-artifact-scanner-0.9.2.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-artifact-service-0.8.0.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-channel-proxy-0.9.2.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-cognee-0.8.1.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-litellm-0.8.0.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-managed-agent-runtime-0.8.0.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-memory-gateway-0.9.2.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-obot-0.8.0.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-server-0.9.2.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-skill-authoring-0.8.0.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-tool-runner-0.8.0.tgz delete mode 100644 apps/_infra/deploy-k8s/charts/opencrane-ui-0.9.2.tgz diff --git a/.gitignore b/.gitignore index 0413db346..01f2bcefc 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,7 @@ pr-stack-integrity-evidence.json /.r0-evidence*/ /keys/* + +# Umbrella subchart packaging is derived from the in-repo sources at render time. +apps/_infra/deploy-k8s/Chart.lock +apps/_infra/deploy-k8s/charts/ diff --git a/apps/_infra/deploy-k8s/Chart.lock b/apps/_infra/deploy-k8s/Chart.lock deleted file mode 100644 index ef78800e0..000000000 --- a/apps/_infra/deploy-k8s/Chart.lock +++ /dev/null @@ -1,48 +0,0 @@ -dependencies: -- name: k8s-platform - repository: file://platform - version: 0.9.2 -- name: opencrane-server - repository: file://../../opencrane/helm - version: 0.9.2 -- name: opencrane-ui - repository: file://../../opencrane-ui/helm - version: 0.9.2 -- name: opencrane-channel-proxy - repository: file://../../channel-proxy/helm - version: 0.9.2 -- name: opencrane-memory-gateway - repository: file://../../memory-gateway/helm - version: 0.9.2 -- name: opencrane-artifact-service - repository: file://../../artifact-service/helm - version: 0.8.0 -- name: opencrane-artifact-preprocessor - repository: file://../../artifact-preprocessor/helm - version: 0.9.2 -- name: opencrane-artifact-scanner - repository: file://../../artifact-scanner/helm - version: 0.9.2 -- name: opencrane-agent-controller - repository: file://../../agent-controller/helm - version: 0.9.2 -- name: opencrane-managed-agent-runtime - repository: file://../../managed-agent-runtime/helm - version: 0.8.0 -- name: opencrane-skill-authoring - repository: file://../../skill-authoring/helm - version: 0.8.0 -- name: opencrane-tool-runner - repository: file://../../tool-runner/helm - version: 0.8.0 -- name: opencrane-cognee - repository: file://../cognee/helm - version: 0.8.1 -- name: opencrane-litellm - repository: file://../litellm/helm - version: 0.8.0 -- name: opencrane-obot - repository: file://../obot/helm - version: 0.8.0 -digest: sha256:1670f21eb5487abeb34dcdf54087c3d14694d50bc432e6bee44d69a9cd46e951 -generated: "2026-08-19T15:41:04.77927+03:00" diff --git a/apps/_infra/deploy-k8s/Chart.yaml b/apps/_infra/deploy-k8s/Chart.yaml index 2c2c29794..f47cc2a08 100644 --- a/apps/_infra/deploy-k8s/Chart.yaml +++ b/apps/_infra/deploy-k8s/Chart.yaml @@ -17,53 +17,57 @@ keywords: maintainers: - name: OpenCrane dependencies: + # Every dependency is an in-repo file:// chart, so the checked-out commit is the only + # version authority. The open constraint always accepts the chart each app currently + # declares; helm dependency update packages the sources fresh at render time, and no + # lock file or vendored archive needs a matching bump. # Shared named-template library (labels, fullname, RBAC rule sets, env helpers). - name: k8s-platform - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://platform" # App-owned workload units export named templates; this umbrella only includes them # with the unchanged parent release context. - name: opencrane-server - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://../../opencrane/helm" - name: opencrane-ui - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://../../opencrane-ui/helm" - name: opencrane-channel-proxy - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://../../channel-proxy/helm" - name: opencrane-memory-gateway - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://../../memory-gateway/helm" - name: opencrane-artifact-service - version: 0.8.0 + version: ">=0.0.0-0" repository: "file://../../artifact-service/helm" - name: opencrane-artifact-preprocessor - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://../../artifact-preprocessor/helm" - name: opencrane-artifact-scanner - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://../../artifact-scanner/helm" - name: opencrane-agent-controller - version: 0.9.2 + version: ">=0.0.0-0" repository: "file://../../agent-controller/helm" - name: opencrane-managed-agent-runtime alias: managedAgentRuntimePlane - version: 0.8.0 + version: ">=0.0.0-0" repository: "file://../../managed-agent-runtime/helm" condition: agentController.enabled - name: opencrane-skill-authoring - version: 0.8.0 + version: ">=0.0.0-0" repository: "file://../../skill-authoring/helm" - name: opencrane-tool-runner - version: 0.8.0 + version: ">=0.0.0-0" repository: "file://../../tool-runner/helm" - name: opencrane-cognee - version: 0.8.1 + version: ">=0.0.0-0" repository: "file://../cognee/helm" - name: opencrane-litellm - version: 0.8.0 + version: ">=0.0.0-0" repository: "file://../litellm/helm" - name: opencrane-obot - version: 0.8.0 + version: ">=0.0.0-0" repository: "file://../obot/helm" diff --git a/apps/_infra/deploy-k8s/charts/k8s-platform-0.9.2.tgz b/apps/_infra/deploy-k8s/charts/k8s-platform-0.9.2.tgz deleted file mode 100644 index 40fb5028bfba2f9ae2e603bac53c6f0643063580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13912 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 diff --git a/apps/_infra/deploy-k8s/charts/opencrane-agent-controller-0.9.2.tgz b/apps/_infra/deploy-k8s/charts/opencrane-agent-controller-0.9.2.tgz deleted file mode 100644 index be26a8acc0c80375fd5c7583c8f1943a7bcf5eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8644 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 W56?IJ{7(P?0RR7VH?OJy1_1yv;H{zn diff --git a/apps/_infra/deploy-k8s/charts/opencrane-artifact-preprocessor-0.9.2.tgz b/apps/_infra/deploy-k8s/charts/opencrane-artifact-preprocessor-0.9.2.tgz deleted file mode 100644 index b714996bbe9b01a7f690e22dfe97d8a88ff5743d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2178 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 diff --git a/apps/_infra/deploy-k8s/charts/opencrane-channel-proxy-0.9.2.tgz b/apps/_infra/deploy-k8s/charts/opencrane-channel-proxy-0.9.2.tgz deleted file mode 100644 index 1034c40685425c2115bed7758690932fbf64174f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2178 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 E0E4DKJ^%m! diff --git a/apps/_infra/deploy-k8s/charts/opencrane-cognee-0.8.1.tgz b/apps/_infra/deploy-k8s/charts/opencrane-cognee-0.8.1.tgz deleted file mode 100644 index daa69f90a7df4ef2d4e600bdc0cba3a7f3a6b99e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3779 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 diff --git a/apps/_infra/deploy-k8s/charts/opencrane-litellm-0.8.0.tgz b/apps/_infra/deploy-k8s/charts/opencrane-litellm-0.8.0.tgz deleted file mode 100644 index c918be5a2d0fa7e6ce99cf5f7aa943183b3be999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2621 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 diff --git a/apps/_infra/deploy-k8s/charts/opencrane-obot-0.8.0.tgz b/apps/_infra/deploy-k8s/charts/opencrane-obot-0.8.0.tgz deleted file mode 100644 index a90af8e46c3ef63a34655b812e7a38cd2c902188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4230 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 diff --git a/apps/_infra/deploy-k8s/charts/opencrane-server-0.9.2.tgz b/apps/_infra/deploy-k8s/charts/opencrane-server-0.9.2.tgz deleted file mode 100644 index 0c41c58438aed20e7526b205e3da4fa8f868cbde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9910 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 o|6@G0`~ReF|3Ce_|35#UpU=Dc zVQyr3R8em|NM&qo0PI-NZ`-yL&a?iCgOCUNhf1MTrAY<+P!!t`Y(R^xDf(h$08O23 z))L8(lv~a5|2|N%9m|dyZ^;t0@IBZfbtJ#z@%wa=R4ACH0s}MUc^=TxPNe2yeDc$T zY8zIx$d4Xqgb?y7N$P(>$o4;p&yu6)G)^LtB;+MIBGIe(G&%zE(1rK0(pajG$b;9~ z4(>ZKs`w|=hD(vcEcU2U>m~`$L*iv{D}^agrE<=wTi=_tp*{EB{Rr00 z{~66oG>;(w_wxTV+UEZ$i4XjL3ahjJc9rzh18}r7in4EV6TqOJafWXhlclilYc6kj z1sRTLnOhIwx|Ei>*#VTyObUKP{JQyB4mX=jl_~gf(TXpr{9Q*A_`q0Dc zRu_aHFh^=Ie1E&t3eSl09Q-!ejiE(pEDRAS%xKQDTUCRM8_NZ=Fw(LBJHcAYQ2Xnt zQDmE83v{S<^=`TPuHO0I26@L!E3^&`ex=NINh$CQh2^&DM!S=R-XIEIU)@Bcf9ylg z%1c`(_IMW7svJ5&?%%Vqx1MXPL$qHI1w=qa1`&BgMDCfeA0p@Zc!&n>WWH&Bi<{^s z?!d=XxgR{H$~8JA4Yz!TH8>$*tdUyOU?)^S3`}Y?4?_Ho-wdK4xw_yTu$#x}e#jf& z{lF&|d>44@#Uk>iTx2P%dF&NvX-1oxpm`CP&)ei*EIfdm4ly@P;XsuNr{xf}K#L~i z@
13B6#R5~1)ER+-|>`slcDoFx^tkm3ATO(17q;|ECMq@Q+7Bephg1f`JY%#kt z#ybR{4tAsRdZx{wrIm#P)sEz&oT5l!M011P(SKN$34gc)bVu;plIFO3Z`4L1b5l&H z&Nl1E#&tuMZt5Cyxl;f&?i05}ICP9@kEms1YlOz@5{)%sU4m|UI~I32uS(QS|0Q>} zhUC29d(OUe-EZ#gdzV^rkRyExc_!cZKw0TX+3m@UgBxyO|h7`KJ4!R00960UE3Fy02}}SR}CvG diff --git a/apps/_infra/deploy-k8s/charts/opencrane-tool-runner-0.8.0.tgz b/apps/_infra/deploy-k8s/charts/opencrane-tool-runner-0.8.0.tgz deleted file mode 100644 index 4390d3476013d2e90f2a0ebb8feb5c49f4284317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmV-l1fcsLiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PI*zZ{s!)%~`)=j}=fXina(^U>9w&*o%<@G&Od( zkw}K5yislc_kxl?WXG;k#7MA(=3txDkn@J*dm2+J6iicrft4}~bRh)llb`RXwqZ&0 z?C1bS2qEXaUiD1~+59H)`RP$~7WX33>ycA(M541^ba4da5W)9ZVJy{0vPr_rka#H?rn$0J*Dt6tS>`BgAVpRJbLRwxQUfE1>K7u=7@VgwC&=WMr1h$?%&z1@kph{(&Q5V)5uOoWvCHr65cK(lP zR-ieQ0PN*|e6h*@^Ru&-|F2Zu_ex#P&f&W*Z27i;_{cWco%zyo`=<0qr_SYxrLI)q# zx*)v945`8J(<;;g&yeyA{1wo~u)Hu91_%_!G~?+?(IDl;dU{$#RF?%B)($mjqwQLjY4FHBa^w30)<_xMi#|KV2~A>+j3(RilNl5&e3SB=FDR11wpVqwVO2t@62xt z(W^uoRn;3T1TC!09ia6rKFfO)2@GjwaChd{^Vk2M?%-@myeV6br+c$C3Yi;zM|Ik) z5Np?l{7kDVa=tWX4&!XLsf=l^{h?K6{sxOm8qlW~EMG zGOK!Atk0!FlR)49O^h@e_$~tC8Zr#@P4&KZ>Kx`akZq_kXWq6A!?56>)XtI~N^40l(UJ|DAhm<V9fAM= diff --git a/apps/_infra/deploy-k8s/charts/opencrane-ui-0.9.2.tgz b/apps/_infra/deploy-k8s/charts/opencrane-ui-0.9.2.tgz deleted file mode 100644 index e0fc803b5bb25b64b8c88653317047f1365e1b78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183 zcmV;Q1Yr9giwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PI@tYU4%__h&uDp!T4pXIYZ}Tez*|E|%!68AvFH*d_Grt|pZ)YT;G|I>@iS3kkE*H#@w_=HC zJtchK_XoXRe)WBS|LTXmekAlu%^;KdFk|h|o2@@?CAqYM-%&cIh4A27M zH;wW#ODkY;!X>w4SY`qypmr z%M&(782tp=a7i<8-`LR`>w@=*i4?6DDM?0&v0xG>ntAzr&!AS8lQOG&CK8+PeDT>m zlVd(dOZ(i))P8D%hGIH%^U#1rYLM?2Otm9p^@#B%*0w$GAjO+I1Ta%kqxk7P%Bg;I7w&+%_9`e|($@F;;>{tJ-|o%1ZAhmjhT6 zg#Q@`do&6`SoNfpAzQUyL}EdtD+8s#jg_I={aG|i9-)`nuX_9jCd7zGSuX_BRK^0~ z-@pF>sj|!gl*_l-{nan|CDoP;vIO3bKS0EUu<)Inb9oICmuM<>wNclr&zf0__DAS2 z&EW^=%o*WVwgP4lj7kY(n6C0Jjmx<~YcoFtwBYu3f8Tp0%YrXaqP1hArdW+t7NcKr z?*Rd5MvD=27RUrG{@fqTV|Nf;E;(@~u28Vm1S2J5JA!^?iblip6yFX8erePoi}^FL z?AEdDS4diwnh5QKGkUl3AeW1JwAq}{C?D(piu8SS^LKy$7i9N){a?^)`oFW_X#aPU z0PaDXv+Hms+Zivuz1hBcUW(Kbnh)cH?&XAb;6z51YIH{x(x(+2VrGsszCF)MCq_m8 z37>CY({0E10?%)gYWv=W=X-xxB~Q+=`@a7KVX&|NUJx|;KL^$hfIBlP$-n*Gh}<24 znHt3(f_cn{tuh_|0+/dev/null + helm dependency update --skip-refresh "$_CURRENT_CHART_SOURCES_DIR" >/dev/null ); then cleanup_current_chart_sources return 1 diff --git a/apps/_infra/deploy-k8s/platform/tests/current-chart-sources-contract.sh b/apps/_infra/deploy-k8s/platform/tests/current-chart-sources-contract.sh index be283241e..572b5ebad 100644 --- a/apps/_infra/deploy-k8s/platform/tests/current-chart-sources-contract.sh +++ b/apps/_infra/deploy-k8s/platform/tests/current-chart-sources-contract.sh @@ -35,7 +35,7 @@ helm() prepare_current_chart_sources prepared_chart="$(current_chart_sources_dir)" [[ "$prepared_chart" != "$AMBIENT_DIR" ]] -grep -Fq 'dependency build --skip-refresh' "$CALLS" +grep -Fq 'dependency update --skip-refresh' "$CALLS" [[ -L "$prepared_chart/../../opencrane" ]] cleanup_current_chart_sources [[ -f "$AMBIENT_FIXTURE/must-survive" ]] diff --git a/apps/_infra/deploy-k8s/platform/tests/post-deploy-health-contract.sh b/apps/_infra/deploy-k8s/platform/tests/post-deploy-health-contract.sh index aea63fa63..62063602f 100644 --- a/apps/_infra/deploy-k8s/platform/tests/post-deploy-health-contract.sh +++ b/apps/_infra/deploy-k8s/platform/tests/post-deploy-health-contract.sh @@ -4,20 +4,14 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)" DEPLOY_SCRIPT="$ROOT_DIR/apps/_infra/deploy-k8s/platform/k8s-deploy.sh" VERIFY_SCRIPT="$ROOT_DIR/apps/_infra/deploy-k8s/platform/post-deploy-verify.sh" -CHART_DIR="$ROOT_DIR/apps/_infra/deploy-k8s" -CHART_FIXTURE="$(mktemp -d)" -trap 'rm -rf "$CHART_FIXTURE"' EXIT - grep -Fq 'source "$POST_DEPLOY_VERIFY"' "$DEPLOY_SCRIPT" source "$VERIFY_SCRIPT" -# Render against the current app-owned server chart, not the potentially stale committed archive. -cp -R "$CHART_DIR/." "$CHART_FIXTURE" -helm package "$ROOT_DIR/apps/opencrane/helm" --destination "$CHART_FIXTURE/charts" >/dev/null -rm -f "$CHART_FIXTURE/charts/opencrane-ui-"*.tgz -helm package "$ROOT_DIR/apps/opencrane-ui/helm" --destination "$CHART_FIXTURE/charts" >/dev/null -helm package "$ROOT_DIR/apps/channel-proxy/helm" --destination "$CHART_FIXTURE/charts" >/dev/null -helm package "$ROOT_DIR/apps/memory-gateway/helm" --destination "$CHART_FIXTURE/charts" >/dev/null +# The shared fixture packages every current app-owned chart source, the same way deploy.sh does. +source "$ROOT_DIR/apps/_infra/deploy-k8s/platform/current-chart-sources.sh" +prepare_current_chart_sources +trap 'cleanup_current_chart_sources' EXIT +CHART_FIXTURE="$(current_chart_sources_dir)" rendered_ingress="$(helm template opencrane-silo "$CHART_FIXTURE" \ --set-string 'memoryGateway.kubernetesApiServerCidrs[0]=10.43.0.1/32' \ --set-string 'memoryGateway.kubernetesApiServerEndpointCidrs[0]=172.18.0.2/32' \ diff --git a/docs/agents/versioning.md b/docs/agents/versioning.md index 0041a2fb3..252557938 100644 --- a/docs/agents/versioning.md +++ b/docs/agents/versioning.md @@ -66,9 +66,12 @@ introduced chart has no predecessor and therefore no transition. A migration con shape once and emits only the current shape; do not retain compatibility aliases in templates or values. -The umbrella chart pins each local dependency to its owning chart version. Regenerate and review -`Chart.lock` and packaged dependencies after a chart stamp changes. PostgreSQL's chart version tracks -the OpenCrane wrapper; its `appVersion` remains the pinned PostgreSQL engine major. +The umbrella chart declares each local dependency with an open version constraint: every +dependency is an in-repo `file://` chart, so the checked-out commit is the version authority and +`helm dependency update` packages the sources fresh at render time. There is no `Chart.lock` or +vendored archive to keep in step — a chart stamp needs no umbrella edit at all. The release gate +still fails when a chart-bearing application is not declared in the umbrella. PostgreSQL's chart +version tracks the OpenCrane wrapper; its `appVersion` remains the pinned PostgreSQL engine major. ## Database migrations diff --git a/docs/ci-and-deploy.md b/docs/ci-and-deploy.md index c4acdaeb9..4b41d754f 100644 --- a/docs/ci-and-deploy.md +++ b/docs/ci-and-deploy.md @@ -112,7 +112,7 @@ apply` against a live cluster: ```mermaid flowchart TD A[apps/_infra/deploy-k8s/deploy.sh\nsilo profile: flags, presets] --> B[platform/k8s-deploy.sh\nthe install engine] - B --> C[current-chart-sources.sh\nhelm dependency build\nfrom Chart.lock] + B --> C[current-chart-sources.sh\npackages the in-repo\nsubchart sources] B --> D[database-migration-orchestrator.sh\nCNPG cluster, databases,\nmigration + privileges Jobs] B --> E[umbrella helm upgrade\nall app subcharts] E --> F[database-release-finalization.sh\ncredential-checksum roll,\nrollout waits, cert wait] @@ -140,10 +140,12 @@ flowchart TD - **CI green first.** Confirm the `docker.yml` run for the exact SHA is green before deploying; the deploy scripts pull published images and never build them. -- **`helm dependency build`, never `dependency update`, on the deploy path.** The engine resolves - subcharts from `Chart.lock` for reproducibility. `dependency update` re-resolves and can drift. - (Regenerating the lock/archives after a chart stamp is the one place `dependency update` is - correct — review the diff.) +- **Subchart packaging is derived, never committed.** Every umbrella dependency is an in-repo + `file://` chart, so the checked-out commit is the version authority: the deploy fixture runs + `helm dependency update --skip-refresh` and packages the current sources. There is no + `Chart.lock` or vendored archive to regenerate, and a chart version bump needs no umbrella + edit. (The bootstrap prerequisites are the opposite case: external charts stay pinned by + version and digest.) - **A green `helm template`/CI render does not prove a live `helm upgrade` works.** Stateful services need their PVC semantics, reconcile-retry, and Secret-change pod-roll trigger checked before deploying — see the live-upgrade checklist in the deploy ledger. @@ -177,8 +179,8 @@ summary. `appVersion` where a chart exists. Version-only mirror edits are "stamp-only" and do not count as changes themselves. - A **changed chart** bumps its chart version to the root version and adds exactly one - `helm/migrations/-to-.json` transition; the umbrella's `Chart.lock` and packaged - archives are then regenerated and reviewed. + `helm/migrations/-to-.json` transition. The umbrella needs no edit: it declares its + in-repo dependencies with open constraints and packages them fresh at render time. - A **database schema change** updates the clean target baseline and adds one adjacent, reviewed SQL transition under `apps/opencrane/prisma/migrations/-to-/`, bound by digest. - Adjacent minor trains (`0.8.x → 0.9.0`) are the only automatic transition. Patch, skipped-minor, diff --git a/scripts/__tests__/release-versioning-check.test.mjs b/scripts/__tests__/release-versioning-check.test.mjs index 5736b867b..fc49a046a 100644 --- a/scripts/__tests__/release-versioning-check.test.mjs +++ b/scripts/__tests__/release-versioning-check.test.mjs @@ -365,7 +365,7 @@ test("rejects stale chart application metadata for a directly adapted app", asyn assert.ok(errors.some((error) => error.includes("directly adapted but chart appVersion"))); }); -test("rejects a checked-in dependency archive that differs from chart source", async () => +test("requires the umbrella to declare every chart-bearing application", async () => { const root = mkdtempSync(join(tmpdir(), "opencrane-release-packaging-")); mkdirSync(join(root, "apps/example/helm/templates"), { recursive: true }); @@ -380,7 +380,7 @@ test("rejects a checked-in dependency archive that differs from chart source", a writeFileSync(join(root, "apps/example/helm/Chart.yaml"), "apiVersion: v2\nname: example\ntype: application\nversion: 0.7.0\nappVersion: \"0.7.0\"\n"); writeFileSync(join(root, "apps/example/helm/values.yaml"), "replicas: 1\n"); writeFileSync(join(root, "apps/example/helm/templates/configmap.yaml"), "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: example\n"); - writeFileSync(join(root, "apps/_infra/deploy-k8s/Chart.yaml"), [ + const declaredUmbrella = [ "apiVersion: v2", "name: umbrella", "type: application", @@ -388,15 +388,11 @@ test("rejects a checked-in dependency archive that differs from chart source", a "appVersion: \"0.7.0\"", "dependencies:", " - name: example", - " version: 0.7.0", + " version: \">=0.0.0-0\"", " repository: file://../../example/helm", "", - ].join("\n")); - const dependencyResult = spawnSync("helm", ["dependency", "update", "apps/_infra/deploy-k8s"], { - cwd: root, - encoding: "utf8", - }); - assert.equal(dependencyResult.status, 0, dependencyResult.stderr); + ].join("\n"); + writeFileSync(join(root, "apps/_infra/deploy-k8s/Chart.yaml"), declaredUmbrella); const baselinePath = join(root, "apps/opencrane/prisma/bootstrap/target-baseline.sql"); writeFileSync(baselinePath, "SELECT 1;\n"); _WriteJson(join(root, "releases/0.7.0.json"), { @@ -413,15 +409,18 @@ test("rejects a checked-in dependency archive that differs from chart source", a example: { root: "apps/example", adaptedVersion: "0.7.0", chartVersion: "0.7.0" }, }, }); - writeFileSync(join(root, "apps/example/helm/values.yaml"), "replicas: 2\n"); const graph = { nodes: { "deploy-k8s": { data: { projectType: "application", root: "apps/_infra/deploy-k8s", metadata: { release: { adaptedVersion: "0.7.0" } } } }, example: { data: { projectType: "application", root: "apps/example", metadata: { release: { adaptedVersion: "0.7.0" } } } }, }, }; - const errors = await validateWorkspace(root, [], graph); - assert.ok(errors.some((error) => error.includes("differs from source"))); + // A declared dependency needs no lock file or vendored archive: the in-repo sources are the + // version authority and packaging is derived at render time. + assert.deepEqual(await validateWorkspace(root, [], graph), []); + writeFileSync(join(root, "apps/_infra/deploy-k8s/Chart.yaml"), declaredUmbrella.replace(/dependencies:[\s\S]*$/u, "")); + const missing = await validateWorkspace(root, [], graph); + assert.ok(missing.some((error) => error.includes("does not declare dependency example"))); }); test("rejects baseline changes inside an already adopted train", async () => diff --git a/scripts/release-versioning/chart-validation.mjs b/scripts/release-versioning/chart-validation.mjs index 33b6abbee..e0e7fcf1d 100644 --- a/scripts/release-versioning/chart-validation.mjs +++ b/scripts/release-versioning/chart-validation.mjs @@ -1,8 +1,5 @@ -import { execFileSync } from "node:child_process"; -import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs"; -import { tmpdir } from "node:os"; +import { existsSync, readFileSync } from "node:fs"; import { join, relative } from "node:path"; -import { gunzipSync } from "node:zlib"; /** Read an optional app package version mirror. */ export function packageVersion(repositoryRoot, projectRoot) @@ -49,71 +46,6 @@ function _DependencyVersions(path) return versions; } -function _PackagedChartFiles(path) -{ - const archive = gunzipSync(readFileSync(path)); - const files = new Map(); - let offset = 0; - while (offset + 512 <= archive.length) - { - const header = archive.subarray(offset, offset + 512); - if (header.every((byte) => byte === 0)) break; - const name = header.subarray(0, 100).toString("utf8").replace(/\0.*$/u, ""); - const prefix = header.subarray(345, 500).toString("utf8").replace(/\0.*$/u, ""); - const fullName = prefix ? `${prefix}/${name}` : name; - const sizeText = header.subarray(124, 136).toString("utf8").replace(/\0.*$/u, "").trim(); - const size = Number.parseInt(sizeText || "0", 8); - if (!Number.isFinite(size)) throw new Error(`invalid tar entry size in '${path}'`); - const type = header.subarray(156, 157).toString("utf8"); - const relativeName = fullName.split("/").slice(1).join("/"); - if ((type === "" || type === "0") && relativeName) - files.set(relativeName, archive.subarray(offset + 512, offset + 512 + size)); - offset += 512 + Math.ceil(size / 512) * 512; - } - return files; -} - -function _ValidatePackagedChart(sourceRoot, packagePath, chartName, chartVersion, errors) -{ - if (!existsSync(packagePath)) return; - const temporaryRoot = mkdtempSync(join(tmpdir(), "opencrane-chart-package-")); - try - { - execFileSync("helm", ["package", sourceRoot, "--destination", temporaryRoot], { stdio: "ignore" }); - const generatedPath = join(temporaryRoot, `${chartName}-${chartVersion}.tgz`); - if (!existsSync(generatedPath)) - { - errors.push(`Helm packaged '${chartName}' under an unexpected name or version`); - return; - } - const expected = _PackagedChartFiles(generatedPath); - const actual = _PackagedChartFiles(packagePath); - const expectedNames = [...expected.keys()].sort(); - const actualNames = [...actual.keys()].sort(); - if (JSON.stringify(expectedNames) !== JSON.stringify(actualNames)) - { - errors.push(`packaged dependency ${chartName}-${chartVersion}.tgz file list differs from its chart source`); - return; - } - for (const name of expectedNames) - { - if (!expected.get(name).equals(actual.get(name))) - { - errors.push(`packaged dependency ${chartName}-${chartVersion}.tgz differs from source at '${name}'`); - return; - } - } - } - catch (error) - { - errors.push(`could not verify packaged dependency ${chartName}-${chartVersion}.tgz: ${error.message}`); - } - finally - { - rmSync(temporaryRoot, { recursive: true, force: true }); - } -} - /** Validate one declared chart transition. Only executable kinds may be admitted. */ export function validateHelmTransition(path, displayPath, fromVersion, toVersion, errors) { @@ -133,24 +65,31 @@ export function validateHelmTransition(path, displayPath, fromVersion, toVersion errors.push(`Helm transition '${displayPath}' must be a reviewed noop; executable value migrations require an implemented deploy consumer`); } -/** Verify umbrella pins, packages, and platform transition against app chart sources. */ +/** + * Verify the umbrella declares every chart-bearing app and the platform transition exists. + * + * Versions are deliberately not compared: every dependency is an in-repo file:// chart, so + * the checked-out commit already fixes the exact sources, the umbrella declares open + * constraints, and packaging is derived at render time. Only membership can drift — an app + * chart that falls out of the umbrella would silently stop deploying. + */ export function validateUmbrella(repositoryRoot, manifest, previousManifest, errors) { const umbrellaRoot = manifest.projects["deploy-k8s"]?.root; if (!umbrellaRoot) return; - const expected = new Map(); + const expected = new Set(); for (const project of Object.values(manifest.projects)) { if (!project.chartVersion || project.root === umbrellaRoot || project.root === "apps/postgres") continue; const chart = chartValues(repositoryRoot, project); - if (chart?.name) expected.set(chart.name, { root: join(repositoryRoot, project.root, "helm"), version: project.chartVersion }); + if (chart?.name) expected.add(chart.name); } const platformChart = chartValues(repositoryRoot, { root: `${umbrellaRoot}/platform` }); if (platformChart?.name) { if (platformChart.version !== manifest.projects["deploy-k8s"].chartVersion) errors.push(`k8s-platform chart version '${platformChart.version}' must track its deploy-k8s owner`); - expected.set(platformChart.name, { root: join(repositoryRoot, umbrellaRoot, "platform"), version: platformChart.version }); + expected.add(platformChart.name); const previousVersion = previousManifest?.projects?.["deploy-k8s"]?.chartVersion; if (previousVersion && previousVersion !== platformChart.version) { @@ -160,14 +99,8 @@ export function validateUmbrella(repositoryRoot, manifest, previousManifest, err } } const chartDependencies = _DependencyVersions(join(repositoryRoot, umbrellaRoot, "Chart.yaml")); - const lockDependencies = _DependencyVersions(join(repositoryRoot, umbrellaRoot, "Chart.lock")); - for (const [name, expectedChart] of expected) + for (const name of expected) { - const { root, version } = expectedChart; - if (chartDependencies.get(name) !== version) errors.push(`umbrella dependency ${name} does not pin chart version ${version}`); - if (lockDependencies.get(name) !== version) errors.push(`Chart.lock dependency ${name} does not pin chart version ${version}`); - const packagePath = join(repositoryRoot, umbrellaRoot, "charts", `${name}-${version}.tgz`); - if (!existsSync(packagePath)) errors.push(`packaged dependency ${name}-${version}.tgz is missing`); - else _ValidatePackagedChart(root, packagePath, name, version, errors); + if (!chartDependencies.has(name)) errors.push(`umbrella Chart.yaml does not declare dependency ${name}`); } } diff --git a/website/contributing/deploying.md b/website/contributing/deploying.md index ab4d163e8..016a99e05 100644 --- a/website/contributing/deploying.md +++ b/website/contributing/deploying.md @@ -22,7 +22,7 @@ platform/k8s-deploy.sh the install engine │ ├──→ current-chart-sources.sh - │ helm dependency build from Chart.lock + │ packages the in-repo subchart sources │ ├──→ database-migration-orchestrator.sh │ CNPG cluster, databases, migration + privileges Jobs @@ -66,11 +66,11 @@ Confirm the `docker.yml` run for the exact SHA is green before deploying. The de published images and never build them — see [The CI pipeline](/contributing/ci-pipeline). ::: -::: warning `helm dependency build`, never `dependency update`, on the deploy path -The engine resolves subcharts from `Chart.lock` for reproducibility. `dependency update` -re-resolves and can drift. (Regenerating the lock and archives after a chart version stamp is the -one place `dependency update` is correct — review the diff. See -[Versions and migrations](/contributing/versions-and-migrations).) +::: tip Subchart packaging is derived, never committed +Every umbrella dependency is an in-repo `file://` chart, so the checked-out commit is the version +authority: the deploy fixture packages the current sources with `helm dependency update +--skip-refresh`. There is no `Chart.lock` or vendored archive to keep in step, and a chart +version bump needs no umbrella edit. External bootstrap charts stay pinned by version and digest. ::: ::: warning A green render does not prove a live upgrade works diff --git a/website/contributing/versions-and-migrations.md b/website/contributing/versions-and-migrations.md index 80e5af0cc..d71496a28 100644 --- a/website/contributing/versions-and-migrations.md +++ b/website/contributing/versions-and-migrations.md @@ -5,8 +5,8 @@ Helm charts and a shared database schema. This page covers how a change stamps i how chart and database migrations are recorded, and how CI enforces all of it. > See also: [The CI pipeline](/contributing/ci-pipeline) (where `check:release-versioning` runs), -> [Deploying](/contributing/deploying) (why `helm dependency build`, never `dependency update`, -> matters here), and the full policy in +> [Deploying](/contributing/deploying) (how the umbrella derives its subchart packaging), and the +> full policy in > [`docs/agents/versioning.md`](https://github.com/elewa-git/opencrane/blob/main/docs/agents/versioning.md). ## The repository train and the release manifest @@ -48,10 +48,11 @@ Version-only mirror edits are "stamp-only" and do not count as changes themselve ## Chart migrations A changed chart bumps its chart version to the root version and adds exactly one -`helm/migrations/-to-.json` transition. The umbrella's `Chart.lock` and packaged -archives are then regenerated and reviewed (with `helm dependency build`, never -`dependency update` — see [Deploying](/contributing/deploying)). A newly introduced chart has no -predecessor and therefore no transition. +`helm/migrations/-to-.json` transition. The umbrella needs no edit: it declares its +in-repo dependencies with open constraints and packages them fresh at render time (see +[Deploying](/contributing/deploying)). A newly introduced chart has no predecessor and therefore +no transition, but it must be declared as an umbrella dependency — the release gate fails when a +chart-bearing application is missing there. ## Database migrations From ef2905a11fda3e1476c3595dd16c111cc6e1645a Mon Sep 17 00:00:00 2001 From: Jente Rosseel Date: Wed, 19 Aug 2026 17:47:32 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=90=9B=20package=20umbrella=20subchar?= =?UTF-8?q?ts=20for=20contracts=20that=20render=20the=20checkout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two contracts render the repository chart directory rather than the disposable fixture, so removing the vendored archives left them without a charts/ directory. A shared helper packages the in-repo subcharts on demand; charts/ and Chart.lock are derived and gitignored, so writing them during a contract run is the intended model. --- .../deploy-k8s/platform/current-chart-sources.sh | 11 +++++++++++ .../tests/qualified-release-image-contract.sh | 2 ++ .../platform/tests/silo-deploy-profile-contract.sh | 3 +++ 3 files changed, 16 insertions(+) diff --git a/apps/_infra/deploy-k8s/platform/current-chart-sources.sh b/apps/_infra/deploy-k8s/platform/current-chart-sources.sh index 3edff0051..ae6fe79a4 100644 --- a/apps/_infra/deploy-k8s/platform/current-chart-sources.sh +++ b/apps/_infra/deploy-k8s/platform/current-chart-sources.sh @@ -13,6 +13,17 @@ current_chart_sources_root() cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd } +# Packages the umbrella's subcharts into the checkout itself, for the few contracts that render +# the repository chart directory rather than the disposable fixture. `charts/` and `Chart.lock` +# are derived artifacts (both gitignored), so writing them here is the intended model rather +# than churn. Repeat calls are cheap: Helm reuses archives whose version already matches. +ensure_umbrella_chart_dependencies() +{ + local umbrella + umbrella="$(current_chart_sources_root)/apps/_infra/deploy-k8s" + helm dependency update --skip-refresh "$umbrella" >/dev/null +} + prepare_current_chart_sources() { if [[ -n "$_CURRENT_CHART_SOURCES_FIXTURE" ]]; then diff --git a/apps/_infra/deploy-k8s/platform/tests/qualified-release-image-contract.sh b/apps/_infra/deploy-k8s/platform/tests/qualified-release-image-contract.sh index e2dcd90a7..d8e08d151 100755 --- a/apps/_infra/deploy-k8s/platform/tests/qualified-release-image-contract.sh +++ b/apps/_infra/deploy-k8s/platform/tests/qualified-release-image-contract.sh @@ -7,6 +7,8 @@ DEPLOY_CORE="$ROOT_DIR/apps/_infra/deploy-k8s/platform/k8s-deploy.sh" FINALIZATION="$ROOT_DIR/apps/_infra/deploy-k8s/platform/database-release-finalization.sh" source "$POLICY" +source "$ROOT_DIR/apps/_infra/deploy-k8s/platform/current-chart-sources.sh" +ensure_umbrella_chart_dependencies IMAGE_TAG="sha-f7d6771a4a5a075d424c7678d6165dd71c06b522" CP_TAG="sha-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" diff --git a/apps/_infra/deploy-k8s/platform/tests/silo-deploy-profile-contract.sh b/apps/_infra/deploy-k8s/platform/tests/silo-deploy-profile-contract.sh index 9fb329f8b..9469e707e 100644 --- a/apps/_infra/deploy-k8s/platform/tests/silo-deploy-profile-contract.sh +++ b/apps/_infra/deploy-k8s/platform/tests/silo-deploy-profile-contract.sh @@ -7,6 +7,9 @@ DEVELOP_SMOKE="$ROOT_DIR/apps/_infra/deploy-k8s/platform/tests/develop-smoke.sh" MODEL_HELPER="$ROOT_DIR/apps/_infra/deploy-k8s/platform/initial-model-provider.sh" COGNEE_POLICY="$ROOT_DIR/apps/_infra/cognee/deploy/image-policy.sh" +source "$ROOT_DIR/apps/_infra/deploy-k8s/platform/current-chart-sources.sh" +ensure_umbrella_chart_dependencies + grep -Fq -- '--acme-email' "$DEPLOY_SCRIPT" grep -Fq -- '--first-user-email' "$DEPLOY_SCRIPT" grep -Fq -- '--initial-model-provider' "$DEPLOY_SCRIPT" From 6d4528666a80d60fbed16738a28b4afd94bb2f2a Mon Sep 17 00:00:00 2001 From: Jente Rosseel Date: Wed, 19 Aug 2026 17:55:14 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=90=9B=20recover=20schema=20lineage?= =?UTF-8?q?=20for=20same-schema=20releases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A release that changes no schema resolves to kind=current with no migration, but a live database that reached that schema through a real migration still records the transition, and the privileges Job compares the database against exactly that record. The old fallback re-resolved the transition against the release's own previous version — another same-schema hop that returned null again — so the Job saw no evidence and failed closed. Every same-schema patch was therefore undeployable to an already-migrated silo, which is what blocked testv4 0.9.1 -> 0.9.2. resolveSchemaLineage walks the release chain to the release that owns the migration producing the current schema and returns its recorded evidence. The transition stays current: no migration is proposed, no adjacency policy is relaxed, and the reported history deliberately does not authorise a carry-forward override. --- apps/_infra/deploy-k8s/platform/k8s-deploy.sh | 15 ++--- .../release-versioning-check.test.mjs | 26 ++++++++- .../database-validation.mjs | 55 +++++++++++++++++++ scripts/release-versioning/schema-lineage.mjs | 20 +++++++ 4 files changed, 108 insertions(+), 8 deletions(-) create mode 100755 scripts/release-versioning/schema-lineage.mjs diff --git a/apps/_infra/deploy-k8s/platform/k8s-deploy.sh b/apps/_infra/deploy-k8s/platform/k8s-deploy.sh index 5e4cd4c8b..5fedb9c66 100755 --- a/apps/_infra/deploy-k8s/platform/k8s-deploy.sh +++ b/apps/_infra/deploy-k8s/platform/k8s-deploy.sh @@ -135,6 +135,7 @@ fi POSTGRES_BASELINE_PUBLISHER="$SCRIPT_DIR/../../../postgres/scripts/publish-initdb-baseline-config-map.sh" POSTGRES_MIGRATION_PUBLISHER="$SCRIPT_DIR/../../../postgres/scripts/publish-database-migration-config-map.sh" DATABASE_TRANSITION_RESOLVER="$SCRIPT_DIR/../../../../scripts/release-versioning/database-transition.mjs" +DATABASE_SCHEMA_LINEAGE_RESOLVER="$SCRIPT_DIR/../../../../scripts/release-versioning/schema-lineage.mjs" POSTGRES_MIGRATION_BACKUP="$SCRIPT_DIR/../../../postgres/scripts/create-pre-migration-backup.sh" POSTGRES_BASELINE_FILE="$SCRIPT_DIR/../../../opencrane/prisma/bootstrap/target-baseline.sql" REPOSITORY_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)" @@ -315,13 +316,13 @@ validate_unbacked_database_migration_override DATABASE_TARGET_SCHEMA_VERSION="$(jq -r '.targetSchemaVersion' <<<"$DATABASE_RELEASE_TRANSITION")" DATABASE_TARGET_BASELINE_SHA256="$(jq -r '.targetBaselineSha256' <<<"$DATABASE_RELEASE_TRANSITION")" DATABASE_CONVERGENCE_MIGRATION="$(jq '.migration' <<<"$DATABASE_RELEASE_TRANSITION")" -# A repair retry can name the current release while its database still needs the carried migration evidence. -if [[ "$DATABASE_CONVERGENCE_MIGRATION" == "null" ]]; then - previous_release_version="$(jq -r '.database.carriedForwardFromRepositoryVersion // .previousRepositoryVersion // empty' \ - "$REPOSITORY_ROOT/releases/$RELEASE_VERSION.json")" - if [[ -n "$previous_release_version" ]]; then - DATABASE_CONVERGENCE_MIGRATION="$(node "$DATABASE_TRANSITION_RESOLVER" "$REPOSITORY_ROOT" "$RELEASE_VERSION" "$previous_release_version" | jq '.migration')" - fi +# A release that changes no schema still meets databases that reached this schema through a real +# migration, and privilege reconciliation compares them against exactly that recorded transition. +# Walk the release chain for the migration that produced this schema. The previous form re-resolved +# the transition against this release's own previous version — another same-schema hop that always +# returned null again — so every same-schema patch failed the convergence gate on a migrated silo. +if [[ "$DATABASE_TRANSITION_KIND" == "current" && "$DATABASE_CONVERGENCE_MIGRATION" == "null" ]]; then + DATABASE_CONVERGENCE_MIGRATION="$(node "$DATABASE_SCHEMA_LINEAGE_RESOLVER" "$REPOSITORY_ROOT" "$RELEASE_VERSION")" || exit $? fi kubectl cluster-info >/dev/null 2>&1 || { err "kubectl can't reach a cluster. Point your context at the target cluster first."; exit 1; } KUBERNETES_CONTEXT="$(kubectl config current-context 2>/dev/null || true)" diff --git a/scripts/__tests__/release-versioning-check.test.mjs b/scripts/__tests__/release-versioning-check.test.mjs index fc49a046a..bba99fe4b 100644 --- a/scripts/__tests__/release-versioning-check.test.mjs +++ b/scripts/__tests__/release-versioning-check.test.mjs @@ -9,7 +9,7 @@ import { __SelectDirectReleaseComparisonBase, validateWorkspace, } from "../release-versioning/core.mjs"; -import { resolveDatabaseTransition } from "../release-versioning/database-validation.mjs"; +import { resolveDatabaseTransition, resolveSchemaLineage } from "../release-versioning/database-validation.mjs"; import { isAdjacentMinor, isAdjacentPatch, parseSemver, sha256 } from "../release-versioning/version-utils.mjs"; function _WriteJson(path, value) @@ -496,6 +496,30 @@ test("carries one failed predecessor migration through its immediate repair patc assert.equal(resolveDatabaseTransition(fixture.root, "0.9.1", "0.9.1").kind, "current"); }); +test("recovers the migration that produced the schema for a same-schema release", () => +{ + const fixture = _CarryForwardFixture(); + // 0.9.1 changes no schema of its own, but a live database that reached 0.9.0 through the real + // 0.8.0-to-0.9.0 migration still records it, and privilege reconciliation compares against it. + assert.equal(resolveDatabaseTransition(fixture.root, "0.9.1", "0.9.0").migration, null); + const lineage = resolveSchemaLineage(fixture.root, "0.9.1"); + assert.equal(lineage.id, "0.8.0-to-0.9.0"); + assert.equal(lineage.fromSchemaVersion, "0.8.0"); + assert.equal(lineage.toSchemaVersion, "0.9.0"); + assert.equal(lineage.ownedByReleaseVersion, "0.9.0"); + // Reporting history must not authorise a carry-forward override. + assert.equal(lineage.carriedForwardThroughReleaseVersion, null); + assert.ok(lineage.sqlSha256); + assert.ok(Array.isArray(lineage.sourceProtectedBaselineSha256s)); + assert.ok(lineage.sourceProtectedBaselineSha256s.length > 0); +}); + +test("reports no lineage for a schema that was never migrated into", () => +{ + const fixture = _Fixture(); + assert.equal(resolveSchemaLineage(fixture.root, "0.7.0"), null); +}); + test("rejects undeclared and altered database carry-forward transitions", () => { const undeclared = _CarryForwardFixture(); diff --git a/scripts/release-versioning/database-validation.mjs b/scripts/release-versioning/database-validation.mjs index 058cc1eed..9f960cec2 100644 --- a/scripts/release-versioning/database-validation.mjs +++ b/scripts/release-versioning/database-validation.mjs @@ -225,6 +225,61 @@ export function validateDatabase(repositoryRoot, manifest, previousManifest, cha * Called by: `database-transition.mjs`, which supplies this evidence to the deployment script. * @throws {Error} When either manifest or its database transition is invalid. */ +/** + * Finds the migration that last produced this release's database schema version. + * + * A same-schema patch train resolves to `current` with no migration of its own, but a live database + * that reached this schema through a real migration still records that transition, and privilege + * reconciliation compares the database against exactly that record. Walking the release chain + * recovers the evidence the database already carries; it never proposes a new migration, so the + * transition stays `current`. + * + * Called by: `scripts/release-versioning/schema-lineage.mjs`, which the deploy engine invokes when a + * transition carries no migration. + * @param repositoryRoot - Repository root holding `releases/` and the migration manifests. + * @param releaseVersion - The release being deployed. + * @returns The owning migration's evidence, or null when this schema was never migrated into. + * @see resolveDatabaseTransition + */ +export function resolveSchemaLineage(repositoryRoot, releaseVersion) +{ + const targetPath = join(repositoryRoot, "releases", `${releaseVersion}.json`); + if (!existsSync(targetPath)) throw new Error(`release manifest is missing: ${targetPath}`); + const target = readJson(targetPath); + const schemaVersion = target.database.schemaVersion; + let cursor = target; + while (cursor?.previousRepositoryVersion) + { + const predecessorPath = join(repositoryRoot, "releases", `${cursor.previousRepositoryVersion}.json`); + if (!existsSync(predecessorPath)) + throw new Error(`release manifest is missing: ${predecessorPath}`); + const predecessor = readJson(predecessorPath); + if (cursor.database.schemaVersion === schemaVersion && predecessor.database.schemaVersion !== schemaVersion) + { + const id = `${predecessor.database.schemaVersion}-to-${schemaVersion}`; + const migrationRoot = join(repositoryRoot, "apps/opencrane/prisma/migrations", id); + const migrationManifest = readJson(join(migrationRoot, "manifest.json")); + const sourceProtectedBaselineSha256s = _SourceProtectedBaselineDigests(migrationManifest); + return { + id, + fromSchemaVersion: predecessor.database.schemaVersion, + toSchemaVersion: schemaVersion, + sqlFile: join(migrationRoot, "migration.sql"), + sqlSha256: migrationManifest.sqlSha256, + sourceTargetBaselineSha256: migrationManifest.sourceTargetBaselineSha256, + sourceProtectedBaselineSha256s, + freshSourceProtectedBaselineSha256: _FreshSourceProtectedBaselineDigest(migrationManifest), + sourceHistoryLineages: _SourceHistoryLineages(repositoryRoot, predecessor, sourceProtectedBaselineSha256s), + // Reporting history, not authorizing a carry-forward override. + carriedForwardThroughReleaseVersion: null, + ownedByReleaseVersion: cursor.repositoryVersion, + }; + } + cursor = predecessor; + } + return null; +} + export function resolveDatabaseTransition(repositoryRoot, releaseVersion, fromReleaseVersion) { const rootVersion = readJson(join(repositoryRoot, "package.json")).version; diff --git a/scripts/release-versioning/schema-lineage.mjs b/scripts/release-versioning/schema-lineage.mjs new file mode 100755 index 000000000..65410f73e --- /dev/null +++ b/scripts/release-versioning/schema-lineage.mjs @@ -0,0 +1,20 @@ +#!/usr/bin/env node +import { resolve } from "node:path"; +import { resolveSchemaLineage } from "./database-validation.mjs"; + +if (process.argv.length !== 4) +{ + console.error("usage: schema-lineage.mjs "); + process.exit(64); +} + +try +{ + const lineage = resolveSchemaLineage(resolve(process.argv[2]), process.argv[3]); + console.log(JSON.stringify(lineage)); +} +catch (error) +{ + console.error(`database schema lineage: ${error.message}`); + process.exit(1); +} From a711b48b2d7456e37a1ff43efa778d6818f7d73c Mon Sep 17 00:00:00 2001 From: Jente Rosseel Date: Wed, 19 Aug 2026 18:09:17 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=E2=9C=85=20classify=20every=20silo=20shape?= =?UTF-8?q?=20a=20same-schema=20release=20deploys=20onto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The lineage resolver hands the deploy engine the owning release's evidence for a release that changes no schema, which routes the current-release path through the live convergence classifier where it used to skip it. Cover both shapes a silo can be in under that evidence: bootstrapped fresh at the current baseline with no history, and migrated into the schema by an earlier release. CI now proves both stay deployable instead of reading incompatible. --- .../migrations/tests/verify-postgres.sh | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/opencrane/prisma/migrations/tests/verify-postgres.sh b/apps/opencrane/prisma/migrations/tests/verify-postgres.sh index 3ea1565a3..0b0956d97 100755 --- a/apps/opencrane/prisma/migrations/tests/verify-postgres.sh +++ b/apps/opencrane/prisma/migrations/tests/verify-postgres.sh @@ -236,6 +236,40 @@ for database in migrated fresh; do done diff --unified "$WORK_DIR/fresh-schema.sql" "$WORK_DIR/migrated-schema.sql" +# A release that changes no schema still ships to silos in both shapes: bootstrapped fresh at the current +# baseline, and migrated into that schema by an earlier release. The deploy engine hands the classifier the +# owning release's evidence from the lineage resolver instead of a migration it must run, so every shape a +# silo can be in has to stay deployable rather than read as incompatible. +CURRENT_RELEASE_VERSION="$(jq -r '.version' "$ROOT/package.json")" +CURRENT_RELEASE_MANIFEST="$ROOT/releases/$CURRENT_RELEASE_VERSION.json" +SCHEMA_LINEAGE="$(node "$ROOT/scripts/release-versioning/schema-lineage.mjs" "$ROOT" "$CURRENT_RELEASE_VERSION")" +POSTGRES_BASELINE_SHA256="$(jq -r '.database.baselineSha256' "$CURRENT_RELEASE_MANIFEST")" +DATABASE_TARGET_BASELINE_SHA256="$POSTGRES_BASELINE_SHA256" +DATABASE_TARGET_SCHEMA_VERSION="$(jq -r '.database.schemaVersion' "$CURRENT_RELEASE_MANIFEST")" +DATABASE_PREVIOUS_MIGRATION_ID="$(jq -r '.id' <<<"$SCHEMA_LINEAGE")" +DATABASE_PREVIOUS_SCHEMA_VERSION="$(jq -r '.fromSchemaVersion' <<<"$SCHEMA_LINEAGE")" +DATABASE_PREVIOUS_TARGET_BASELINE_SHA256="$(jq -r '.sourceTargetBaselineSha256' <<<"$SCHEMA_LINEAGE")" +DATABASE_PREVIOUS_PROTECTED_BASELINE_SHA256S_JSON="$(jq -c '.sourceProtectedBaselineSha256s' <<<"$SCHEMA_LINEAGE")" +DATABASE_PREVIOUS_FRESH_PROTECTED_BASELINE_SHA256="$(jq -r '.freshSourceProtectedBaselineSha256' <<<"$SCHEMA_LINEAGE")" +DATABASE_SOURCE_HISTORY_LINEAGES_JSON="$(jq -c '.sourceHistoryLineages' <<<"$SCHEMA_LINEAGE")" +DATABASE_PREVIOUS_MIGRATION_SQL_SHA256="$(jq -r '.sqlSha256' <<<"$SCHEMA_LINEAGE")" +[[ "$DATABASE_TARGET_SCHEMA_VERSION" == "$(jq -r '.toSchemaVersion' <<<"$SCHEMA_LINEAGE")" ]] + +# A fresh bootstrap records where the database was born and writes no migration history. The postgres +# chart's bootstrap Job owns this row in a real silo. +psql_command fresh </dev/null +CREATE SCHEMA "opencrane_bootstrap"; +CREATE TABLE "opencrane_bootstrap"."target_baseline" ( + "singleton" BOOLEAN PRIMARY KEY DEFAULT TRUE CHECK ("singleton"), + "baseline_sha256" TEXT NOT NULL CHECK ("baseline_sha256" ~ '^[0-9a-f]{64}$') +); +INSERT INTO "opencrane_bootstrap"."target_baseline" ("singleton", "baseline_sha256") +VALUES (TRUE, '$POSTGRES_BASELINE_SHA256'); +SQL +assert_classifier_state fresh "current|$POSTGRES_BASELINE_SHA256" +assert_classifier_state fresh_source "completed|$FRESH_PROTECTED_DIGEST" +assert_classifier_state migrated "completed|$PROTECTED_DIGEST" + psql_command migrated --tuples-only --no-align --command \ 'SELECT count(*) FROM "persona_questions" WHERE "question_set_id" = '\''personal-agent-onboarding'\'' AND "question_set_version" = 1;' \ | grep -qx '10'