openvibers/openvibe.design Commits
Rules: a home's picture is the product; a button keeps its promise; two icon sets (#234)
Changes
@@@ -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.'),
@@ -31,6 +31,10 @@ const RULES = Object.freeze([
@@ -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.',
'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.',
'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' }]),
[{ 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.',
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.',
'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".',
'2026-11-01', 'A home page counted its catalogue as "working now".',
@@ -225,6 +229,14 @@ const RULES = Object.freeze([
@@ -225,6 +229,14 @@ const RULES = Object.freeze([
[{ label: 'Levels with a floor', href: '/patterns/levels-with-a-floor' }]),
[{ label: 'Levels with a floor', href: '/patterns/levels-with-a-floor' }]),
// ── Products and their jobs ──
// ── 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.',
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.',
'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.'),
'2026-11-07', 'Merged products muddle both markets and both pages.'),