Contract: the view (view/v2), how data becomes a flower
specs/006-the-map/contracts/view.mdSource contract. Dated notes and future phases retain their original status.
On this page
Version: view/v2 since 11 Nov (labels; see "view/v2" below), view/v1 still read | Owner: LOOK | Status: v1 reviewed by META, 9 Nov; v2 by Elco's go on coordinator/annotation-layer.md, step 6. Built under specs/protocols.md, the one rule for every format.
Schemas: view-v1.schema.json and view-v2.schema.json, next to this file.
Elco's words (9 Nov, through META)
the user will be able to switch what the primitives mean - the data doesn't have to know how it's being shown, the rendering doesn't need to care what data is living in which dimension - so the user can have color mean type of wallet OR maybe, last active, or or or ... in the end it will be handful of dimensions that can be swapped around ... we just have to get organized
Agent proposes, person adjusts, settings are global (i.e. however the user had it, all petals are shown in that setup - there will be a default and settings in the lobby, maybe it won't be a free for all but a few modes - we have to earn this level of prototyping by getting the systems in place)
Always the latest look.
no second look - one first look that we improve on
Words, with Elco: data or a piece of data (not "measure"), and dimensions for the visual primitives.
What it is
A view says which piece of data each dimension shows. That's all it holds.
- The data doesn't know how it's shown. A flower's data (005's layers, through the seam) lists its pieces of data, each with a name and a kind. Nothing in it names a dimension.
- The look doesn't know what data it shows. It draws a reading: per petal, a value for each dimension, already worked out (
reading/v1holds these today:height,width,colour,outline,segments). It never sees a data name. - The view joins the two. For each dimension in use, it names one piece of data. Any piece of data of a fitting kind can go in any dimension that accepts its kind.
- One view per person, for every flower. However the person has it set, every flower they look at is drawn that way, theirs and everyone else's. Everyone who hasn't set one sees the default.
- The agent proposes, the person adjusts. The agent's proposal is a view, or a change to one; the person takes it or changes it. The place to change it is the lobby's settings, which come later. "A few modes" may replace a free choice; that's for later too.
- Always the latest look. The look improves by versions, and every flower is drawn by the latest. No older look is kept drawable. A published flower stays the same flower, because its id leaves the drawing out.
The dimensions: a handful, fixed
The nine in today's vocabulary (packages/core/src/primitives.ts, spec/v1's channel slots), with the kinds each accepts. 005's kinds of data: amount, count, share, category, flag (yes or no). Two more are needed here, for SYSTEMS to agree: parts (a petal cut into what it's made of, as backers are today) and relation (petal to petal, 005's relations layer).
| Dimension | Accepts | Drawn by the look today |
|---|---|---|
| height (how far a petal reaches) | amount, count, share | Yes |
| width (the angle a petal takes, kept within 1.5x to 3x) | amount, count, share | Yes |
| order (where on the ring) | amount, count, share, category | Yes, largest first only |
| colour | category (up to about 8), or amount, count or share as a scale | Not yet: the calm pass made the live flower grey |
| outline | flag, or a category of up to 3 | Not yet on the live flower |
| texture | flag, or a category of up to 3 | Not yet |
| markings (a mark at each petal's tip) | count, flag | Not yet |
| segments (bands inside a petal) | parts | Yes, on the focused petal |
| lines (petal to petal inside a flower) | relation | Not yet |
A dimension the look doesn't draw yet is declared, never imitated, as today (primitives.ts): it shows nothing, and the legend leaves it out.
Pieces of data a view can name
- On every flower, from the reading:
share(share),amount(amount),kind(category: the kind of account),identity(category: verified, self-declared, inferred, or none). - On some flowers:
backers(parts; NEAR pools today). - Anything a layer adds, by its own name, or
<layer>:<name>when two layers use the same name (005's seam).
When a flower doesn't have that piece of data, or has it as a kind the dimension doesn't accept, that dimension shows nothing on that flower. A missing fact shows nothing (design/frontend-foundation.md, Fire's rule 5). There's no fallback.
The document
{
"petal": "view/v1",
"dimensions": {
"height": { "data": "share", "scale": "sqrt" },
"width": { "data": "share", "scale": "log", "max_ratio": 2 },
"order": { "data": "share" },
"colour": { "data": "kind" },
"outline": { "data": "identity" },
"texture": null,
"markings": null,
"segments": null,
"lines": null
}
}
That's the default: today's default/v1 choices, written as a view. null means the dimension isn't in use. scale and max_ratio keep spec/v1's meanings. A view names its data only; the legend's words come from the data's own label and unit, so a view brings no words of its own. Who set a view is kept by whoever stores it, outside the document, the way 005 keeps a layer's author.
Elco's live case (proposals per holder next to their holdings) is the default with one change: "markings": { "data": "proposals" }. Every flower whose data has proposals as a count shows it; the others show no marks.
The rule for v2
It follows specs/protocols.md, the one rule for every format:
- It becomes
view/v2when a change would make a valid v1 view invalid, change what a field means, or change a v1 view's hash. A view refuses fields it doesn't know, so a new field, or a dimension added, removed or renamed, is a new version. - It stays
view/v1when a dimension starts accepting another kind of data: every v1 view stays valid and means the same; a flower may simply show more. - Old views stay readable: v1's schema, fixtures and pins stay, a reader picks by the
petalfield, and nothing is rewritten in place. - The look's version is separate: the look improves and is always the latest; the view's format changes only by this rule.
Fixtures and checks
packages/core/schema/fixtures/view.v1.json(the default) andview.v1.proposals.json(Elco's case), pinned inpackages/core/schema/pins.json.scripts/check-protocols.ts, run byscripts/check.sh, checks both against the schema and their pins.- A test holds the table above: each dimension accepts exactly its kinds.
- A test holds that the look draws only what it declares, and the legend lists exactly what's drawn.
The seam this changes (to agree with SYSTEMS and META)
Today a flower's spec carries its own encodings, and the agent chooses them for each flower (propose_spec, spec/v1). With one view per person, the view decides how every flower is drawn. The lean:
spec/v1keeps its encodings, as the record of what the agent proposed when it made the flower. Old flowers and their hashes don't change.- Drawing reads the viewer's view (the default for anyone without one), and
reading/v1takes its choices from it instead of from the spec. propose_spec's choices become the agent's proposal for the person's view.
Kinds on every piece of data are what make this work, so it waits on seam/v1 carrying each piece's kind (SYSTEMS's step 2 in coordinator/systems-check-2026-11-09.md). "Last active" for colour, Elco's example, needs a kind for dates that 005 doesn't have yet.
view/v2: labels (11 Nov)
coordinator/annotation-layer.md, section 3 and step 6. Elco: "the agent and the person can go CRAZY adding annotation". A person's annotations name accounts, and the names are data like any other, so they reach a petal through the view.
- A tenth dimension,
labels: which piece of data names each petal. It accepts a category. A new dimension is a new version, by the rule above. - What each choice shows:
identity: the identity's name, unless it's only inferred, else the short address. That's every petal's name before v2.kind: the kind of account.- Any other category, such as
namefrom a person's annotations (seam.ts,namePieces): its value for that account. - None, or no value for that account: the petal's own label, its short address. No claim, no name.
- The tail ("everyone else") keeps its own label whatever labels show.
- Long names are cut at 24 characters with "…" on the flower, and shown whole where they're pointed at.
- The default is v1's with
"labels": { "data": "identity" }(view.v2.json). It draws exactly what v1's default draws. It has a new hash, and v1's default hash and its 12-character alias still mean the default. - A view/v1 reads as v2 with labels on identity (core's
latestView), and keeps its own hash. A person's next choice in Settings writes v2. Nothing is rewritten in place. - Names from annotations are two pieces,
nameandname_kind(declared, stated, sourced or inferred). The strongest word is sourced, never verified. - No fixed meaning for how data looks (Elco, 11 Nov): "dont give data hard coded use of visual manifestations - outlines are being designed and could mean different things (just like all the other visual behaviours)". Outline, like any dimension, can take
name_kindas a category, but how a category is drawn stays undecided until the look work designs it, the same for every dimension. Until then a choice the look can't draw shows nothing, and the legend leaves it out. - Fixtures:
view.v2.json(the default) andview.v2.names.json(labels onname, outline onname_kind), pinned. - Who composes: names are the person's own, so whoever draws for a signed-in person passes their named claims through
namePiecesto the reading (readFlower'spieces,renderFlower's optionpieces). A visitor gets none, so every petal keeps its short address under labels onname.
Not in v1
The lobby's settings, modes, storing a person's view on the server, and the agent's tool for proposing one all come later. v1 is the format, the default, the fixtures and the checks.