diff --git a/app/igneum-app/ui/ui-ota.test.mjs b/app/igneum-app/ui/ui-ota.test.mjs index a19a9747..cde3aa70 100644 --- a/app/igneum-app/ui/ui-ota.test.mjs +++ b/app/igneum-app/ui/ui-ota.test.mjs @@ -19,7 +19,7 @@ test('the embedded interface says built in; an over-the-air one says so with its assert.equal(w.eyebrow, 'over the air'); assert.equal(w.help, 'Built in: 1.0.0.'); assert.equal(V.interfaceWords({}).line, ''); - assert.equal(readFileSync(join(here, 'VERSION'), 'utf8').trim(), '1.0.0', 'the embedded interface version is three-part and in ui/VERSION'); + assert.equal(readFileSync(join(here, 'VERSION'), 'utf8').trim(), '1.0.2', 'the embedded interface version is three-part and in ui/VERSION (1.0.2: the 0.3.22 tree, 7 October 2026)'); }); test('the help line says what is pending, refused, held back by the switch, or skipped', () => { diff --git a/packaging/ota/publish-manifest.sh b/packaging/ota/publish-manifest.sh index 811422a0..cd4d4499 100755 --- a/packaging/ota/publish-manifest.sh +++ b/packaging/ota/publish-manifest.sh @@ -67,6 +67,7 @@ while [ $# -gt 0 ]; do --drivers) DRIVERS_FILE="$2"; shift 2 ;; --no-drivers) NO_DRIVERS=1; shift ;; --ui) UI_FILE="$2"; shift 2 ;; + --ui-pair-override) UI_PAIR_OVERRIDE="$2"; shift 2 ;; # ship an interface from another UI tree knowingly, with the reason logged (7 Oct 2026: 1.0.2 to 0.3.21 apps) --no-ui) NO_UI=1; shift ;; --base-url) BASE="$2"; shift 2 ;; --dest) DEST="$2"; shift 2 ;; @@ -290,7 +291,10 @@ open(out, "w").write(json.dumps(m, sort_keys=True, separators=(",", ":"), ensure PY # the version pair (7 October 2026): the interface bundle and every app entry must come from one UI tree; a carried-over # ui object against a newer tree, or an entry without its interface version, refuses the publish here -node "$ROOT/tools/ui-ota/pair-check.mjs" "$NEW" || { echo "refused: the manifest's interface and its app entries are not one UI tree (tools/ui-ota/pair-check.mjs); cut the interface from this tree with tools/ui-ota/publish.mjs --version $UI_TREE_VERSION, or --no-ui" >&2; exit 2; } +if ! node "$ROOT/tools/ui-ota/pair-check.mjs" "$NEW"; then + if [ -n "${UI_PAIR_OVERRIDE:-}" ]; then echo "the interface is not from this manifest's UI tree; published anyway on --ui-pair-override: $UI_PAIR_OVERRIDE" >&2 + else echo "refused: the manifest's interface and its app entries are not one UI tree (tools/ui-ota/pair-check.mjs); cut the interface from this tree with tools/ui-ota/publish.mjs --version $UI_TREE_VERSION, or --no-ui, or say why with --ui-pair-override \"\"" >&2; exit 2; fi +fi "$SIGNER" sign "$KEY" "$NEW" > "$NEW.sig" "$SIGNER" verify "$PUB" "$NEW" "$NEW.sig" mv "$NEW" "$DEST/igneum-app-latest.json"