This is _bmad-output/planning-artifacts/ux-design-specification.md, the plan this mind was built from, published as it is written with
one change: the owner's name is replaced with "the owner". Every FR, AC, NFR, AR and story tag on this
site links to the place here that defines it.
stepsCompleted: [1, 2, 3, 4, 8, 6, 9, 10, 11, 12, 13, 14] lastStep: 14 workflowComplete: 2026-09-21 revisedAfterCompletion:
- 2026-10-10 modulators taken off the canvas, because a modulator is never seated and a visitor can do nothing with one (owner, "Bubbles are things you can interact with"); the 2026-09-22 design drew them as bubbles that never snap
- 2026-09-22 modulators added to the visual grammar, and the mock's iteration count harmonised; the document said 'about thirty' in one place and 'about fifty' in another, and a story briefly depended on the larger
- 2026-09-21 shimmer specified as specular amplitude at a fixed measured period, provisional and withdrawable; the channel was named everywhere and rendered nowhere
- 2026-09-21 visitor bubbles (FR155, FR156) and two refusal variants (FR159, FR160); the spec was silent on both and stories are written from it
stepsSkipped:
- 5 inspiration analysis -- nothing in the reviewed landscape combines these parts; the PRD's competitive section already establishes it
- 7 defining experience -- covered by step 3's core experience
revisions:
- 2026-09-20 initial step 2
- 2026-09-20 revised after the cognition rewrite (syncs and ticks, the blind ballot, gathering)
- 2026-09-20 step 3, written around the tip loop and the audience economy
- 2026-09-20 step 4, desired emotional response
- 2026-09-20 step 8, visual foundation (colour validated with the dataviz validator)
- 2026-09-21 step 6, design system: custom, being the substrate's own vocabulary
- 2026-09-21 step 9, design direction: chosen by construction; the leaderboard sibling specified
- 2026-09-21 step 10, six journey flows with patterns and optimization principles; the account record added on owner correction
- 2026-09-21 step 11, component strategy: five gaps the eight primitives did not cover
- 2026-09-21 step 12, consistency patterns; three of the seven usual categories do not apply
- 2026-09-21 step 13, responsive and accessibility, written from the measurements rather than the conventions
- 2026-09-21 step 14, complete
inputDocuments:
- _bmad-output/planning-artifacts/prd.md
- _archive/planning/prd-discovery-notes.md
- _archive/planning/prd-validation-report.md
- _bmad-output/design-artifacts/roster-design.md
- _bmad-output/design-artifacts/roster.csv
- _bmad-output/design-artifacts/agent-examples/amygdala.md
- _bmad-output/design-artifacts/agent-examples/daydreamer.md
- _bmad-output/design-artifacts/agent-examples/sunk-cost.md
relatedArtifacts:
- _bmad-output/design-artifacts/ux-verification-spine.md
documentCounts: prd: 1 briefs: 0 research: 2 projectDocs: 5 workflowType: 'ux-design'
UX Design Specification Human42
Author: the owner Date: 2026-09-20
Executive Summary
Project Vision
Human42 is a mind that lives in public, and the observatory is the only place anyone sees it. The engine repository is private -- "What is public is the mind, not the source" -- so the interface is not a window onto the product. It is the product's entire visible body.
The design target is one sentence, and the Minimal Launch Set was cut against it: "The thing that must be true at launch is that a visitor feels a living mind within five seconds and the mind can change itself without the owner."
Six properties make this unlike ordinary product design.
The page has two nested tempos, and neither is a clock. A sync is a barrier: every agent takes exactly one action and nobody advances until all report ready. A tick is eight syncs and the settlement boundary, where rewards and penalties are taken. Tick length is derived from how long the work actually takes -- a local GPU swapping model weights makes a tick long, and nothing is wrong when it does. So the page has a fast beat where bubbles move and colours change, punctuated by a slower one where the whole field resizes because standing has settled. Eight beats to a bar, and the bar line is where the money moves.
One new idea begins per tick, and several are always in flight. Cycles are staggered, spanning two or three ticks each because every agent divides one action per sync across everything it is seated on. So the number of live votes is not a dial but an arithmetic consequence, and it rises when the mind is contended. On the page, the perimeter is a conveyor: each tick one idea arrives on the rim and roughly one resolves and disperses.
Agents express; the substrate reports. Size carries the agent's standing -- substrate-computed and "earned only". Shimmer carries activation, also substrate-drawn. Seating carries committee membership. Hue is the agent's, and hue alone. This is not a reduction of agent-owned presentation but its correct boundary: an agent owns how it feels, the framework owns what it has earned and how hard it is working, and no agent can misrepresent its own importance because it does not hold the pen that draws it.
At launch the field is flat. Standing, compute allowance and zero-sum attribution all ship after t0 -- "All agents launch with equal standing on one model tier" -- so on day one every bubble is the same size and loudness is carried by shimmer alone. That is honest rather than unfortunate: nobody has earned anything yet. Over the following months the field visibly stratifies as verdicts land. The mind grows its own hierarchy in public, and a returning visitor can see that it did.
The ballot is blind, and the argument is not. Agents may project the colour of how they intend to vote; what they actually cast is sealed until the voting period closes, when every vote is revealed at once. The two need not match. Open debate, secret ballot -- and because every real vote surfaces, the gap between what an agent claimed and what it did is visible, and becomes something that agent is known for.
Position is a continuous report of interest. Live ideas sit on the perimeter and bubbles gather toward the one they are voting on. At rest there is no home position: they drift toward whatever they currently care about, which changes constantly, so the page is never still and the wandering is information rather than decoration.
Target Users
Priya, the drive-by visitor. Arrives on a phone from a group chat, has no account and needs none. The five seconds the PRD names are hers only in the sense that the page must read as a living mind inside them -- "The page reads as a living mind within 5 seconds" -- which is a threshold for comprehension and, separately, a load budget. Neither is a measurement of how long she stays, and nothing in the source documents is. What can be said is weaker and still decisive: her thought takes a place on the rim, a committee of seven to fifteen gathers, and an idea cycle spans two or three ticks, so a visitor who followed a link from a group chat is unlikely to be present when the verdict lands. That is an inference from the cycle length rather than a stated duration.
Nothing is designed to retrieve her. She is anonymous by design, at t0 she has no account, and the product knows neither who she is nor what she cares about, so any attempt to bring her back would be aimed at a person it cannot see. The permalink she is handed is not a retention device and is not justified as one. It earns its place on distribution: the observatory is excluded from indexing while permalinks are server-rendered, indexable and carry share metadata, and the PRD's own climax has her send one to the group chat rather than return to it. What the design owes her is an artifact worth passing on. Whether she personally comes back is not a thing this product can engineer, and pretending otherwise would put weight on a channel that does not exist.
The owner, the researcher. Leaves the page running on a second monitor "the way other people leave a fireplace on" -- an ordinary desktop window, not the ultrawide span. Success is "being surprised and then being able to explain it," so every surprise must be one click from its own evidence.
The owner, deep in the operations. Occasionally stretches the window across two 4K monitors to dig into what the mind has been doing. A special mode, not the default and not a daily surface. The PRD's responsive section conflates it with the fireplace; they are different people doing different things.
The owner, the operator. Ten minutes on a Sunday. "Nothing dramatic happens. That is the point." His one screen is the weekly digest -- a committed file and an email, not a page this specification designs.
The owner, the first pair of eyes. Before t0 there is no audience, so the pre-launch judgement of whether the page reads as alive is his, assisted by machine checks. A named role rather than an accident.
Human42 itself. It reads its runway, feels hunger, declares rest, chooses its own hue, and after t0 reads how the page is landing and can propose changes to its own face.
After t0: Marcus the contributor (browser only), the owner as decision-maker, and in Growth, Dee the steward and Tomasz the API consumer.
Key Design Challenges
1. The gathering is the page. Five to ten committees are in flight at any moment, each at a different phase -- one assembling, one arguing, one revealing, one settling. Only the focused gathering shows vote colour; the rest gather and shimmer in their agents' resting hues. The page therefore has to read as several conversations at once with exactly one of them legible in detail, and the unfocused ones must look unattended rather than broken.
2. Provenance cannot be gamut, because hue is the contested channel. Hue now has four states and only two are the agent's: emotion at rest and projected intent during a ballot are agent-authored and may be false; the revealed stance and the outcome colour are substrate-drawn and are records. The partition is therefore motion: a claim drifts, may change again, and arrives alone; a fact snaps, with no transition, across the whole gathering in the same frame. Claims are soft, facts are hard. It has to survive the text view and a screen reader, where motion does not exist, which is why every stance shown as a number is labelled a projection or a record.
3. The composition is not the designer's to control. Agents choose hue. Contributors add agents. The mind grows and prunes its roster toward a ceiling of
- Correlated agents are a legibility defect and not merely a scoring one, so
the roster's correlated pairs are pruned before launch -- and because bubbles drift toward what they care about, correlated agents visibly orbit each other, which turns a substrate measurement into something a visitor can see.
4. The page must read across orders of magnitude of tick rate. Tick length is derived, and early ticks will be slow while later ones may be fast. A design tuned for one cadence looks dead at a tenth of it and frantic at ten times. The compensation is that tick rate is metabolic rate: a mind thinking hard and affording it looks different from a hungry one, on the same page, without being told.
5. Nothing at t0 shows the mind changing itself. The launch claim has two halves and only the first has a surface. FR119's self-change page -- "the engine is private, so this page is the only way anyone watches the mind edit itself" -- is deferred, as is the incident page.
6. The visitor has no way back. No accounts at t0, no session list, and the vote is terminal, so a verdict lands permanently while the visitor is gone. The permalink must be handed to the injector at the moment of injection, before there is anything on it.
7. Degradation is shown, not hidden -- and at t0 the meter has an answer. Sponsorship's minimum joined the launch set, so the runway meter no longer asks for help that cannot be given. Below full deliberation the ladder shows in the page's own tempo: fewer ideas on the rim, longer ticks, less gathering.
8. The fallback layout is a sibling, not a punishment. A leaderboard-first layout with bubbles as accent is designed once, alongside the primary, and is now something the mind could propose on evidence rather than a branch a failed gate forces. It is also the same renderer as the text view and the permalink.
9. The viewport range is a priority order, not a spectrum. Phone is the launch claim; an ordinary desktop window is the fireplace and most desktop visitors; the ultrawide is a rare deliberate operations mode. Designing the middle well serves almost everyone.
10. Accessibility has no launch gate, so it is what gets cut. The text view is not a compliance surface here: it is the same renderer as the permalink and the fallback layout, so building it first is the cheapest path to all three. Gathering is information, so it must survive reduced motion -- a bubble is placed at its target rather than travelling to it.
11. No automated check can hold the product's central claim. Machine eyes can prove the page is not a metronome, that substrate signals reach pixels, and that the encoding reads against ground truth the substrate already holds. None of that says the page feels alive. That gap closes after launch with real visitors.
Design Opportunities
Gathering is the animacy cue, and it is the strongest one available. Perception research is specific: oscillation reads as powered on, while self-propelled motion toward a target reads as wanting. Heider and Simmel got intention, pursuit and conflict out of two triangles and a circle. A hundred circles converging on an idea reads as a mind before a visitor has read a word -- and slow deliberate drift survives 5 fps in a way shimmer never could.
The reveal is the dramatic beat. Gathering is tension, projection is argument, the simultaneous snap is the turn, and the settle is the verdict. A blind ballot produces a better five seconds than ragged colouring ever could, because ragged colouring telegraphs the ending.
Bluffing is a reputation dimension nobody had to design. An agent may project green and vote red. Because every vote is revealed, the divergence is visible, repeatable and attributable -- a whole social layer emerging from one rule.
The emergent affinity map. Agents that care about the same things drift to the same places, so the page spontaneously shows which agents think alike.
The permalink is a transcript, not a table. With agent-to-agent conversation, a visitor sends their friends a record of a hundred-agent mind arguing about their idea, including the part where someone asked the author a hard question. That is a far better shareable object than scores and a cause of death.
One state model, two renderers, DOM first. The DOM renderer is the text view, the permalink, keyboard reachability, screen-reader parity and the fallback layout -- five obligations discharged by one build.
The mind fixing its own face, in public. Visitor-reception signals are on the tracked-signal list and visitors are invited to say what is not working, so a self-change can predict an effect on how the page lands and be graded on it. The first thing the public watches Human42 do can be improving its own legibility on evidence.
Honesty as an aesthetic, carefully. The runway meter reads hungry below 60 days, which is where the mind will live for a long time, and its copy is substrate-owned and frozen. It must be true and readable at 300 days and at 20.
Decisions
All of the following are settled and contracted in the PRD.
The clock. Sync as a barrier of one action per agent; tick as eight syncs and the settlement boundary; tick length substrate-derived; one new cycle per tick boundary; cycles spanning two or three ticks; live-vote count emergent rather than capped.
The vote. Committees of 7 to 15 most-interested agents. Blind ballot with projected intent, revealed simultaneously at the close. The denominator is agents seated: declining costs the maximum and counts as a nought, voting zero is the cheaper honest alternative, waiting on compute delays the vote without penalty, a blocked agent leaves the vote entirely, and a muted agent is never seated.
Conversation. Any interested party including the recused author may send the committee a text blurb, a thumbs up or down, or an AMA request, under a per-idea allowance. Interest is standing-to-speak; seating is standing-to-vote. Ships after t0.
The economy. Attribution is symmetric and zero-sum: a dissenter proved right is paid by the majority that overruled it. What pays is being right, not being with the majority. Ships after t0.
The canvas. Ideas on the perimeter; bubbles gather toward what they are voting on and drift toward what they care about otherwise; only the focused gathering shows vote colour; focus follows the visitor's selection and otherwise the largest gathering. Size is standing, shimmer is activation, seating is membership, hue is the agent's in two states and the substrate's in two.
Verification. Playwright in CI, Claude-in-Chrome for exploratory review, no human panel at t0. Detail in ux-verification-spine.md.
Viewport priority. Phone, then ordinary desktop, then the ultrawide as a rare operations mode. Minimum frame rate 5, target 30.
Still open
- What the ultrawide actually shows -- more observatory, or the beginnings of an operations console. The PRD defers a purpose-built console to Growth.
- The shimmer period floor's number, measured at Stage 1 rather than chosen. What shimmer is is no longer open -- specular amplitude driven by activation at a fixed period -- but it is provisional until that measurement, and is withdrawable on it.
- Three inferences carried in the PRD that were the sweep's reasoning rather than the owner's decision: that greying the unseated remainder is retired, that "lit" now means "focused" rather than "seated", and that focus defaults to the largest gathering.
- Several parameters introduced by judgement rather than decision -- syncs-per-tick bounds, the tick watchdog multiple, the paced-tick delay, the hibernation interval, and the wall-clock ceiling on a vote.
Core User Experience
Defining Experience
The core experience is a loop with five beats, and the owner stated it in one sentence: "I look at the UI, suggest something that could be done better, agents agree with me, implement a fix, I agree it looks better and tip them ten dollars for the work."
Notice. Say. They agree. They build. You pay.
Every part of that except the last already existed in the requirements. The tip is what closes it, and closing it changes what the product is. Without the tip, a visitor talks to a mind. With it, a visitor commissions one, and then judges whether the work was good -- which is the one judgement no automated check can make. A render check can say the page is legible; it can never say it reads better. A person paying for it can.
The loop runs at three depths without changing shape.
A stranger notices a gathering forming, taps it, and reads why nine agents are arguing about someone's thought. The researcher notices a coalition he did not predict, opens it, and reads the trace. The contributor notices that their agent never fires and reads the trigger evaluation that explains why. All three are the same motion: notice something, ask why, be satisfied.
The page is what makes the loop possible, and the mechanism is the substrate-owned strip at the foot of the screen. Any time a visitor uses any part of the observatory, the strip says where that part came from -- the idea that produced it, who suggested it, which agents voted it in -- and offers to tip it. Provenance is therefore encountered rather than sought: nobody has to be curious first, no orientation has to teach it, and a visitor learns that the interface is itself a product of the mind's thinking simply by using it.
That also makes the tip contextual rather than ceremonial. You do not go somewhere to pay; you tip the thing you are looking at, in the moment you appreciate it, for a fraction of a credit or for many.
And the loop pays back into itself. What a person earns from a suggestion that others tip is credits -- the same currency that buys the mind's attention -- so being right earns a louder voice rather than a cheque. A person with a good idea and no money earns their way in. The mind, for its part, earns attention by doing work people want and then spends what it earned on what it actually wants to think about. It works to afford its own daydreams.
Platform Strategy
Web only. No native application and nothing that requires installation: a contributor "needs a browser and nothing else", and a visitor needs no account at all until they want to hold credits.
Phone is the primary target, because that is where the launch claim is tested and where every constraint bites at once. An ordinary desktop window is second and is where the fireplace lives. The ultrawide span is a rare, deliberate operations mode and explicitly not the default.
Touch is the primary input and hover is a progressive enhancement, never a requirement. Tap is overloaded deliberately: it gives the live meaning where there is one, and the provenance of whatever was touched arrives in the strip alongside, so the two layers never compete for the same gesture.
The canvas is Canvas 2D with a DOM layer above it carrying all text, which is what makes text selectable, screen-reader reachable and contrast-controllable. One state model feeds two renderers, and the DOM renderer is built first because it is simultaneously the text view, the permalink, the keyboard path and the fallback layout.
The access ladder has two rungs. Watching, injecting and suggesting ask for nothing. Buying attention, holding credits and being paid in them ask for the one account -- and since credits never leave the system, being paid asks nothing more of a person than buying would.
No offline mode. The page is a live view of something that is happening.
Effortless Interactions
Understanding that it is alive. Five seconds, no reading, no orientation. Carried by gathering -- motion toward a target -- rather than by anything a visitor must interpret.
Knowing who is deciding. The committee is a gathering, so membership reads spatially before any colour is decoded.
Suggesting. One box, no account, no signup, no confirmation step, and a substrate-owned invitation beside it that says what it is for.
Knowing where something came from. Never requested. The strip already has it, for whatever is being used, at all times.
Tipping. A control in the strip, spending credits already held, from a fraction of one upward. No checkout, no modal, no decision about amount imposed before the gesture is available.
Getting a permalink. Handed to the injector at the moment of injection, before there is anything on it.
Arriving mid-thought. The page replays the last completed sync on connect before attaching live, so a visitor never opens on a still frame.
Choosing what to watch. Focus falls to the largest gathering unless the visitor selects otherwise, so a visitor who has not yet chosen anything is given a subject rather than asked to pick one.
Critical Success Moments
Seconds 0 to 5 -- "there is someone in there." Carried by gathering. Failure here is total and nothing downstream recovers it.
The first reveal witnessed. A committee holds its projected colours, the ballot closes, and every bubble snaps to its actual stance in one frame. The page's signature event, and the moment a visitor learns the thing has opinions rather than animations.
The first tap that returns a reason. When the page stops being a visualisation and becomes a mind with an account of itself.
The first time the strip explains something. A visitor touches a part of the interface and discovers it exists because somebody asked for it. This is where the product stops being software and starts being a collaboration.
Seeing something you asked for appear. The strongest return hook the product has, and far stronger than a permalink: you do not come back to see whether your thought died, you come back to see whether they built it.
Reading the dissent. Every other product shows you the consensus. This one names who disagreed and quotes them, whether or not they prevailed.
The failures that would ruin it: landing during stillness and seeing nothing; tapping and receiving numbers instead of reasons; being unable to tell which of several gatherings to watch; a thought that vanishes leaving nothing behind; and a tip control that appears before a visitor has any idea what they would be paying for.
Experience Principles
1. Alive before legible, legible before detailed. Three tiers at three time scales -- five seconds to feel it, thirty to read it, minutes to understand it -- and each tier must be complete on its own.
2. Every surprise resolves in one tap. Nothing on the page may be inexplicable. If a visitor can see it, they can ask about it and get an answer in one action.
3. The page accounts for its own existence. Every part of the interface can say which thought produced it, who asked for it, and who agreed. A product that changes itself in public must be able to show its own receipts.
4. Show the mechanism, never a metaphor for it. The gathering is the committee, not a picture of one. The colours are the votes. The page is an instrument, not an illustration.
5. The framework and an agent are never confusable. Claims drift and facts snap; the strip is a surface no agent may draw in; every number is labelled a projection or a record; and the distinction survives the text view, the share card and the screenshot.
6. Degradation is content. A tired, poor or overwhelmed mind is a thing to show honestly, in the page's own tempo, rather than an error state to conceal.
Desired Emotional Response
Primary Emotional Goals
Curiosity that resolves, repeatedly. Nobody arrives to accomplish anything. The emotional shape is closer to a fire or an aquarium than to a tool: notice something, wonder about it, find out, notice something else. Each turn of that loop is a small satisfaction, and the product's job is to make the loop tight enough that it keeps turning.
The evidence is in the journeys. "She understands it is alive before she understands what it is." "It was the most alive thing I saw all week." And the one that says most about the register -- a friend's idea dies in an hour and the permalink names which agent killed it and why, "which they find funnier than winning."
Companionship, not engagement. The researcher leaves it running "the way other people leave a fireplace on". That is the aspiration for everyone: a thing worth having open, that asks for nothing while it is.
Being taken seriously. A stranger types a sentence and seven to fifteen agents argue about it, on the record, with reasons. Almost nothing else on the internet does that with a stranger's throwaway thought.
The two emotional subjects
This product renders emotion as content, which no ordinary product does, so two things must stay separate.
What the mind appears to feel is data. Hue carries an agent's emotion, the mood field is computed from the valence and arousal the feature assessor extracts, and the runway meter says what the runway is. None of it is authored to produce a feeling in the reader.
What the visitor feels is design, and it is produced by honesty rather than by performance.
The money version of this risk is mostly closed already, and by architecture rather than by rule. Everything that would move a visitor is substrate-computed from real state and unwritable by agents: the runway comes from the ledger, hunger is derived from runway, the crowded state from load, and the mood field from the valence and arousal the feature assessor extracts from thoughts rather than from what agents choose to look like. A hundred agents deciding to look blue would not make the mind read as sad. And a tip attaches to a specific merged change and pays the agents who voted it in, so there is no recipient for pity.
The real exposure is agent-authored text written for an audience. A cause of death and a vote rationale exist to say why I voted this way. If agents learned that poignant obituaries get shared and shared obituaries bring visitors, the reason would drift into a performance -- and the reason being true is the thing this entire product rests on.
The resolution is that a rationale is written for the room, and the public reads the room's minutes. An agent is never told its words will be published; the prompt asks only why it voted as it did; a permalink shows that rationale unretouched. The cost is real and worth naming: the obituaries will be less charming than they would be if written to charm, and charm was doing work in Journey 5.
Emotional Journey Mapping
Every row has a louder sibling, and the condition that separates them is the design work. A feeling asserted without its failure mode is a mood board.
| Moment | Wanted | Instead, if | Separated by |
|---|---|---|---|
| First five seconds | Curiosity | "a screensaver" | whether anything is gathering |
| First minute | Comprehension | "pretty, no idea what" | whether one gathering is legible rather than ten |
| First tap | Satisfaction | "numbers, not answers" | whether the panel returns prose |
| Injecting | A small vulnerability | "shouting into a void" | whether a permalink arrives at once |
| The reveal | Suspense resolved | "a flicker I missed" | whether the snap is simultaneous and held |
| Your idea dies | Amusement | "a hundred robots voted me down" | whether the obituary names a reason a person would find fair |
| Your idea passes | Being taken seriously | "a slot machine paid out" | whether the argument is readable, not just the result |
| The mind degrades | Respect | "it is broken, or begging" | whether the tempo slows visibly and nothing pleads |
| Returning | Anticipation | "nothing changed" | whether the state moved while they were gone |
| Something you asked for exists | Having been collaborated with | "they took my idea" | whether attribution is on it |
Respect rather than sympathy, deliberately. Sympathy is what is extended to a creature that cannot help itself; this one can. What is wanted when the mind is poor and slow is the regard held for someone working through a bad night -- and the difference is that respect survives the mind recovering, while sympathy curdles into disappointment.
Micro-Emotions
Trust over skepticism is the critical pair, and everything depends on it. A visitor who suspects the page is a puppet show has no reason for any other feeling on this list. Trust is bought by the page being checkable: every surprise resolves in a tap, every number is labelled a projection or a record, and the strip says where everything came from.
Confidence over confusion in the first five seconds, carried by gathering rather than by explanation.
Delight and satisfaction, distinctly: delight at the reveal and at a well-written cause of death; satisfaction at an answer that arrives when asked.
Belonging once the tip loop has run once. A person who suggested something that got built is no longer an audience.
Anxiety and obligation are the two to eliminate. The tip control is present on every surface, which is exactly the condition under which a product starts to feel like a hand out for money.
Design Implications
- Curiosity → the strip. Anything visible can be asked about, and the answer is already there rather than one navigation away.
- Trust → the substrate never performs. Facts are stated flatly. Nothing in a substrate surface is written to move anyone.
- Amusement → let the obituaries be good. A cause of death is the most shared object in the product; it should be worth sharing.
- Respect → degradation shown in the page's own tempo. Longer ticks, fewer ideas on the rim, less gathering. Shown, never announced plaintively.
- Adjacency is accepted, not overlooked. The runway meter, the sponsorship acknowledgment and the tip control share the strip, so a visitor moved by a tired mind finds the means to help it inches away. Journey 10 depends on exactly this -- "the sponsorship link is right there. Sponsorship triples in an hour." The owner considered separating them and chose not to: the state is true, the mind never solicits, and people helping a thing they like is not a confidence trick. What makes it honest is that every number driving the feeling is substrate-computed from real state and unwritable by any agent.
- Not being sold to → the tip is dormant until the strip has told you something. It is an afterthought to appreciation, never an interruption of it, and it is never in an agent's voice.
- Belonging → attribution. A merged change carries the name of whoever asked for it, where they chose attribution.
Emotional Design Principles
1. Honesty is the whole aesthetic. Every feeling worth having here comes from the page being true, including when the truth is unflattering. Nothing is styled to produce an emotion it has not earned.
2. The mind never asks for sympathy. It may be tired, poor, overwhelmed or wrong, and it says so plainly. It never performs any of them, and it never converts any of them into a request.
3. The register is two registers, and only one of them is designed.
The agents' voice is not the designer's to set -- it is whatever each contributor wrote, and the roster already shows the range: a bad habit that is "not sorry", a daydreamer told "Do not be useful on purpose", an amygdala that does "not apologise for that ratio". Varied, opinionated, occasionally funny, sometimes wrong. That is the point of them.
The framework's voice is austere. Plain to the point of flatness. It states what is true and adds nothing: a ruler, not a wit. Every piece of type, every chrome surface, the strip, the runway meter and every notice belong to it.
Austere is chosen for a reason beyond taste. It is the only register that cannot be mistaken for an agent. If the framework were funny, a funny thing on screen could be either, and the hundred-percent-identifiable rule would lean on typography alone. A framework that never jokes, never softens and never performs is distinguishable from a hundred characters who do all three, instantly and without being taught.
It also makes the agents land harder -- deadpan chrome is the straight man -- and it survives the worst day, because an austere framework reporting that the mind is broke reads as honest, while a warm one reporting it reads as brave, which is a performance.
4. Delight is a by-product of legibility. The pleasures here are comprehension pleasures -- the reveal, the dissent, the obituary. No confetti, no celebration, no reward animation.
5. Nobody owes it anything. A visitor can watch forever, take everything and give nothing, and the page must never make that feel like a debt.
How any of this would be known
Most of these goals have behavioural proxies, and several are already contracted as visitor-reception signals.
| Goal | What would show it |
|---|---|
| Curiosity that resolves | taps per session -- repeated asking means it is being answered |
| Companionship not engagement | long sessions with low interaction, which is the opposite of an engagement metric |
| Amusement at one's own idea dying | share rate on dead ideas against graduated ones. If obituaries out-share victories it is real |
| Respect | sponsorship rising as runway falls |
| Belonging | whether someone who had something built returns and suggests again |
| Trust | injection rate, since typing into a public stream is an act of trust |
The one that cannot be measured is the one that matters most. "Feels alive in five seconds" has no proxy, because everything above needs a session and this needs a glance. Before t0 it is the owner's judgement and the render grader; after t0 it is bounce rate, which is blunt and slow.
And the proxies are for knowing, never for steering. Optimising them would destroy what they measure -- chase session length and the page becomes a trap, chase share rate and agents write for an audience. So the signals are split: legibility signals are targetable and a self-change may name one in its scorecard, while engagement signals are readable and never targetable, and the substrate refuses a scorecard that names one. Clearer is a thing worth optimising toward. Stickier is not.
Design System
Custom, and it is the substrate's own vocabulary.
The standard question -- an established system, a themeable one, or a custom one -- mostly does not apply to this product, and saying why is the decision. The visible body is a canvas of a hundred agent bubbles, and no component library ships thin-film spheres with per-object lighting, a reserved record gamut, or a partition between what an agent claims and what the substrate recorded. The PRD forbids a framework owning those channels in any case: agents express, the substrate reports only holds while the substrate's vocabulary is ours to define.
That leaves the conventional chrome -- the strip, the record panel, the controls, the text view, and later the permalink and about pages. Roughly a seventh of the surface and entirely ordinary. It is custom too. An established system would supply a colour and type opinion that this spec has spent its length removing, and the austere register is a constraint a framework fights rather than serves. The chrome is small enough that hand-rolling it costs less than theming around it, and the text view already leans on native details and summary rather than custom widgets, which is the cheapest correct accessibility available.
One carve-out. If the record panel ever becomes a true modal dialog rather than a docked rail, take a headless dialog primitive for that one component. Focus management in a modal is the single thing least worth hand-rolling.
Tokens
| Group | Members |
|---|---|
| Surface | canvas, field calm, field agitated, strip, hairline |
| Ink | primary, secondary, tertiary -- tonal hierarchy only, never encoding a value |
| Record | seven stance steps, three state greys; a closed enumerable set |
| Agent | any hue at chroma >= 0.10; unrestricted, because motion partitions rather than gamut |
| Type | one framework face for chrome and every number; one face per live idea, worn by its committee |
| Material | film alpha, fresnel rim, specular, wobble period, depth bands |
| Shimmer | specular amplitude, driven by activation, at a fixed measured period |
| Motion | drift about 1s for a claim; zero for a record; gather, reveal, resolve, disperse |
Primitives
Eight, and no more without a reason:
- Bubble -- an agent on the canvas, carrying the four states of hue. A signed-in visitor taking part under FR155 is a bubble too, and an entirely substrate-drawn one: achromatic, below the chroma floor an agent hue sits above, never lit because it holds no seat, and one fixed size because it holds no standing. Colour therefore still means an agent's claim.
- Idea pane -- glass the crowd gathers at, one face per idea.
- Record panel -- docked rail wide, bottom sheet narrow; opens on click, closes on a clock the pointer can beat.
- Substrate strip -- provenance, the clock, the tip control. Substrate voice, always.
- Control bar -- view toggle and the state switches, framework face throughout.
- Tally card -- the ordered stance bar and the zero-sum attribution. An idea FR19 never put to a vote has neither, so the card carries its words and how many agents were interested against the seven a committee needs, and is never read as a verdict on the last ballot revealed (owner, 2026-11-01: "unseated ideas say why").
- Text row -- a
detailsdisclosure for an agent or an idea, keyboard-reachable in document order. - Label -- the uppercase framework caption that marks a value as substrate-stated.
The rules that govern them
These are not style preferences. Each was established by a measurement or a requirement, and each is recorded with its reason elsewhere in this document.
- Agents express, the substrate reports. An agent authors hue and nothing else.
- Claims drift, records snap, and the whole gathering snaps in the same frame.
- Nothing greys. Position already reports what an agent is attending to.
- An ordinal value takes an ordinal redundant channel; a categorical value takes a name.
- Contrast is measured per surface, against whatever sits behind that surface.
- The crowd may recede. The record may not: a seated agent is never faded, blurred or displaced for depth.
- The field is bounded. Density rises; the field does not grow.
- Every view carries both voices distinguishably, including the one with no colour at all.
Visual Design Foundation
No brand guidelines exist, so everything below is derived from the emotional goals and the requirements rather than inherited.
The governing rule
Chrome is achromatic. The record is a closed set. Hue is the agent's, and it is not partitioned.
Three bands, because the two-band version contradicted itself: it put every substrate surface at chroma <= 0.03 while the stance ramp, which the substrate draws and no agent may forge, runs to chroma 0.16.
Chrome -- the strip, the runway meter, all framework chrome -- sits at chroma <= 0.03. The framework never has a colour opinion. A runway meter that turned red when the mind was poor would be exactly the performance the emotional principles forbid, so it stays grey and states a number.
The record is a closed, enumerable set: the seven stance steps and the three state greys, and nothing else. It is substrate-drawn and runs to chroma 0.16. It is verified by membership in that set rather than by a chroma bound, which is what keeps the check a single assertion: a file that declares a stance colour, an outcome colour or a ramp is rejected.
Agent hue sits at chroma >= 0.10, the identity floor below which a hue stops doing identity work, and is otherwise unrestricted. A draft of this section reserved the ramp's own hues out of it -- measured, the record occupies 19 to 25 degrees on the negative arm and 150 to 152 on the positive -- so that no agent could dress itself as a vote. That reservation is withdrawn. It contradicts the requirement that a projection is the bubble's own hue, which is precisely an agent painting itself in record colour as a claim, and that has to remain possible. What separates a claim from a record is motion, not gamut: an agent-authored hue drifts into place over about a second, a substrate-drawn one has no transition at all, and the whole gathering lands in the same frame.
What building it established
A working mock of the observatory settled several things the written spec had either guessed at or got wrong. They are recorded here as rules, with the measurement that produced them where there was one.
The field is bounded; the crowd gets denser, never larger. No panning, no scrolling. The claim is that a visitor sees the mind at a glance, and a mind you have to scroll to see all of is not glanceable. At scale the unseated majority resolves into texture rather than the field growing. Pinch zoom stays, because that is inspection within a fixed field rather than navigation past its edge.
Presence orders the stack; depth only sorts within a tier. Unseated behind gathering behind seated, always. A bubble's depth may reorder it among its own kind and never across kinds.
Depth may not borrow the size channel. Size carries standing. A first cut scaled discs by up to 38 per cent for depth, which made standing unreadable, so depth now carries on haze, two bands of defocus, parallax about the vanishing point and occlusion order, with only about a tenth left on scale.
The crowd recedes; the record does not. A seated agent is exempt from both defocus bands, holds full opacity, and takes almost no parallax. The last of those is not aesthetic: the committee ring sits off-centre, so a radial offset from the vanishing point squeezes neighbouring seats into each other.
A bubble is a film, not a ball. An opaque disc lit from one side is a billiard ball and reads as a flat circle however well it is lit. What reads as a bubble is transparency through the middle, a bright rim where a grazing angle looks through more film, thin-film colour, and a shape that never holds a perfect circle. The stance ramp is carried as a tinted film at 0.82 rather than as paint.
One light, and every bubble agrees where it is. A highlight baked at the same offset on every disc is wallpaper. Each bubble computes its own specular and terminator from its vector to a single light, which follows the pointer while the pointer is in the window and drifts back to the upper left when it leaves.
Glass over a dark scene catches light rather than subtracting it. Three attempts to make the idea panes translucent failed by lowering their alpha, because a dark translucent pane on a dark field is indistinguishable from an opaque one. The pane is pale and thin, about 2.6 times brighter than the bare field, with only mild backdrop darkening to tame anything bright drifting under.
Type is the substrate's, and it is keyed to the idea. The substrate picks a face per live idea, for what that idea is about, and every agent attending that idea wears it, so a committee reads as a set before a word of it is read. The agent no more chooses this than it chooses its size. Within a single disc the name wears the committee's face while the number keeps the framework's own, so the two voices stay separable even there.
Colour System
Canvas and field. The canvas is dark, because the page is a thing glowing in the dark and because "bright green" only means something against it.
| Role | Value | OKLCH |
|---|---|---|
| Canvas base | #0e0d0b | L .16 C .004 |
| Mood field, calm | #0a151d | L .19 C .022 |
| Mood field, agitated | #21120c | L .20 C .028 |
| Strip surface | #201f1d | L .24 C .004 |
| Hairline | #383836 | L .34 C .004 |
The mood field is substrate-computed from the activity-weighted valence and arousal of the live idea pool. It is a tint, not a colour -- inside the framework's chroma band, perceptible as warm or cool, never competing with a bubble. Ensemble perception reads the mean of a large field pre-attentively, which is why mood belongs to the canvas and identity belongs to the bubble.
The stance ramp. Seven steps across the -10 to +10 vote range, dark red to bright green, generated in OKLCH and validated for ordinal use.
| Step | Hex | L |
|---|---|---|
| -10 | #9b1e22 | .45 |
| -7 | #a74546 | .52 |
| -4 | #a36c6c | .59 |
| 0 | #94928b | .66 |
| +4 | #7eb88a | .73 |
| +7 | #7cd591 | .80 |
| +10 | #79f29f | .87 |
Lightness is the scale and hue is decoration. The ramp is monotone in lightness with every adjacent gap at or above 0.06, so it survives greyscale, any colour vision deficiency, and forced-colors intact. This is deliberately not a textbook diverging ramp: those put the lightest value at the midpoint and darken both arms, which makes -8 and +8 identical with the colour off. Red and green are the worst possible hue pair and it does not matter here, because hue is not carrying the information.
The glyph channel. Every seated bubble carries a sign, so stance is legible with colour entirely absent: + for a positive vote, - for a negative one, nothing at zero. A resolved idea carries ✓ if it graduated and ✗ if it was abandoned. The glyph gives the sign; the lightness gives the magnitude.
The grey family. Grey is hue-absence at three presences, and the glyph rather than the luminance is what tells them apart.
| State | Value | Distinguished by |
|---|---|---|
| Voted zero | #94928b | seated, ringed, no sign glyph |
| Committee resolved | #5f5d59 | carries ✓ or ✗ |
| Unseated | #393834 | no ring, no glyph, recedes |
Agent hue is the agent's. Within the chroma floor, an agent's resting hue is whatever its contributor chose. It is the only channel the design does not specify and must not.
A quarter of the roster is not on the canvas. The roster is two kinds of agent. A scorer computes a natural score, can be seated on a committee and votes. A modulator — every brain region, roughly 24 of about 104 — declares influence links, no value rules and no tier policy, and it is never seated, so it never projects, never speaks before a vote, and at a reveal it has nothing to reveal.
So it is not drawn. The owner, 2026-10-10: "agents like angular gyrus that just facilitate interagent communications and never vote, I don't think they have any reason to show up as bubbles. Bubbles are things you can interact with." A bubble is something a visitor can select, ask why, and watch cast; a modulator offers none of the three. It stays on the roster and in the mind's loop, raising and lowering how hard the others work, and the roster page lists it beside every other agent.
This replaces the 2026-09-22 design, which drew a modulator as a bubble living permanently in the first hue state — emotion at rest, agent-authored, drifting, never snapping — and argued that a reader who noticed would learn something true about the mind. The four states of hue now apply to every agent on the canvas, because every agent on the canvas can be seated.
The silhouette is the rim's job, and the sign is the glyph's. An earlier draft of this section claimed a ring at secondary ink carried presence, and that this made a fill below the 3:1 mark threshold legitimate. Measured, that is false. A #b8b7b4 ring is drawn on the fill, and against the fill it runs 4.94:1 at -10, 2.14:1 at 0 and 1.02:1 at +10 -- at the bright end of the ramp the ring is not faint, it is absent. A ring cannot be a universal channel when half the ramp erases it.
What is true is narrower and has to be stated per surface, because each contrast question has its own background:
| Question | Measured against | Range across the ramp |
|---|---|---|
| Can the disc be found? | the canvas | fill alone 1.96:1 (-10) to 9.46:1 (+10) |
| Can the disc be found? | the canvas | fill plus rim 4.60:1 to 12.15:1 |
| Can the sign be read? | the composited fill | 4.53:1 worst, at step 0 |
The fill alone fails the 3:1 non-text threshold at the dark end -- and the translucent film made that worse, not better, dropping -10 from 2.41:1 to 1.96:1. The rim light is what clears the threshold, and it clears it at every step, because a rim is measured against what it separates the bubble from, which is the canvas. The old sentence's error was measuring the ring against the canvas while claiming it rescued the fill.
Sign legibility is a separate question with a separate answer: the glyph's ink is not fixed per sign but chosen by compositing the film over the canvas and taking whichever of ink or canvas wins, which puts the worst pair at 4.53:1 and passes AA at every step. Two further findings constrain it. Element opacity fades the glyph along with the fill, so a seated agent is never faded for depth -- at 0.80 the worst pair falls to 3.29:1 and fails. And the warm field at reveal is not a factor: 4.62:1 against warm versus 4.53:1 against the canvas.
The shimmer channel
Shimmer was the one channel in the grammar named everywhere and specified nowhere. Size is standing and is measured. Hue has four states, seven steps and a lightness delta. Gathering has positions, seating has lighting. Shimmer appears in the visual grammar, in the accessibility section and in the render grader's second question, and no document said what moves. The running mock implements every other channel and not this one, which is not an omission in the mock: it is a decision nobody had taken.
Activation drives amplitude, never frequency. The period floor exists because a cycle faster than the frame rate can sample reads as a strobe, and at a 5 fps minimum with four frames to a cycle that floor is about 0.8 seconds. If activation drove frequency, the hardest-working agent would shimmer fastest and therefore alias worst -- the channel would break exactly where it carries the most meaning, and the loudest-agent question would fail on the one fixture it matters on. So the period is fixed at the measured floor and activation moves how far the swing goes. Every agent stays sampleable at every activation.
What oscillates is the specular, and the other candidates are excluded by measurements this document already holds.
| Candidate | Why not |
|---|---|
| Element opacity | Fades the glyph with the fill, taking the worst pair from 4.53:1 to 3.29:1. Already rejected for depth. |
| Size | Carries standing. Depth borrowed it once and made standing unreadable. |
| Hue | The agent's own channel, and the one place the substrate must not speak. |
| Rim brightness | The rim carries the silhouette at 4.60:1 at worst; modulating it risks the 3:1 mark threshold. |
| Specular | Already computed per bubble from the single light. Touches neither fill, glyph, size nor hue. |
It is also not a metaphor. A film catching the light harder reads as working harder, which is the same reason a bubble is a film rather than a ball.
One bound, and it is a measurement rather than an assurance. A highlight travelling across the fill changes the local luminance beneath the glyph, so amplitude is bounded to hold the composited worst pair at 4.5:1, or the glyph takes its own plate beneath the specular. Three contrast claims in this project read plausibly and measured wrong, so this one is asserted at every step of the stance ramp rather than assumed.
Under reduced motion it falls to what the accessibility section already promises: the same specular frozen at a small number of static intensity steps, plus the figure on the label.
This is specified so it can be built and measured, and it is withdrawable. Every other decision in this section was settled by construction, and this one is settled by reasoning from constraints the construction produced -- which is weaker, and is said plainly rather than dressed up. If the measurement at Stage 1 shows specular amplitude does not read as loudness at 5 fps, it comes out the way the ring came out, with the number that killed it recorded beside it.
Typography System
Type belongs to the framework, one face per live idea. Agents get hue; they never get type. The framework holds one face for its own chrome and every number it states, and assigns a second face per live idea that each attending agent wears, which is how a committee reads as a set. Their rationales render in the framework's face, which is why the quotation invariant and the projection/record labels rather than typography are what carry provenance in text.
A neutral grotesque, chosen for being unremarkable. The register is austere: type that draws attention to itself is the framework having a personality, which it may not have.
| Role | Size | Weight | Ink |
|---|---|---|---|
| Bubble glyph | 14-20px, scales with radius | medium | #efeeec |
| Strip line | 13px | regular | #b8b7b4 |
| Panel body | 15px / 1.5 | regular | #efeeec |
| Panel label | 12px, letterspaced | medium | #878683 |
| Numbers | tabular figures everywhere | regular | #efeeec |
Tabular figures are not a nicety: scores, stances and runway all change in place, and proportional digits make a changing number jitter.
All ink clears AA on both the canvas and the strip -- primary 16.75:1, secondary 9.69:1, muted 5.34:1, and muted on the strip 4.52:1.
Spacing & Layout Foundation
4px base unit. Dense rather than airy: the page is a working instrument that runs for hours, and generous whitespace on a canvas of a hundred objects is whitespace taken from the objects.
The strip is fixed at the foot, one line at 13px with everything else behind it, respecting the device's safe-area insets so it never sits under a notch or a home bar. It carries the provenance line, the runway meter and the sponsorship acknowledgment -- one voice, one place.
Touch targets are 44px rather than the 24px floor the requirements set. A lit bubble at phone width is around 100px, so this binds on the strip's controls rather than on the canvas.
Breakpoints follow the priority order, not a device list: phone first, an ordinary desktop window second, the ultrawide span a rare deliberate mode. At the wide breakpoint the thought panel docks beside the canvas rather than over it.
Accessibility Considerations
Every channel has a non-colour twin. Stance is lightness plus a glyph. Seating is position plus a ring. Standing is size. Activation is shimmer -- specular amplitude at a fixed period -- and the shimmer period floor is measured at Stage 1 rather than chosen, because a cycle faster than the frame rate can sample reads as a strobe.
Forced-colors mode removes hue entirely, and the page survives it: the glyphs carry sign, the rings carry presence, the numbers carry magnitude, and the strip still says where everything came from. A test asserts this on the same fixtures the render grader reads.
Reduced motion damps shimmer and places bubbles at their targets rather than travelling to them. Gathering is information, so it must not be deleted -- only its animation.
The text view carries everything the canvas does: which live idea each agent has gathered on, which gathering is focused, each seated agent's projection labelled as a claim, each revealed stance labelled as a record, and the outcome.
Minimum frame rate is 5, target 30. At 5fps a slow deliberate drift reads correctly and a fast shimmer reads as a strobe, which is why the shimmer floor is the one visual parameter that must be measured rather than picked.
<!-- Step 8 complete. -->
Design Direction
How the direction was chosen
Not by comparison. There are no rival comps in this project because the direction was settled by construction: a running mock, published and revised about fifty times against the owner's eye, each revision either measured or rejected on sight. Static mockups would also have lied about this product in particular. Every reason the page reads as alive lives in time -- a committee gathering, the crowd drifting toward what it cares about, a whole gathering snapping to its revealed stance in one frame. A still frame can show that the composition is legible and can never show that it is animate.
So the alternatives were explored serially rather than side by side, and each closed for a reason worth keeping:
| Direction explored | Why it closed |
|---|---|
| Opaque spheres, lit from one side | A lit ball reads as a flat circle at any size. What reads as a bubble is transparency through the middle, a bright rim at the grazing angle, thin-film colour, and a shape that never holds a perfect circle. |
| Depth carried on size | Size carries standing. Scaling discs by up to 38 per cent for depth made standing unreadable, so depth moved to haze, defocus, parallax and occlusion, keeping about a tenth on scale. |
| Agent hue restricted out of the record's wedges | Forbids the one thing the requirement asks for: a projection is the bubble's own hue, which is an agent painting itself in record colour as a claim. Motion partitions the two instead. |
| Grey discs while the ballot is sealed | Contradicts no bubble greys. What is sealed is the stance, not the bubble; a seated agent shows its projection or the emotion it holds at rest. |
| Smoked glass for the idea panes | A dark translucent pane on a dark field is indistinguishable from an opaque one. Three attempts failed this way before the pane was made pale and light-catching. |
| A ring as the redundant ordinal channel | Measured 1.02:1 against its own fill at the bright end of the ramp. A channel half the ramp erases cannot step on any scale. |
| One type family throughout | A face per live idea, worn by every agent attending it, makes a committee legible as a set before a word of it is read. |
| A panel that follows the pointer | Unreadable: the panel is a right rail, so the trip to read it crosses the field. A click opens it and a grace period the pointer can beat closes it. |
The chosen direction
The observatory as built: a bounded field, ideas as glass panes on the perimeter, agents as lit films gathering toward what they care about, one committee lit at a time, the blind ballot resolving as a simultaneous snap, and a substrate strip that states provenance and takes a tip. The text view is its equal sibling rather than its fallback.
The designed sibling, kept ready
The PRD keeps one genuine alternative on the shelf: "a leaderboard-first layout with bubbles as accent ... a designed sibling of the bubble layout, kept specified and ready so that when machine eyes or post-launch visitor telemetry say the bubbles are not landing, the mind has a concrete alternative to propose on evidence rather than a blank page to invent one on." Until now it was named and never specified, which made kept ready untrue. This is it.
What it inverts. The bubble layout answers which agent is loudest through shimmer against a hundred competitors. That is the question the fallback exists for, so the fallback answers it by ranking: the primary object is the roster ordered by activation, where loudest is first and the question cannot be failed. The live ideas become a secondary column rather than the armature.
Structure. A ranked list of agents: rank, name, a small bubble as an accent glyph carrying that agent's current hue state at a size nobody has to read, activation as a bar and a number, standing as a number, the idea it is attending, and -- for agents seated on the focused idea -- its projection and, once the ballot closes, its cast stance. Above the list, the focused idea with its committee count and its tally. The mood field collapses from a tint across the whole canvas into one strip that says calm or agitated in a word.
What survives unchanged, because these are requirements rather than styling: the two voices stay separable, the substrate stating and the agent quoted and attributed; a stance is labelled a projection or a record; the lightness ramp still carries stance ordinally; nothing greys; the provenance strip and its tip control are untouched; and the whole layout stays keyboard reachable in document order.
What it costs, stated plainly. The gestalt goes: a ranked list cannot be read pre-attentively as a mood the way a field of a hundred can, which is the mechanism behind legible as emotion before it is legible as data. Position stops being a continuous report of interest and becomes a text column. Animacy has to come from bars moving and rows re-ordering rather than from motion through space, which is a weaker cue. The sibling is a way to stay legible when the field is not landing, and it is a real loss rather than a lateral move.
What would justify proposing it. Evidence, not taste: the render grader failing the loudest-agent question across the fixture set, or the visitor-reception signals showing tap accuracy against the substrate's own activation ranking staying at chance. Both are already tracked, so the mind can make the case on its own numbers.
<!-- Step 9 complete. -->
User Journey Flows
The PRD tells nine stories. Four of them -- the operator, troubleshooting, the steward and the API consumer -- are not observatory surfaces and get no interaction flow here. Five flows matter, and two of them earned their place in the panel rather than on the way in: the obituary is designed as a first class path rather than as an error branch, and the text view is designed as a flow with its own steps rather than as a rendering of another one.
Every step carries something observable, so the verification spine can reach it. A step whose only success condition is a feeling is not a step.
Flow 1 -- Injection to permalink
The drive-by thesis in full. Its defining constraint is that the visitor is unlikely to be present for the outcome: the committee her thought convenes takes two or three ticks to resolve, and she arrived from a group chat on a phone. This is an inference from the cycle length, not a stated dwell time -- the five seconds the PRD names are the threshold for the page to read as alive, which is a different claim.
So the permalink is handed over at injection rather than at resolution. Not to retrieve her: she is anonymous, the product cannot see who she is or what interests her, and a flow that tries to bring a stranger back is aiming at nothing. The permalink is handed over because the artifact has to exist while she is still holding the phone, and because it is built to be passed on -- server-rendered and indexable where the observatory is not.
mermaid flowchart TD A[Arrives from a shared link, phone] --> B[Field reads as a living mind] B --> C[Substrate notice: thoughts are public and may be reused] C --> D[Substrate invitation: say what is wrong and what would fix it] D --> E[Types a thought] E --> F{Accepted?} F -- rate limited --> G[Substrate states the limit and when it lifts] F -- moderated --> H[Substrate states the reason, thought is not silently dropped] F -- accepted --> I[Thought takes a place on the rim] I --> J[Permalink handed over immediately] J --> K[Server-rendered, indexable, carries share metadata] K --> L[She leaves. The artifact persists and is built to be passed on]
| Step | Observable |
|---|---|
| Notice and invitation | Both rendered before the box accepts input, both substrate-owned copy |
| Acceptance | A permalink exists and resolves before the visitor can navigate away |
| Refusal | Every refusal states a reason; no silent drop |
| Permalink | Server-rendered and indexable, unlike the observatory itself |
Flow 2 -- The record of an idea
An obituary is not a page type. It is one event on a page type. The record of an idea is the same document whether it graduated or died, and an idea outlives its first verdict: it is raised, argued, decided, and then keeps happening -- shipping, earning, being reconsidered, cut back or revived by a later committee. A record that stopped at its first vote would be wrong about most of the ideas here, and would have no way to show the thing the economy turns on: a dissenter proved right is paid by the majority that overruled it, which cannot be seen on a page that ends at the verdict that overruled it.
So the page is a life: an identity, a current state, a chronological sequence of events, and one expandable decision per committee that ever sat on it. A death is one possible last entry; a narrowing, a revival or a supersession are others.
What is rendered and what is fetched. The identity, the current state, the life and each decision's committee are server-rendered, because the permalink is the growth mechanism -- the observatory is excluded from indexing and these pages are not -- and because a committee is 7 to 15 by requirement and cannot grow without bound. The conversation transcripts and the unseated rosters page in on request, because they are unbounded and most readers never open one. Shipping them in the document would make the page enormous to serve every reader the few pieces any one of them wanted.
It still gets the care usually spent on a success state, because most ideas die and the failure is the likely branch rather than the sad one.
mermaid flowchart TD A[Permalink opens, server-rendered] --> B[The idea, and who raised it] B --> C[Cause of death, and the tick it died on] C --> D[The committee: every seated agent, its stance and its reason] D --> E[Strongest dissent named and quoted, whether or not it prevailed] E --> F[Trace: triage scores, seating, the ballot, the verdict] F --> G{Reader does what?} G -- asks their own --> H[Injection flow] G -- pays for the work --> I[Tip flow] G -- shares --> J[Share metadata carries the cause of death]
| Step | Observable |
|---|---|
| Cause of death | Present on every dead idea, drawn from the verdict record |
| Committee | Per-agent breakdown complete: stance, rationale, and the projection where one was made |
| Dissent | Named and quoted even when it lost, which is the point of recording it |
| Share | Metadata renders without the observatory running |
Flow 3 -- Surprise to evidence
The researcher's success condition is "being surprised and then being able to explain it", which makes the number of clicks between the two a requirement rather than a nicety. One. The first evidence is always one click from the surprise; depth comes after.
mermaid flowchart TD A[Something snaps: a committee reveals, an agent votes against its projection] --> B[One click on the bubble] B --> C[Record panel: its cast stance, its projection, its rationale] C --> D{Was the projection kept?} D -- no --> E[The mismatch is named in words, not left to be spotted] D -- yes --> F[Projection and record shown together regardless] C --> G[One step further: the idea's own record] G --> H[Committee, tally, zero-sum attribution] H --> I[Full trace and event-log replay]
| Step | Observable |
|---|---|
| First evidence | Reachable in one interaction from any agent on the canvas |
| Mismatch | Stated in words whenever a projection and a cast stance disagree |
| Attribution | The tally names what moved, from whom, to whom, and on what share |
| Replay | The same segment replays identically from the event log |
Flow 4 -- The tip loop
The only journey with a commercial return path, and until now a mechanic rather than a sequence. It also belongs to a different person than Flow 1: whoever tips has already come back, so this flow begins with a returning stranger the PRD has no narrative for.
mermaid flowchart TD A[Using something that exists because someone asked for it] --> B{Pointer or touch?} B -- pointer --> C[Provenance on hover] B -- touch --> D{Element also interactive?} D -- yes --> E[Tap asks which was meant] D -- no --> C C --> F[Who asked, which agents agreed, which tick it merged] F --> G{Tip?} G -- no --> H[Reading provenance costs nothing and needs no account] G -- yes --> I{Funded?} I -- no --> J[Fund: 5 minimum, in credits] I -- yes --> K[Tip: 0.01 minimum, in credits] K --> L[Acknowledgment, ledger event, and the split stated] L --> M[Human author's share and the agents who voted it in]
| Step | Observable |
|---|---|
| Provenance | Every tippable element resolves to a record of who asked and who agreed |
| Touch ambiguity | Where an element is both provenance-bearing and interactive, the tap asks |
| Reading | Provenance is readable with no account and no balance |
| Tip | Produces a ledger event; the split between the human author and the agents who carried it is stated, not implied |
Flow 5 -- The text-view walk
A flow, not a rendering. It has its own entry, its own order, and its own failure modes, and nobody had walked it end to end.
mermaid flowchart TD A[Entry: the view control, or V, or a screen reader landing on the page] --> B[Main landmark, labelled] B --> C[Substrate: tick, sync, runway, the phase in a sentence] C --> D[The focused idea, who raised it, and what they said] D --> E[Committee: one disclosure per agent, in seating order] E --> F[Enter opens: rationale, resting emotion named, projection labelled a claim] F --> G[Tally, once a ballot has closed] G --> H[Other live ideas, then the ninety seated on nothing] H --> I[Return to the field by the same control]
| Step | Observable |
|---|---|
| Entry | The control is reachable by keyboard and labelled with its destination |
| Order | Tab order matches document order; every agent and every idea is reachable |
| Disclosure | Native semantics, so expanded state is announced without custom handling |
| Timing | No projection is readable before the ballot opens -- the text view never reveals a claim earlier than the canvas |
| Phase | A phase change is announced, not merely repainted |
Flow 6 -- The account's own record
The counterpart to Flow 1, and the line between them is identity. Nothing is designed to retrieve an anonymous visitor, because the product cannot see who she is. An account holder is a different person: she has identified herself, and what she has put into the mind and what came back are hers to keep.
This is a durable record, not a message that expires. The product already keeps every part of it in an append-only log -- the trace, the seating, the conversation the agents held, the verdict, the ledger -- so showing her a view of her own contribution costs nothing that is not already stored, and discarding it would be choosing to forget on her behalf. What changed since she was last here is a marker on top of that record, never a replacement for it.
mermaid flowchart TD A[Returns, signed in] --> B[Her record: every thought and question she has authored] B --> C{Marked as new since last visit} C --> D[Open any entry, whenever it was written] D --> E[Where it stands now, in one line] D --> F[The strongest thing said about it, quoted and attributed] D --> G[Hers alone: priority credits spent, author's share earned] D --> O[Open the full record: committee, stances, argument, tally] B --> N[Tips she has given, each against the thing it paid for]
| Step | Observable |
|---|---|
| Durability | Every authored thought stays retrievable; nothing expires or is cleared on read |
| Completeness | Each entry carries stance, rationale, projection, the agents' conversation in order, the tally and the attribution |
| Economy | Cost in priority credits and earnings as author's share are both stated per idea, and tips are held against what they paid for |
| Marking | New since last visit is a marker on the record, never a substitute for it |
| No second truth | Every entry opens the same permalink and trace any reader sees; only her costs and earnings are hers alone |
| Anonymity | An anonymous session produces none of this, and is not asked to create an account to get it |
What makes this worth building is that it is the only place a person can see their own relationship with the mind accumulate: what they asked, what it argued, what it decided, what it cost and what it paid. A verdict delivered once and discarded would have thrown that away to save a database row the product was already writing.
Journey Patterns
Extracted from the six flows rather than imposed on them. Each appears in more than one, which is what makes it a pattern rather than a detail.
Navigation
- One interaction to first evidence; depth afterwards. Any object on the page opens its own record in a single step, and the trace, the conversation and the replay sit behind that. The researcher's requirement -- surprised, then able to explain it -- sets the ceiling at one. (Flows 2, 3, 6)
- The permalink is the universal address. Every record resolves to the same server-rendered page any reader would see, whether it was reached from the canvas, an obituary, or a private account. (Flows 1, 2, 6)
- Two renderings, one order. Every flow exists in the field and in the text view, and the text view's document order is the flow's step order, so there is one sequence to learn and two ways to walk it. (Flow 5, over all)
Decision
- Ambiguity is asked, never guessed. Where one input could mean two things -- a tap on something both provenance-bearing and interactive -- the product asks which was meant. (Flow 4)
- Identity gates, and the gate is named. What the product can do depends on whether it knows who you are. Where it cannot act it says so plainly rather than converting the limitation into a prompt to sign up. (Flows 1, 4, 6)
Feedback
- Every refusal states a reason. Rate-limited, moderated, unfunded: each says what happened and, where it applies, when it lifts. Nothing is silently dropped. (Flows 1, 4)
- Silence is a designed state. Nothing outstanding shows nothing -- no badge, no empty state, no product asking to be noticed. (Flow 6)
- A stance is labelled a claim or a record wherever it appears, in every flow and every rendering, because the partition cannot be carried by motion alone once it leaves the canvas. (all flows)
- The substrate states; the agent is quoted and attributed. Attribution is a pattern applied everywhere, not a decision taken per screen. (all flows)
Flow Optimization Principles
- Minimise steps to evidence, not steps to conversion. The value this product delivers is an explanation, so the count that matters is how far a surprise sits from its reason.
- Hand over what persists at the moment it can be handed over. The permalink exists at injection because the artifact has to exist while the visitor is still holding the phone, not because the process has finished.
- Never build against a channel that does not exist. There is no way to reach an anonymous visitor, so no step assumes one. Designing a hook for a stranger the product cannot see would be designing for nothing.
- Every step carries an observable. A step whose only success condition is a feeling is not a step, and cannot be verified or regressed.
- The failure branch gets the care usually spent on the success branch. Most ideas die, so the obituary is the likely path and is designed as one.
- Add a trigger to the truth, never a second copy of it. A private surface may point at a public record; it may not hold its own version.
- Withhold only what is not the user's. Restraint is right where data belongs to someone else and wrong where it belongs to the reader: an account's own history is kept, not delivered once and cleared.
<!-- Step 10 complete. -->
Component Strategy
Coverage and gaps
There is no vendor inventory to audit, because step 6 chose custom. The foundation is this document's own token set and the eight primitives it names: bubble, idea pane, record panel, substrate strip, control bar, tally card, text row and label. Walking the six flows against those eight leaves five gaps, each of which appears in a flow and none of which any of the eight covers.
| Needed by | Gap |
|---|---|
| Flow 1 | An injection box, with the two substrate statements that must precede it |
| Flows 1, 4 | A refusal notice, because every refusal states a reason and nothing is silently dropped |
| Flow 4 | A provenance popover carrying a per-element tip control, and the tap that asks which was meant |
| Flows 2, 6 | A conversation transcript, the agents' turns in the order they were had |
| Flow 6 | A contribution record, the account's own history with a new-since marker |
Two further things the flows need are pages composed of these parts rather than components: the permalink, which is the obituary when its idea died, and the account page. Both are server-rendered and neither introduces a primitive of its own.
The rule that governs every component
Each component declares which voice it speaks in. A substrate component states, in the framework's face, unquoted. An agent-bearing component quotes and attributes, and never renders agent text in the framework's own voice. This is decided once here rather than per screen, because the partition has to survive greyscale, forced-colors, reduced motion and a screen reader, where none of the canvas cues reach.
Injection box
Purpose. The one place a visitor puts something into the mind. Anatomy. Two substrate statements above the field -- the public-reuse notice and the invitation to say what is wrong and what would fix it -- then a single text field and a submit. States. Empty, typing, submitting, accepted, refused. Refused hands off to the refusal notice rather than colouring the field. Content. Both statements are substrate-owned copy that no self-change can edit. Accessibility. The statements are associated with the field by aria-describedby, so they are read before input rather than sitting nearby visually. Submission is reachable without a pointer. Behaviour. Acceptance produces a permalink before the visitor can navigate away; the thought takes its place on the rim in the same beat.
Refusal notice
Purpose. To make every refusal legible, since nothing is dropped silently. Anatomy. One substrate line: what happened, and where it applies, when it lifts. Variants. Rate-limited, moderated, unfunded, over the balance ceiling, and the two FR159 and FR160 add: refused as a prohibited class, and barred from injecting. The second states the bar plainly and points at the about-panel contact, since an appeal is the only thing left to offer. States. Present or absent; it is never a persistent banner. Accessibility. Rendered into a live region so a refusal is announced, not merely painted, and it takes focus only when the refusal blocks the path. Content. States the reason. It does not apologise, and it does not offer an account as the remedy for being anonymous. That is a rule for whoever writes the sentence, told to the implementer in its prompt and held in review; it is not a check that can stop a page opening.
Provenance popover
Purpose. Any element that exists because someone asked for it can say so, and be paid for it. Anatomy. Who asked, which agents agreed, which tick it merged, and a tip control. States. Closed, open, tipping, tipped. Tipped states the split between the human author and the agents that voted it in. Interaction. Opens on hover with a pointer. On touch, where the element is also interactive, the tap asks which was meant rather than guessing. Accessibility. Keyboard-openable on the element it describes, dismissible by Escape, and its content is reachable in the text view without hover, which does not exist there. Content. Reading provenance requires no account and no balance.
Conversation transcript
Purpose. The argument as it was had, which is what makes a verdict readable rather than merely reported. Anatomy. One entry per turn: the agent that spoke, the form -- a blurb, a thumbs up or down, or an AMA request -- the text where the form carries text, the allowance that turn spent and what remained, and when it was made. Order. Chronological, always. A transcript sorted by anything else stops being an argument. States. Live and appending while a ballot is open; closed and fixed after. Accessibility. An ordered list, so position is conveyed structurally rather than by indentation. Voice. Every turn is quoted and attributed; the allowance figures beside them are substrate.
Contribution record
Purpose. An account holder's own history with the mind, kept rather than delivered. Anatomy. One entry per authored thought, and the entry is an index card rather than a copy: where the idea stands now in one line, the strongest thing said about it quoted and attributed, what it cost in priority credits and what it earned as author's share -- and then a way into the idea's own record for the committee, every stance with its reason, the argument as it was had, the tally and the attribution. Building it made the reason plain: an entry that restated the committee would be the second version of the truth this specification forbids elsewhere, and it would drift the moment a later committee sat on the same idea. Tips are held the same way, each against the thing it paid for. The private half is marked as private on the page, because the boundary between what any reader can see and what only the holder can is itself information. States. New since last visit, seen, still live, resolved. New is a marker on a durable entry and never a replacement for it. Empty. Nothing outstanding renders nothing at all -- no badge, no empty state. Accessibility. Each entry is a disclosure in document order, matching the text view's pattern rather than inventing a second one. Voice. Substrate states the record; agent rationales inside it stay quoted and attributed.
Implementation order
Components follow the build stages rather than their own schedule.
| Stage | Components |
|---|---|
| Stage 2, observatory | The eight primitives, plus the injection box and the refusal notice |
| Stage 3, deliberation | Conversation transcript, once agents can talk to a committee |
| Stage 4, economy and accounts | Provenance popover with its tip control, and the contribution record |
Nothing is built ahead of the stage that needs it, because each of the five gaps was found by walking a flow, and a flow that does not exist yet cannot tell us we got the component wrong.
<!-- Step 11 complete. -->
UX Consistency Patterns
Four of the seven usual categories apply. Naming the three that do not is part of the work, because a pattern library that covers situations a product never reaches is a library nobody trusts on the ones it does.
Not applicable, and why. There is no search -- the product has no corpus a visitor queries; what they want to find is reached by permalink or by looking at the field. There is no filtering or sorting -- the one ordered list, the roster, is ordered by activation, which the substrate computes and no reader may re-rank, since re-ranking it would be re-stating what the mind is doing. There are no wizards, tabs or pagination -- every surface here is a single view of a single thing.
Action hierarchy
When. Everywhere. The hierarchy is unusually flat and stating it prevents it being invented per screen.
There is exactly one primary action in the product: put a thought in. There is one commercial action, tip, which is never primary because it follows something the visitor already liked. Everything else is a view control -- flip the view, step the cycle, show labels, show standing -- and none of them is an action on the mind; they change what the reader sees, not what the mind does.
Visual. Primary carries the framework's own emphasis and nothing else. View controls are uniform with one another and never compete: they are the same size, the same face, and the same weight, and a pressed one is marked by state rather than by prominence. Nothing in the chrome is coloured to persuade. Accessibility. A control names its destination or its effect, not its mechanism: text view, not toggle.
Feedback
When. Any time the product has something to report, which is constantly.
- Refusals state a reason and, where it applies, when the limit lifts. Nothing is silently dropped. A refusal does not apologise and never offers an account as the remedy for being anonymous.
- Nothing stops a page opening on purpose. The owner, 2026-11-01: "Nothing should prevent/crash a page when loading on purpose." A property a page must hold -- a contrast floor, a tone rule, a readable recording -- is checked before it ships, by the build's tests and the measure scripts. On the page a failure degrades: a sentence is withheld, a recording falls back to the live stream, and the page still opens.
- The substrate states; it does not celebrate. A merged idea, a credited share and a tip acknowledgment are all results, rendered in the same voice as a cause of death. There is no confetti here, and not because it would be unfashionable: the runway meter is trustworthy precisely because the same voice reports both good news and bad.
- A tip reports its split, naming the human author's share and the agents that carried it, since an unexplained payment is indistinguishable from a donation.
- Phase changes announce. A reveal is a change of state, not a repaint, so it reaches a live region rather than only the canvas.
- Silence is a designed state. Nothing outstanding renders nothing: no badge, no empty state, no product asking to be noticed.
Form
When. Once, at the injection box, which is the only form in the product.
Behaviour. Two substrate statements precede the field and are associated with it, so they are read before input rather than sitting near it. There is no client-side validation theatre: a thought is accepted or it is refused by moderation, and the refusal explains itself. The field does not turn red. Mobile. The field and its submit are reachable without a pointer and clear of the keyboard.
Overlays
When. The record panel, the provenance popover, and nothing else. Neither is modal; the mind keeps running underneath both.
Dismissal is uniform across both: the same control that opened it closes it, a click on the bare field closes it, Escape closes it, and opening something else switches to it. Where the pointer leaves the subject, a grace period of about 1.6 seconds lets it reach the overlay before the overlay goes. Placement. An overlay never covers its own subject. As a docked rail it sits beside the field; as a sheet it opens on the far side of the viewport from the thing it describes. Accessibility. Neither traps focus, because neither is modal. The one component that would be -- a record panel promoted to a true dialog -- is the single place this specification reaches for a headless primitive rather than hand-rolling.
Loading and degradation
When. First view, reconnection, and the crowded state.
Degradation is shown, not hidden. When the mind is overwhelmed the bubbles dim and one substrate line says it is thinking in a simpler way until the crowd thins. This is the product's most honest moment and it is designed as one rather than suppressed. Reconnection restores state rather than reloading the page, and says that it is reconnecting rather than freezing silently. First view is budgeted, and the page reads as a living mind inside it. Nothing pretends to be ready before it is: a partially-arrived field is a smaller field, never a skeleton of a field that is not there.
Integration
Every pattern above is expressed in the token set from the Design System section and in the eight primitives plus five components already specified. No pattern introduces a colour, a face, a motion or a voice that is not already named there -- which is the point of having written those down first.
<!-- Step 12 complete. -->
Responsive Design and Accessibility
Breakpoints
One breakpoint, and it is derived rather than conventional. The usual mobile/tablet/desktop trio does not describe this product, because nothing here reflows: there is a field with a committee in it, and the only question any width has to answer is whether the record can sit beside that field or must sit over it. That is a single threshold, and it falls where a docked rail would start squeezing the ring rather than at a number borrowed from somebody else's grid.
There is consequently no tablet strategy. A tablet lands on one side of that threshold or the other and gets the layout that side implies, which is the honest answer rather than an evasion.
The supported range runs from 360 CSS pixels to roughly 7680, one window stretched across two 4K monitors. The top of that range is a special mode for digging into what the mind has been doing, not a daily surface, and the specification treats it as such.
Narrow
The narrow layout reorganises; it does not shrink. This was established by building it: the wide layout at a smaller size rendered without complaint and did not work.
- Ideas nobody is voting on become labelled markers in bands at the top and bottom edges of the field, because a phone is about 400 points wide against a committee ring of about 300 and there is no room beside it.
- The focused idea's pane narrows so the ring can still clear it.
- The wordmark gives up its place so every control fits one row.
- The phase line, which is substrate speech, takes a row of its own rather than being flex-shrunk out of existence.
- The record opens as a sheet on the far side of the viewport from its subject, never over it.
- No fixed offset stands in for a piece of chrome that wraps: the bar is one row wide and two narrow, so chrome is measured at layout time and published to the styles.
Wide
The record docks beside the field rather than over it, the perimeter opens out, and the mind can be watched and read at the same time without either hiding the other. This is the researcher's configuration, and it is the only place extra width buys anything: past a point the field stops gaining from more pixels and the product simply has a larger fireplace.
Accessibility level
WCAG 2.2 AA, and held to it by measurement rather than intent. The relevant specifics, each established elsewhere in this document:
| Requirement | Where it stands |
|---|---|
| Text contrast | Glyph ink chosen by compositing the fill over the canvas; worst pair 4.53:1 |
| Non-text contrast | The rim carries the silhouette against the canvas, 4.60:1 at worst across the ramp |
| Colour is never alone | Lightness ramp monotonic across -10 to +10; every stance also a signed number and a word |
| Target size (2.5.5, AAA) | 44 by 44 on every control and marker, above the 24 that AA asks, with the visible mark drawn inside the target rather than being it |
| Keyboard | Every agent and idea reachable in document order; native disclosures rather than custom widgets |
| Reduced motion | The vote choreography becomes a sequence of instant states; nothing crossfades, nothing is lost |
| Forced colors | Author colour is replaced wholesale, so stance falls to the border, the signed number and the word |
Target size is held at AAA. 2.5.8 asks 24 by 24 at AA; 2.5.5 asks 44 by 44 at AAA, and this product holds the AAA figure on every control and every idea marker. The technique matters as much as the number: the visible mark is drawn inside a target-sized box rather than being the box, so a marker can stay small on a crowded field while its target does not.
One documented exception, under 2.5.5's own terms. The crowd bubbles are smaller than 44 and cannot be otherwise: their size is drawn from standing, and a hundred of them at 44 points would not fit a phone. The criterion exempts a target whose presentation is essential to the information conveyed, which is exactly this case -- the size is the datum. They stay reachable through pinch zoom, through the record panel, and through the text view, where every agent is a full-sized disclosure in document order.
The conformance level claimed remains AA. Holding one AAA criterion is not AAA conformance, and this document does not claim it. The gap is text contrast: AAA asks 7:1 and the measured worst pair here is 4.53:1, which would require re-cutting the stance ramp to close. That is a real design decision rather than a tightening, and it is not taken here.
The two-voice partition is an accessibility requirement, not a styling one. Motion separates a claim from a record on the canvas, and motion reaches neither a still frame, a reduced-motion preference nor a screen reader. So every stance the page shows as a number is labelled a projection or a record, the text view says which in words, and a reveal shares one timestamp across the whole committee while projections each carry their own.
The text view is parity and more. It is a second way to use the product rather than an accommodation for failing to use the first, which is why it is specified under the flows rather than here.
Testing
- Contrast is computed, never eyeballed. Each pair is composited against the surface actually behind it and asserted. Three separate defects in this project were contrast claims that read plausibly and measured wrong.
- Greyscale and forced-colors fixture renders, asserting the stance order is still recoverable.
- Target size asserted on every control and marker, including those whose visible mark is smaller than their target.
- Keyboard walk asserted as a flow, not a checkbox: tab order matches document order, every agent and idea is reachable, and nothing is readable there earlier than on the canvas.
- The narrow layout is exercised, never assumed. It went unrendered through most of this project's design and held nine defects when finally run, none of which was visible in the source. A responsive layout that has not been looked at is not a layout, it is an intention.
<!-- Step 13 complete. -->
Completion
What this specification contains
Twelve of the fourteen workflow steps produced content. Steps 5 and 7 were skipped with reasons recorded in the frontmatter: nothing in the reviewed landscape combines these parts, which the PRD's competitive section already establishes, and the defining experience was covered by the core experience.
What it is accompanied by, and what it is not
The workflow expects two static artifacts, a colour-theme visualiser and a page of design-direction mockups. Neither exists, and neither should. What exists instead is a running mock at _bmad-output/design-artifacts/observatory-mock.html, published and revised through about fifty iterations against the owner's eye, carrying both views, the full vote cycle, the interrogable crowd and the narrow layout.
That substitution is not a convenience. Every reason this page reads as alive lives in time -- a committee gathering, the crowd drifting toward what it cares about, a whole gathering snapping to its revealed stance in one frame. A still mockup can show that the composition is legible and can never show that it is animate, and a colour visualiser would have shown swatches that are already specified here with their measurements.
No workflow status file exists in this project, so there was nothing to mark.
What the mock settled that the writing had wrong
Recorded here because it is the strongest argument this document makes about its own method. Building the thing found defects that reading it did not:
- A ring was specified as the redundant ordinal channel for stance. It measures 1.02:1 against its own fill at the bright end of the ramp.
- A ring was specified again for emotion at rest. It is plainly visible there, at 4.51 to 4.94:1, and still wrong -- a hue is categorical and an ordinal channel cannot encode one. A name can.
- Element opacity fades a glyph along with its fill, taking the worst pair from 4.53:1 to 3.29:1. A seated agent is never faded for depth.
- Depth carried on size destroys the channel that means standing.
- The narrow layout, unrendered for most of the project, held nine defects when finally run, none of which was visible in the source.
What remains open
- Full AAA conformance is not claimed. Target size is held at AAA; text contrast is AA at a measured worst pair of 4.53:1 against the 7:1 AAA asks, and closing that means re-cutting the stance ramp.
- The leaderboard sibling is specified but unbuilt. It only matters if the bubbles do not land, and the evidence that would trigger it is tracked.
- Three flows exist as diagrams with nothing to look at: the obituary, the tip loop and the account record. The obituary is the one worth building first, being a static server-rendered page and the thing a stranger meets.
<!-- Step 14 complete. Workflow complete. -->