openvibers/openvibe.design Commits
Rules 120-127 from the 2026-11-11 design pass (#277)
Changes
@@@ -451,6 +451,30 @@ const RULES = Object.freeze([R("ai-shows-who-did-what", "agents", "An AI task shows which model did what, and the person can change it.","A task that uses several models says so on its record: each role (plan, build, review, verify) with its model, its reasoning level, its time and its cost, as steps in the one step view. The plan behind it is a setting a person can read, copy and edit (presets first, then every role), the same plan through the page, the API and the SDK.",'2026-11-11', "The owner: \"a really sophisticated multi-model system with enhanced reasoning … modular configuration … SDK API … OpenVibe.design connected.\""),++ R("directories-fold-by-group", "length", "A long directory folds by its natural group, and every entry stays in the page.",++ "Hundreds of entries (models, engines, sites) are grouped by what a person looks for first (the provider, the kind), each group a fold whose summary says how many, how many are free and from what price. A search, a filter or a short list opens the folds. Every entry is still in the HTML for crawlers and find-in-page; an entry is one line: its name first, then status, size and price at the end (under the name on a phone).",++ '2026-11-11', "Exchange's /models was about sixty phone screens: nine callable models, then 934 registry models as one plain list (the owner's provider card, ask 361)."),++ R("cards-preview-on-rest", "motion", "A card plays its short preview when a person rests on it, and only then.",++ "A video, clip or live card with a preview plays it, muted, inside its own picture: after a short rest of the mouse or keyboard focus on a computer, and for the one card that settles in the middle of the screen on a phone. The picture stays until the video really plays, the badges stay on top, a thin line shows how far it has played. Motion Off and Save-Data play nothing; Calm and reduced motion keep the rest-to-play but not the scroll one; an 18+ card never previews.",++ '2026-11-11', "Ask 355: Media makes six-second previews for every recording and clip; the cards had none (the owner: hover and centred previews)."),++ R("time-said-like-people", "words", "A time on a page reads the way a person says it; the exact time is one hover away.",++ "Feeds, rows and cards say \"3 min ago\", \"2 h ago\", \"yesterday\", \"Nov 3\" in a <time> element whose datetime is exact and whose title is the full date. A raw timestamp (\"2026-11-11T16:10:38.000Z\") never reaches a person.",++ '2026-11-11', "Community's feed printed ISO timestamps under every card."),++ R("labels-never-repeat", "words", "A label never says the same thing twice.",++ "A card's line of who, what, where and when leaves out a part that repeats another (\"Quest · Quest\", \"Live · video\" for a recording on Live); a section with one side drops the side label its card already carries (\"As a streamer\" over \"AS A STREAMER\").",++ '2026-11-11', "Community's feed (\"Quest · quest\") and Live's AI timeline (\"As a streamer\" twice) on 2026-11-11."),++ R("rewards-as-chips", "look", "What something pays is one row of small chips with marks, the meaning in the chip.",++ "A badge with its own mark and name, an item with its emoji and name, an amount with its coin: one row of chips, never a list of sentences. What each chip is (\"a badge on your profile\", \"a hat for your inventory\", \"OpenCoins start soon\") is its title and screen-reader text; a promised amount that is not paid yet stays visible, dashed.",++ '2026-11-11', "The owner (asks 61-62): \"turn the ugly badge text list into condensed icons with hover/tap effects.\""),++ R("icons-draw-without-a-font", "building", "An icon is drawn by the page itself; an icon-font class with no font is a blank.",++ "A page that loads no icon font draws its icons as the shared icons' inline SVG (a site's own mark through the icon helper) or a small inline SVG. A server-rendered `fa-*` class works only on a page that loads the glyph font for it; the browser test looks for empty icon boxes.",++ '2026-11-11', "openvibe.network's home showed blank marks on its popular rows, its play discs and its chevrons (no icon font on that page)."),++ R("counts-near-the-limit", "words", "A length counter shows only near the limit.",++ "A box with a limit says how much is left only in its last part (the last 15%, at most 200 and at least 20 characters). An empty search box saying \"120 left\" is noise.",++ '2026-11-11', "Exchange's model search showed \"120 left\" while empty."),++ R("defaults-follow-the-choice", "data", "A form's defaults follow what the person already chose.",++ "When one field narrows another (a kind narrows the engines, a site narrows the categories), the defaults come from the narrowed set: Web picks two web engines, never two picture engines that happened to come first.",++ '2026-11-11', "Exchange's compare form picked Openverse and Wikimedia Commons with Web selected."),]);// The register's order is the rule's number: a person can cite "rule 7" and a link can carry it.
@@ -451,6 +451,30 @@ const RULES = Object.freeze([
@@ -451,6 +451,30 @@ const RULES = Object.freeze([
R("ai-shows-who-did-what", "agents", "An AI task shows which model did what, and the person can change it.",
R("ai-shows-who-did-what", "agents", "An AI task shows which model did what, and the person can change it.",
"A task that uses several models says so on its record: each role (plan, build, review, verify) with its model, its reasoning level, its time and its cost, as steps in the one step view. The plan behind it is a setting a person can read, copy and edit (presets first, then every role), the same plan through the page, the API and the SDK.",
"A task that uses several models says so on its record: each role (plan, build, review, verify) with its model, its reasoning level, its time and its cost, as steps in the one step view. The plan behind it is a setting a person can read, copy and edit (presets first, then every role), the same plan through the page, the API and the SDK.",
'2026-11-11', "The owner: \"a really sophisticated multi-model system with enhanced reasoning … modular configuration … SDK API … OpenVibe.design connected.\""),
'2026-11-11', "The owner: \"a really sophisticated multi-model system with enhanced reasoning … modular configuration … SDK API … OpenVibe.design connected.\""),
+ R("directories-fold-by-group", "length", "A long directory folds by its natural group, and every entry stays in the page.",
+ "Hundreds of entries (models, engines, sites) are grouped by what a person looks for first (the provider, the kind), each group a fold whose summary says how many, how many are free and from what price. A search, a filter or a short list opens the folds. Every entry is still in the HTML for crawlers and find-in-page; an entry is one line: its name first, then status, size and price at the end (under the name on a phone).",
+ '2026-11-11', "Exchange's /models was about sixty phone screens: nine callable models, then 934 registry models as one plain list (the owner's provider card, ask 361)."),
+ R("cards-preview-on-rest", "motion", "A card plays its short preview when a person rests on it, and only then.",
+ "A video, clip or live card with a preview plays it, muted, inside its own picture: after a short rest of the mouse or keyboard focus on a computer, and for the one card that settles in the middle of the screen on a phone. The picture stays until the video really plays, the badges stay on top, a thin line shows how far it has played. Motion Off and Save-Data play nothing; Calm and reduced motion keep the rest-to-play but not the scroll one; an 18+ card never previews.",
+ '2026-11-11', "Ask 355: Media makes six-second previews for every recording and clip; the cards had none (the owner: hover and centred previews)."),
+ R("time-said-like-people", "words", "A time on a page reads the way a person says it; the exact time is one hover away.",
+ "Feeds, rows and cards say \"3 min ago\", \"2 h ago\", \"yesterday\", \"Nov 3\" in a <time> element whose datetime is exact and whose title is the full date. A raw timestamp (\"2026-11-11T16:10:38.000Z\") never reaches a person.",
+ '2026-11-11', "Community's feed printed ISO timestamps under every card."),
+ R("labels-never-repeat", "words", "A label never says the same thing twice.",
+ "A card's line of who, what, where and when leaves out a part that repeats another (\"Quest · Quest\", \"Live · video\" for a recording on Live); a section with one side drops the side label its card already carries (\"As a streamer\" over \"AS A STREAMER\").",
+ '2026-11-11', "Community's feed (\"Quest · quest\") and Live's AI timeline (\"As a streamer\" twice) on 2026-11-11."),
+ R("rewards-as-chips", "look", "What something pays is one row of small chips with marks, the meaning in the chip.",
+ "A badge with its own mark and name, an item with its emoji and name, an amount with its coin: one row of chips, never a list of sentences. What each chip is (\"a badge on your profile\", \"a hat for your inventory\", \"OpenCoins start soon\") is its title and screen-reader text; a promised amount that is not paid yet stays visible, dashed.",
+ '2026-11-11', "The owner (asks 61-62): \"turn the ugly badge text list into condensed icons with hover/tap effects.\""),
+ R("icons-draw-without-a-font", "building", "An icon is drawn by the page itself; an icon-font class with no font is a blank.",
+ "A page that loads no icon font draws its icons as the shared icons' inline SVG (a site's own mark through the icon helper) or a small inline SVG. A server-rendered `fa-*` class works only on a page that loads the glyph font for it; the browser test looks for empty icon boxes.",
+ '2026-11-11', "openvibe.network's home showed blank marks on its popular rows, its play discs and its chevrons (no icon font on that page)."),
+ R("counts-near-the-limit", "words", "A length counter shows only near the limit.",
+ "A box with a limit says how much is left only in its last part (the last 15%, at most 200 and at least 20 characters). An empty search box saying \"120 left\" is noise.",
+ '2026-11-11', "Exchange's model search showed \"120 left\" while empty."),
+ R("defaults-follow-the-choice", "data", "A form's defaults follow what the person already chose.",
+ "When one field narrows another (a kind narrows the engines, a site narrows the categories), the defaults come from the narrowed set: Web picks two web engines, never two picture engines that happened to come first.",
+ '2026-11-11', "Exchange's compare form picked Openverse and Wikimedia Commons with Web selected."),
]);
]);
// The register's order is the rule's number: a person can cite "rule 7" and a link can carry it.
// The register's order is the rule's number: a person can cite "rule 7" and a link can carry it.