openvibers/openvibe.design Commits

Rules 120-127 from the 2026-11-11 design pass (#277)

OP OpenVibers committed 2 days ago · 2dbd64d155 · 1 file, +24 −0

From the 2026-11-11 design pass: directories-fold-by-group (Exchange /models), cards-preview-on-rest (ask 355),
time-said-like-people and labels-never-repeat (Community's feed, Live's AI timeline), rewards-as-chips (Quest, asks
61-62), icons-draw-without-a-font (Network's home), counts-near-the-limit (the composer), defaults-follow-the-choice
(Exchange's compare form).

Changes

ddiff --git a/server/rules/register.js b/server/rules/register.js
iindex 354ca78..ba61943 100644
---- a/server/rules/register.js
++++ b/server/rules/register.js
@@@ -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.