openvibers/openvibe.publishing Commits
Bump release metadata to 1.3.0 and fix the AI summary migration notes
Changes
@@@ -3,13 +3,14 @@> Shared publishing packages for the OpenVibe publication products: Wiki, Blog, News, Reviews,> Deals, Coupons and Trade.--**Status:** alpha, **1.2.0**: the stores run on PostgreSQL through the `openvibe-sdk/db` async data++**Status:** alpha, **1.3.0**: the stores run on PostgreSQL through the `openvibe-sdk/db` async datalayer (ADR-035: PostgreSQL 18 behind PgBouncer in production, PGlite in tests). Every store method isasync, takes the product's `openvibe-sdk/db` handle, and accepts the caller's transaction handle; eachstore gives its DDL as `schema(prefix)` for the product's migrations. v1.1.0 adds the shared ingestchassis (`openvibe-publishing/ingest`) and publication glue (`openvibe-publishing/publication`) —additive, no existing export changed. v1.2.0 adds `openvibe-publishing/layout`, the page document the--seven sites render through `openvibe-shared/shell` (additive). The exit proof (`examples/two-products`) runs in `npm test`.++seven sites render through `openvibe-shared/shell` (additive). v1.3.0 forwards the AI summary, facts,++`updated` and `url` through `layout.renderDocument` to the shell (additive). The exit proof (`examples/two-products`) runs in `npm test`.Releases v0.1.0 to v1.0.0 are tagged (see [CHANGELOG.md](CHANGELOG.md)). All seven products (Wiki andBlog, public at openvibe.wiki and openvibe.blog; News, Reviews, Deals, Coupons and Trade, deployedloopback-only, not launched) run v1.0.0 on PostgreSQL today; the five content products move to v1.1.0 as@@@ -76,7 +77,7 @@ Every module is its own entry point and can be used alone.Pin the release tarball, like every OpenVibe package (never a `file:` link or a vendored copy):```json--"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.2.0",++"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.3.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.15.0","pg": "^8.23.0"```@@@ -5,7 +5,7 @@"wave": "W15","kind": "packages","package": "openvibe-publishing",-- "version": "1.2.0",++ "version": "1.3.0","plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)","runtime": null,"port": null,@@@ -44,7 +44,7 @@"openvibe-shared >=1.5.0 (optional peer; tests pin v2.6.0; layout needs >=2.6.0)","PostgreSQL 18 through PgBouncer (the product's database)"],-- "tests": "npm test (Node 22): 19 files, 140 cases; test/postgres.test.js runs on PostgreSQL 18 + PgBouncer when OV_TEST_PG_URL is set (CI starts the containers), else it is listed as skipped",++ "tests": "npm test (Node 22): 19 files, 143 cases; test/postgres.test.js runs on PostgreSQL 18 + PgBouncer when OV_TEST_PG_URL is set (CI starts the containers), else it is listed as skipped","released": true,"deployed": false,"deployment": "none: a package released as git tags; products pin the tag and deploy it with their own releases",@@@ -63,7 +63,7 @@"auto-escaping SSR and a safe Markdown subset","the ingest chassis: the OpenVibe.Sources client, a change cursor + pull loop with per-item savepoint isolation and an {applied|hold|removed} apply contract, a signed event consumer with an exactly-once inbox, the normalisers and PSL/registrable-host and freshness helpers the five content products share","the publication glue: gate → document → sequencer.stamp → events → outbox.enqueue on the caller's transaction handle, tombstones on unpublish/merge, and the IndexNow ping",-- "the page document through openvibe-shared/shell page(): robots and canonical from the gate's decision, article times, prev/next, feeds, app icon, stylesheets, boost marker and the footer init"++ "the page document through openvibe-shared/shell page(): robots and canonical from the gate's decision, article times, prev/next, feeds, app icon, stylesheets, boost marker and the footer init, plus the AI summary (ai-summary meta, WebPage JSON-LD, facts block) when the caller passes summary/facts/updated/url"],"updated": "2026-10-04"}@@@ -53,27 +53,6 @@ The five content products (News, Reviews, Deals, Coupons, Trade) each delete the- **Test:** the product's own suite (`ov test`), including its ingest and publication tests; thePublishing side is `test/ingest.test.js` and `test/publication.test.js`.--## v1.2.0 → v1.3.0----Additive: `layout.renderDocument` forwards the AI summary to the shell. Everything else is unchanged,--and a product that passes none of the four options renders exactly as on v1.2.0.----- **package.json:** `"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.3.0"`.-- `openvibe-shared` stays at v2.6.0 or later (that is where `seo.pageSummary` and the shell's `summary`-- support already live).--- **Lockfile:** copy the `node_modules/openvibe-publishing` entry (`1.3.0`, the matching `resolved`,-- the real `integrity`) from a product already on the tag.--- **What changes in the product:** pass `summary` on the home render (and on any other page that has-- a real one-line summary, e.g. an article or a review), so the `ai-summary` meta lands on the page.-- - `layout.renderDocument({ …, summary, facts, updated, url })` — `summary` is the one-line AI-- summary, `facts` the `[[key, value], string]` (or `[string]`) rows, `updated` the ISO date, `url`-- absolute and defaulting to the canonical.-- - `summary` alone gives `<meta name="ai-summary">` plus a `WebPage` JSON-LD tag; `facts` gives the-- `<noscript><section data-ai-summary>` block; `updated` becomes `dateModified`.-- - **Only pass what the facts support.** A missing rating, price, date or author is left out of the-- facts block, never defaulted — the same rule as every other structured output here.--- **Test:** the product's page/render tests (`ov test`); Publishing's side is `test/layout.test.js`.--## v1.1.0 → v1.2.0Adds `openvibe-publishing/layout`; nothing existing changes. The seven publication sites each hand-wrote@@@ -102,3 +81,25 @@ the page document; `renderDocument` replaces that, composed over `openvibe-share- **Worked example:** OpenVibe.News main, `server/render/layout.js` (`renderPage` builds `nav`,`footer`, `account` and returns `layout.renderDocument({ site: 'news', … })`), landed in News PR #6.- **Test:** the product's page/render tests (`ov test`); Publishing's side is `test/layout.test.js`.++++## v1.2.0 → v1.3.0++++Additive: `layout.renderDocument` forwards the AI summary to the shell. Everything else is unchanged,++and a product that passes none of the four options renders exactly as on v1.2.0.++++- **package.json:** `"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.3.0"`.++ `openvibe-shared` stays at v2.6.0 or later (that is where `seo.pageSummary` and the shell's `summary`++ support already live).++- **Lockfile:** copy the `node_modules/openvibe-publishing` entry (`1.3.0`, the matching `resolved`,++ the real `integrity`) from a product already on the tag.++- **What changes in the product:** pass `summary` on the home render (and on any other page that has++ a real one-line summary, e.g. an article or a review), so the `ai-summary` meta lands on the page.++ - `layout.renderDocument({ …, summary, facts, updated, url })` — `summary` is the one-line AI++ summary, `facts` the `[[key, value], string]` (or `[string]`) rows, `updated` the ISO date, `url`++ absolute and defaulting to the canonical.++ - `summary` alone gives `<meta name="ai-summary">` plus a `WebPage` JSON-LD tag; with `summary`,++ `facts` adds the `<noscript><section data-ai-summary>` block and `updated` becomes `dateModified`.++ Without a `summary`, `facts`, `updated` and `url` emit nothing.++ - **Only pass what the facts support.** A missing rating, price, date or author is left out of the++ facts block, never defaulted — the same rule as every other structured output here.++- **Test:** the product's page/render tests (`ov test`); Publishing's side is `test/layout.test.js`.@@@ -1,12 +1,12 @@{"name": "openvibe-publishing",-- "version": "1.2.0",++ "version": "1.3.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-publishing",-- "version": "1.2.0",++ "version": "1.3.0","license": "MIT","devDependencies": {"@electric-sql/pglite": "^0.5.8",
@@ -3,13 +3,14 @@
@@ -3,13 +3,14 @@
> Shared publishing packages for the OpenVibe publication products: Wiki, Blog, News, Reviews,
> Shared publishing packages for the OpenVibe publication products: Wiki, Blog, News, Reviews,
> Deals, Coupons and Trade.
> Deals, Coupons and Trade.
-**Status:** alpha, **1.2.0**: the stores run on PostgreSQL through the `openvibe-sdk/db` async data
+**Status:** alpha, **1.3.0**: the stores run on PostgreSQL through the `openvibe-sdk/db` async data
layer (ADR-035: PostgreSQL 18 behind PgBouncer in production, PGlite in tests). Every store method is
layer (ADR-035: PostgreSQL 18 behind PgBouncer in production, PGlite in tests). Every store method is
async, takes the product's `openvibe-sdk/db` handle, and accepts the caller's transaction handle; each
async, takes the product's `openvibe-sdk/db` handle, and accepts the caller's transaction handle; each
store gives its DDL as `schema(prefix)` for the product's migrations. v1.1.0 adds the shared ingest
store gives its DDL as `schema(prefix)` for the product's migrations. v1.1.0 adds the shared ingest
chassis (`openvibe-publishing/ingest`) and publication glue (`openvibe-publishing/publication`) —
chassis (`openvibe-publishing/ingest`) and publication glue (`openvibe-publishing/publication`) —
additive, no existing export changed. v1.2.0 adds `openvibe-publishing/layout`, the page document the
additive, no existing export changed. v1.2.0 adds `openvibe-publishing/layout`, the page document the
-seven sites render through `openvibe-shared/shell` (additive). The exit proof (`examples/two-products`) runs in `npm test`.
+seven sites render through `openvibe-shared/shell` (additive). v1.3.0 forwards the AI summary, facts,
+`updated` and `url` through `layout.renderDocument` to the shell (additive). The exit proof (`examples/two-products`) runs in `npm test`.
Releases v0.1.0 to v1.0.0 are tagged (see [CHANGELOG.md](CHANGELOG.md)). All seven products (Wiki and
Releases v0.1.0 to v1.0.0 are tagged (see [CHANGELOG.md](CHANGELOG.md)). All seven products (Wiki and
Blog, public at openvibe.wiki and openvibe.blog; News, Reviews, Deals, Coupons and Trade, deployed
Blog, public at openvibe.wiki and openvibe.blog; News, Reviews, Deals, Coupons and Trade, deployed
loopback-only, not launched) run v1.0.0 on PostgreSQL today; the five content products move to v1.1.0 as
loopback-only, not launched) run v1.0.0 on PostgreSQL today; the five content products move to v1.1.0 as
@@ -76,7 +77,7 @@ Every module is its own entry point and can be used alone.
@@ -76,7 +77,7 @@ Every module is its own entry point and can be used alone.
Pin the release tarball, like every OpenVibe package (never a `file:` link or a vendored copy):
Pin the release tarball, like every OpenVibe package (never a `file:` link or a vendored copy):
```json
```json
-"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.2.0",
+"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.3.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.15.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.15.0",
"pg": "^8.23.0"
"pg": "^8.23.0"
```
```
@@ -5,7 +5,7 @@
@@ -5,7 +5,7 @@
"wave": "W15",
"wave": "W15",
"kind": "packages",
"kind": "packages",
"package": "openvibe-publishing",
"package": "openvibe-publishing",
- "version": "1.2.0",
+ "version": "1.3.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"runtime": null,
"runtime": null,
"port": null,
"port": null,
@@ -44,7 +44,7 @@
@@ -44,7 +44,7 @@
"openvibe-shared >=1.5.0 (optional peer; tests pin v2.6.0; layout needs >=2.6.0)",
"openvibe-shared >=1.5.0 (optional peer; tests pin v2.6.0; layout needs >=2.6.0)",
"PostgreSQL 18 through PgBouncer (the product's database)"
"PostgreSQL 18 through PgBouncer (the product's database)"
],
],
- "tests": "npm test (Node 22): 19 files, 140 cases; test/postgres.test.js runs on PostgreSQL 18 + PgBouncer when OV_TEST_PG_URL is set (CI starts the containers), else it is listed as skipped",
+ "tests": "npm test (Node 22): 19 files, 143 cases; test/postgres.test.js runs on PostgreSQL 18 + PgBouncer when OV_TEST_PG_URL is set (CI starts the containers), else it is listed as skipped",
"released": true,
"released": true,
"deployed": false,
"deployed": false,
"deployment": "none: a package released as git tags; products pin the tag and deploy it with their own releases",
"deployment": "none: a package released as git tags; products pin the tag and deploy it with their own releases",
@@ -63,7 +63,7 @@
@@ -63,7 +63,7 @@
"auto-escaping SSR and a safe Markdown subset",
"auto-escaping SSR and a safe Markdown subset",
"the ingest chassis: the OpenVibe.Sources client, a change cursor + pull loop with per-item savepoint isolation and an {applied|hold|removed} apply contract, a signed event consumer with an exactly-once inbox, the normalisers and PSL/registrable-host and freshness helpers the five content products share",
"the ingest chassis: the OpenVibe.Sources client, a change cursor + pull loop with per-item savepoint isolation and an {applied|hold|removed} apply contract, a signed event consumer with an exactly-once inbox, the normalisers and PSL/registrable-host and freshness helpers the five content products share",
"the publication glue: gate → document → sequencer.stamp → events → outbox.enqueue on the caller's transaction handle, tombstones on unpublish/merge, and the IndexNow ping",
"the publication glue: gate → document → sequencer.stamp → events → outbox.enqueue on the caller's transaction handle, tombstones on unpublish/merge, and the IndexNow ping",
- "the page document through openvibe-shared/shell page(): robots and canonical from the gate's decision, article times, prev/next, feeds, app icon, stylesheets, boost marker and the footer init"
+ "the page document through openvibe-shared/shell page(): robots and canonical from the gate's decision, article times, prev/next, feeds, app icon, stylesheets, boost marker and the footer init, plus the AI summary (ai-summary meta, WebPage JSON-LD, facts block) when the caller passes summary/facts/updated/url"
],
],
"updated": "2026-10-04"
"updated": "2026-10-04"
}
}
@@ -53,27 +53,6 @@ The five content products (News, Reviews, Deals, Coupons, Trade) each delete the
@@ -53,27 +53,6 @@ The five content products (News, Reviews, Deals, Coupons, Trade) each delete the
- **Test:** the product's own suite (`ov test`), including its ingest and publication tests; the
- **Test:** the product's own suite (`ov test`), including its ingest and publication tests; the
Publishing side is `test/ingest.test.js` and `test/publication.test.js`.
Publishing side is `test/ingest.test.js` and `test/publication.test.js`.
-## v1.2.0 → v1.3.0
-
-Additive: `layout.renderDocument` forwards the AI summary to the shell. Everything else is unchanged,
-and a product that passes none of the four options renders exactly as on v1.2.0.
-
-- **package.json:** `"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.3.0"`.
- `openvibe-shared` stays at v2.6.0 or later (that is where `seo.pageSummary` and the shell's `summary`
- support already live).
-- **Lockfile:** copy the `node_modules/openvibe-publishing` entry (`1.3.0`, the matching `resolved`,
- the real `integrity`) from a product already on the tag.
-- **What changes in the product:** pass `summary` on the home render (and on any other page that has
- a real one-line summary, e.g. an article or a review), so the `ai-summary` meta lands on the page.
- - `layout.renderDocument({ …, summary, facts, updated, url })` — `summary` is the one-line AI
- summary, `facts` the `[[key, value], string]` (or `[string]`) rows, `updated` the ISO date, `url`
- absolute and defaulting to the canonical.
- - `summary` alone gives `<meta name="ai-summary">` plus a `WebPage` JSON-LD tag; `facts` gives the
- `<noscript><section data-ai-summary>` block; `updated` becomes `dateModified`.
- - **Only pass what the facts support.** A missing rating, price, date or author is left out of the
- facts block, never defaulted — the same rule as every other structured output here.
-- **Test:** the product's page/render tests (`ov test`); Publishing's side is `test/layout.test.js`.
-
## v1.1.0 → v1.2.0
## v1.1.0 → v1.2.0
Adds `openvibe-publishing/layout`; nothing existing changes. The seven publication sites each hand-wrote
Adds `openvibe-publishing/layout`; nothing existing changes. The seven publication sites each hand-wrote
@@ -102,3 +81,25 @@ the page document; `renderDocument` replaces that, composed over `openvibe-share
@@ -102,3 +81,25 @@ the page document; `renderDocument` replaces that, composed over `openvibe-share
- **Worked example:** OpenVibe.News main, `server/render/layout.js` (`renderPage` builds `nav`,
- **Worked example:** OpenVibe.News main, `server/render/layout.js` (`renderPage` builds `nav`,
`footer`, `account` and returns `layout.renderDocument({ site: 'news', … })`), landed in News PR #6.
`footer`, `account` and returns `layout.renderDocument({ site: 'news', … })`), landed in News PR #6.
- **Test:** the product's page/render tests (`ov test`); Publishing's side is `test/layout.test.js`.
- **Test:** the product's page/render tests (`ov test`); Publishing's side is `test/layout.test.js`.
+
+## v1.2.0 → v1.3.0
+
+Additive: `layout.renderDocument` forwards the AI summary to the shell. Everything else is unchanged,
+and a product that passes none of the four options renders exactly as on v1.2.0.
+
+- **package.json:** `"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v1.3.0"`.
+ `openvibe-shared` stays at v2.6.0 or later (that is where `seo.pageSummary` and the shell's `summary`
+ support already live).
+- **Lockfile:** copy the `node_modules/openvibe-publishing` entry (`1.3.0`, the matching `resolved`,
+ the real `integrity`) from a product already on the tag.
+- **What changes in the product:** pass `summary` on the home render (and on any other page that has
+ a real one-line summary, e.g. an article or a review), so the `ai-summary` meta lands on the page.
+ - `layout.renderDocument({ …, summary, facts, updated, url })` — `summary` is the one-line AI
+ summary, `facts` the `[[key, value], string]` (or `[string]`) rows, `updated` the ISO date, `url`
+ absolute and defaulting to the canonical.
+ - `summary` alone gives `<meta name="ai-summary">` plus a `WebPage` JSON-LD tag; with `summary`,
+ `facts` adds the `<noscript><section data-ai-summary>` block and `updated` becomes `dateModified`.
+ Without a `summary`, `facts`, `updated` and `url` emit nothing.
+ - **Only pass what the facts support.** A missing rating, price, date or author is left out of the
+ facts block, never defaulted — the same rule as every other structured output here.
+- **Test:** the product's page/render tests (`ov test`); Publishing's side is `test/layout.test.js`.
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-publishing",
"name": "openvibe-publishing",
- "version": "1.2.0",
+ "version": "1.3.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-publishing",
"name": "openvibe-publishing",
- "version": "1.2.0",
+ "version": "1.3.0",
"license": "MIT",
"license": "MIT",
"devDependencies": {
"devDependencies": {
"@electric-sql/pglite": "^0.5.8",
"@electric-sql/pglite": "^0.5.8",