openvibers/openvibe.design Commits

Rules: a home's picture is the product; a button keeps its promise; two icon sets (#234)

OP OpenVibers committed 3 days ago · ac44a24d10 · 1 file, +12 −0

Three decisions from 2026-11-10, with the case behind each: five homes drew the same ring of icons; Video offered
Edit in Studio where nothing could be edited; most of Quest's icons were the fallback V.

Changes

ddiff --git a/server/rules/register.js b/server/rules/register.js
iindex 4ea34be..72f6be7 100644
---- a/server/rules/register.js
++++ b/server/rules/register.js
@@@ -31,6 +31,10 @@ const RULES = Object.freeze([
'No sample rows, invented counts, filler testimonials or "coming soon" sections dressed as content. An empty place says it is empty and offers one way forward.',
'2026-10-31', 'Placeholder sections and invented numbers made pages look full and told people nothing.',
[{ label: 'One-line empty states', href: '/patterns/empty-state' }]),
++ R('two-icon-sets', 'honest', 'An icon name is checked against the set that draws it.',
++ 'There are two sets: a site’s own mark (live, chat, quest: drawn in the page) and the glyphs (wrench, heart, camera: drawn as SVG). A name from one written as the other draws the fallback mark, a bare "V". A page’s checks fail when it asks for a mark that does not exist.',
++ '2026-11-10', 'Most of Quest’s icons were a "V": glyph names written as site marks, and the check looked at the wrong list.',
++ [{ label: 'Icons', href: '/icons' }]),
R('count-what-it-says', 'honest', 'A number counts exactly what its label says.',
'A count next to a list equals the length of that list. "4 agents working now" must count agents at work, not the agent catalogue.',
'2026-11-01', 'A home page counted its catalogue as "working now".',
@@@ -225,6 +229,14 @@ const RULES = Object.freeze([
[{ label: 'Levels with a floor', href: '/patterns/levels-with-a-floor' }]),
// ── Products and their jobs ──
++ R('the-picture-is-the-product', 'products', 'A home’s picture shows the thing the site does, not a diagram of its menu.',
++ 'The hero’s picture is the product at work: Tips shows a tip landing on a stream and the goal moving, Work the newest listing with its board, Run a job on a paired computer, Space a request and the app it becomes, Events the bus’s own week. Real rows and counts where the site has them (and no picture when it has none); otherwise an example, labelled "An example" in its caption. It moves once, then rests, and is still under reduced motion.',
++ '2026-11-10', 'The owner: no more "generic circled" homes. Five homes drew the same ring of icons round a word.',
++ [{ label: 'OpenVibe.Work', href: 'https://openvibe.work/' }, { label: 'OpenVibe.Tips', href: 'https://openvibe.tips/' }]),
++ R('a-button-keeps-its-promise', 'products', 'A button is shown only where what it names can be done.',
++ '"Edit in Studio" appears when the editor can edit that kind of thing; until then the page offers what it can really do, under its real name. A button that opens a page which cannot do the verb is a broken promise, however good the page will be later.',
++ '2026-11-10', 'Video showed "Edit in Studio" for a page that could only preview a video and publish an unedited copy.',
++ []),
R('one-job-per-product', 'products', 'Each product does one job, and its domain says which.',
'Report reads (rankings, numbers, evidence); Exchange does (try a model, get a key, route). Design makes interfaces, icons, fonts and themes; Studio edits photos, video and sound. Codes is coding with any agent; Services is the developer console.',
'2026-11-07', 'Merged products muddle both markets and both pages.'),