Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd06d63007 | ||
|
|
49fdd446ef | ||
|
|
c04506ba7b | ||
|
|
c1213dad08 | ||
|
|
ba4821ec63 | ||
|
|
41dbefe552 | ||
|
|
9aa82068f1 |
@@ -3,7 +3,7 @@ name: CI
|
||||
# Signage is a standalone repository: every job installs it with --frozen-lockfile from its own
|
||||
# pnpm-lock.yaml and takes Ekklesia's module-development packages (@ekklesia/*) from Ekklesia's
|
||||
# public package registry (.npmrc; platform ADRs 0053 and 0054). Only the integration job fetches
|
||||
# Core source: one immutable commit through the pinned Gitea pull ref in ci/platform.env, used as the
|
||||
# Core source: one immutable commit through the pinned Gitea ref in ci/platform.env, used as the
|
||||
# generic deployment harness and image source, never as a workspace dependency.
|
||||
#
|
||||
# The same trust rules as the platform's own CI (docs/development/security.md there):
|
||||
|
||||
@@ -64,6 +64,13 @@ decision gets a new ADR that supersedes the old one; never rewrite a historical
|
||||
with the compatibility boundary explicit. Do not copy platform logic into Signage to avoid it.
|
||||
- Every defect fix gets a regression test. Signage never reads the environment, opens its own socket,
|
||||
builds an Ekklesia URL, or applies a migration; all of that reaches it through the host.
|
||||
- Report what you find. A defect, flaky test, documentation/ADR conflict, or CI problem outside the
|
||||
task at hand gets an issue in the repository it belongs to (here or `Zayin/Ekklesia`), as soon as
|
||||
you find it. Search for an existing issue first; something fixed in the same PR goes in that PR's
|
||||
description instead. Be descriptive: what you saw, the evidence (run and job links, commit, file
|
||||
and line), how to reproduce it, the impact, and options, and never a secret. Label it
|
||||
`found-by-claude` (an agent that cannot apply labels ends the body with a line saying so), leave
|
||||
it unassigned, and list what you filed when you report back.
|
||||
|
||||
## Verification
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ Ekklesia and vendors none of its SDKs.
|
||||
|
||||
## Status
|
||||
|
||||
Version 0.1.4 is feature-complete for its declared scope, and Signage has run in production since
|
||||
Version 0.1.5 is feature-complete for its declared scope, and Signage has run in production since
|
||||
0.1.1. What exists today:
|
||||
|
||||
- The module package, manifest (v8), four capabilities, six permissions, ten operator settings, and
|
||||
|
||||
+2
-2
@@ -40,9 +40,9 @@ check '[[ -n "$own" && -n "$run" ]] && ((own > run)) && ((own > last_step))' \
|
||||
check 'sed -n "${last_step},\$p" <<<"$job" | grep -q "if: always()"' "that last step always runs"
|
||||
check 'grep -q "EKKLESIA_SMOKE_MODULE_RELEASE_DIR" "$root/ci/integration.sh" && grep -q "bash scripts/smoke-deploy.sh" "$root/ci/integration.sh"' \
|
||||
"the integration delegates its external package to the platform smoke"
|
||||
check 'grep -Eq "^EKKLESIA_PLATFORM_REF=refs/(pull/[0-9]+/head|heads/main)$" "$root/ci/platform.env" && grep -Eq "^EKKLESIA_PLATFORM_COMMIT=[0-9a-f]{40}$" "$root/ci/platform.env"' \
|
||||
check 'grep -Eq "^EKKLESIA_PLATFORM_REF=refs/(pull/[0-9]+/head|heads/main|tags/v[0-9]+\.[0-9]+\.[0-9]+)$" "$root/ci/platform.env" && grep -Eq "^EKKLESIA_PLATFORM_COMMIT=[0-9a-f]{40}$" "$root/ci/platform.env"' \
|
||||
"the platform harness is pinned by full ref and commit"
|
||||
check 'grep -q "rev-parse refs/remotes/pinned" "$root/ci/fetch-platform.sh" && grep -q "does not resolve to EKKLESIA_PLATFORM_COMMIT" "$root/ci/fetch-platform.sh"' \
|
||||
check 'grep -qF "rev-parse \"refs/remotes/pinned^{commit}\"" "$root/ci/fetch-platform.sh" && grep -q "does not resolve to EKKLESIA_PLATFORM_COMMIT" "$root/ci/fetch-platform.sh"' \
|
||||
"the fetch verifies that the pinned ref resolves to the pinned commit"
|
||||
|
||||
# Normal CI builds the canonical archive once and hands those exact bytes to integration through a
|
||||
|
||||
@@ -32,7 +32,7 @@ git -C "$out" init --quiet
|
||||
git -C "$out" remote add origin "$repository"
|
||||
git -C "$out" fetch --quiet --no-tags --depth=1 origin "+${ref}:refs/remotes/pinned" ||
|
||||
fail "cannot fetch the pinned platform ref."
|
||||
[[ "$(git -C "$out" rev-parse refs/remotes/pinned)" == "$commit" ]] ||
|
||||
[[ "$(git -C "$out" rev-parse "refs/remotes/pinned^{commit}")" == "$commit" ]] ||
|
||||
fail "the pinned ref does not resolve to EKKLESIA_PLATFORM_COMMIT."
|
||||
git -C "$out" -c advice.detachedHead=false checkout --quiet --detach "$commit"
|
||||
rm -rf "$out/.git"
|
||||
|
||||
+5
-4
@@ -1,5 +1,6 @@
|
||||
# The companion Core harness Signage uses to install and run its real external package. The pull ref
|
||||
# remains reachable after its branch is deleted; the full commit pin makes the checkout immutable.
|
||||
# The companion Core harness Signage uses to install and run its real external package: a released
|
||||
# Core, by its tag. A pull request's ref (refs/pull/N/head) is used only while Signage depends on a
|
||||
# Core change still in review. The full commit pin makes the checkout immutable either way.
|
||||
EKKLESIA_PLATFORM_REPOSITORY=https://git.zayin.net/Zayin/Ekklesia.git
|
||||
EKKLESIA_PLATFORM_REF=refs/pull/92/head
|
||||
EKKLESIA_PLATFORM_COMMIT=5e9433d96b413117374a6132d89400867414c2c8
|
||||
EKKLESIA_PLATFORM_REF=refs/tags/v0.2.5
|
||||
EKKLESIA_PLATFORM_COMMIT=437720f2286e962829f2ec8c1c6137ea24f87b9f
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"id": "signage",
|
||||
"name": "Signage",
|
||||
"description": "Visual programming, timelines, synchronized channels, and display delivery for church screens.",
|
||||
"version": "0.1.4",
|
||||
"version": "0.1.5",
|
||||
"compatibility": {
|
||||
"platform": "^0.2.0",
|
||||
"moduleSdk": "^0.2.0"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@ekklesia/signage",
|
||||
"version": "0.1.4",
|
||||
"version": "0.1.5",
|
||||
"private": true,
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"type": "module",
|
||||
|
||||
@@ -59,7 +59,7 @@ function SignageDisplay({ context }: { readonly context: ModuleUiHostContext }):
|
||||
*/
|
||||
export default defineModuleUi({
|
||||
id: "signage",
|
||||
version: "0.1.4",
|
||||
version: "0.1.5",
|
||||
styles: displayStyles,
|
||||
mount(container, context) {
|
||||
const root = createRoot(container);
|
||||
|
||||
@@ -130,7 +130,7 @@ export function createSignageModuleRuntime(
|
||||
// Database ABI v1 executor, which `createSignageStore` binds Signage's own Drizzle adapter to.
|
||||
database: { abi: 1 },
|
||||
id: "signage",
|
||||
version: "0.1.4",
|
||||
version: "0.1.5",
|
||||
|
||||
register({ capabilities, config, http, realtime }) {
|
||||
const settings = readSignageSettings(config);
|
||||
@@ -192,7 +192,7 @@ export function createSignageModuleRuntime(
|
||||
// server enforces — a UI believing a stale limit would offer an upload the server refuses.
|
||||
return Response.json({
|
||||
crossfadeMs: current.crossfadeMs,
|
||||
moduleVersion: "0.1.4",
|
||||
moduleVersion: "0.1.5",
|
||||
nativeImageDurationMs: current.nativeImageDurationMs,
|
||||
nativePresentation: current.nativePresentation,
|
||||
rendererInputVersion: SIGNAGE_SLIDE_RENDERER_INPUT_VERSION,
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ import ownStyles from "./styles.css";
|
||||
*/
|
||||
export default defineModuleUi({
|
||||
id: "signage",
|
||||
version: "0.1.4",
|
||||
version: "0.1.5",
|
||||
styles: `${EKKLESIA_UI_STYLESHEET}\n${ownStyles}`,
|
||||
mount(container, context) {
|
||||
const root = createRoot(container);
|
||||
|
||||
@@ -117,7 +117,7 @@ export function createFakeHost(options: FakeHostOptions): FakeHost {
|
||||
/** The settings payload every screen loads first. */
|
||||
export const FAKE_SETTINGS = Object.freeze({
|
||||
crossfadeMs: 1000,
|
||||
moduleVersion: "0.1.4",
|
||||
moduleVersion: "0.1.5",
|
||||
nativeImageDurationMs: 7000,
|
||||
nativePresentation: {
|
||||
backgroundColor: "#000000",
|
||||
|
||||
@@ -66,7 +66,7 @@ describe("Signage module manifest", () => {
|
||||
expect(manifest.manifestVersion).toBe(8);
|
||||
expect(manifest.id).toBe("signage");
|
||||
expect(manifest.name).toBe("Signage");
|
||||
expect(manifest.version).toBe("0.1.4");
|
||||
expect(manifest.version).toBe("0.1.5");
|
||||
expect(manifest.compatibility).toEqual({ moduleSdk: "^0.2.0", platform: "^0.2.0" });
|
||||
});
|
||||
|
||||
@@ -151,7 +151,7 @@ describe("Signage module manifest", () => {
|
||||
describe("Signage server runtime", () => {
|
||||
it("exports the typed runtime definition the compiled server entrypoint publishes", async () => {
|
||||
// The runtime's database declaration must match the manifest's, or Core refuses to start it.
|
||||
expect(moduleRuntime).toMatchObject({ database: { abi: 1 }, id: "signage", version: "0.1.4" });
|
||||
expect(moduleRuntime).toMatchObject({ database: { abi: 1 }, id: "signage", version: "0.1.5" });
|
||||
});
|
||||
|
||||
it("registers its routes declaratively, with no database, storage, or realtime work", async () => {
|
||||
@@ -251,7 +251,7 @@ describe("Signage server runtime", () => {
|
||||
expect(response.status).toBe(200);
|
||||
expect(await response.json()).toEqual({
|
||||
crossfadeMs: 400,
|
||||
moduleVersion: "0.1.4",
|
||||
moduleVersion: "0.1.5",
|
||||
nativeImageDurationMs: 12_000,
|
||||
nativePresentation: SIGNAGE_DEFAULT_SETTINGS.nativePresentation,
|
||||
rendererInputVersion: "1.0.0",
|
||||
|
||||
Reference in New Issue
Block a user