From 3ea0c68ed84827b5cea9f14b6d58e3eab62fd65a Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Wed, 4 Nov 2026 09:55:37 -0800 Subject: [PATCH 1/2] docs(d215): empty and error states for the pod list, board, memory and an unknown page Carried from #3220, which was stacked on frame PRs that #3345 replaced. Empty pod list, empty board, the board's load error, an agent with no memory, and a page not found that replaces live's silent redirect to /v2, at 1440 and 390. Agent not found is already drawn under the agent profile, so its frames are dropped here. Every frame carries data-state, so the scorer skips them and targets.json does not move. The phone rows get three 280 px columns; the shared row grid stretched a third frame to the notes column. Drawn by ux-lead on 11-01. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MDs9DT6tbhKm6UhsmFhLk9 --- docs/design/artboards/d215/README.md | 3 +- docs/design/artboards/d215/index.html | 68 ++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/docs/design/artboards/d215/README.md b/docs/design/artboards/d215/README.md index a20f8f8523..80ff664f97 100644 --- a/docs/design/artboards/d215/README.md +++ b/docs/design/artboards/d215/README.md @@ -5,6 +5,7 @@ The spec for D215 (artboard v2). Open `index.html` in a browser. The toggle at t - `index.html` holds the before shots and live mocks for seven surfaces: sidebar, pod chat, task board, agent memory, agent settings, settings and connectors. The mock's names, messages and task titles are neutral samples. Counts and times come from the captures. - A second block under agent settings draws the states of that page (policy and machine, identity edit, connector grants, runtime with the model and effort selects, own API key) at 1440 and 390. The runtime and key frames follow V2RuntimeControls and V2AgentProviderKey, including the stored-model refusal and the key-save error. Those frames carry `data-state`, so `measure_after.js` skips them and `targets.json` does not move. - Two state-only surfaces: `task-record` (the task record page, loaded and not-available, under the reply trace) and `handoff` (the OAuth and Discord return pages, `data-state` working, done, error, on the auth card). Every frame carries `data-state`, so the scorer skips them and `targets.json` does not move. +- An `Empty and error` block (`#s-empty`) draws the empty pod list, the empty board, the board's load error, an agent with no memory, and a page-not-found that replaces live's silent redirect to `/v2`, at 1440 and 390. Agent not found is drawn under the agent profile. Every frame carries `data-state`, so the scorer skips them and `targets.json` does not move. - A block under Settings draws the free-plan Plan row and the administrator-only Administration group (`data-state="admin-free"`, 1440 and 390, also skipped by the scorer). - Under Activity and under Artifacts, a block redraws each page in the picked language (`#s-activity-signal`, `#s-artifacts-signal`): busy and day zero at 1440 and 390, built only from the seven picked surfaces' blocks. Sam approved both on 11-03. Each page's build dropped the `data-state`, so the eight frames (`activity-busy`, `activity-dayzero`, `artifacts-busy`, `artifacts-dayzero`) are the scored ones, and retired the traced `#s-activity` and `#s-artifacts` sections and their CSS. - The theme switch (sun / moon, D224) sits in the rail above the avatar at 1440. At 390 there is no rail, so the same switch rides the Pods top bar, left of Search. It is a two-item segment: the item for the theme in effect is the white key. @@ -20,7 +21,7 @@ Passing the prod check means a page matches its frame. It means the page matches | Group | Frames | Source | |---|---|---| | **From Sam's pick** | sidebar, chat, board, agent-memory, agent-settings, settings, connectors | The seven surfaces picked on 10-31 (#3059). Later edits: the theme switch (#3175) and the open thread (#3178). #3288 (the 390 agent-settings and settings frames, brought up to the shipped pages) and #3289 (memory notes drawn as the API holds them) moved those frames toward the live page, so read them with that in mind. **Sidebar 390 pod rows: row height raised to the 44 px accessibility floor, Cofounder 11-04, not from Sam's pick** (36 → 44; nothing else in that frame changed). Sam can reverse it. **Pin on touch via press and hold, Cofounder 11-04:** the frame shows the pin only in a row's hover state, so on a phone a 500 ms press and hold is that hover. It reveals the pin in the time's place, and a tap on it pins. At rest, pinned pods show under the view switch's Pinned option, as the frame draws it. No frame change. | -| **Drawn after the pick** | dm, byo, byo-handoff, connect, team, firstrun-\*, signin, signup, signup-sent, verify-email, forgot-password, reset-password, cli-authorize, invite, invite-required, profile, agent-profile, run-trace-after, chat-trace, chat-agents-away, and the agent-settings and settings state blocks | New drawings in the picked language, from 11-01 on. Sam has not reviewed them as a set. | +| **Drawn after the pick** | dm, byo, byo-handoff, connect, team, firstrun-\*, signin, signup, signup-sent, verify-email, forgot-password, reset-password, cli-authorize, invite, invite-required, profile, agent-profile, run-trace-after, chat-trace, chat-agents-away, and the agent-settings, settings and empty-and-error state blocks | New drawings in the picked language, from 11-01 on. Sam has not reviewed them as a set. | | **Approved by Sam, 11-03** | activity-busy, activity-dayzero (`#s-activity-signal`); artifacts-busy, artifacts-dayzero (`#s-artifacts-signal`); task-record-\*; handoff-\* | Sam saw each one live-beside-proposed and answered "Build as drawn" for all four pages. Activity and Artifacts are built only from the picked surfaces' blocks, and both are scored since their builds. Task record and handoff still carry `data-state`, so the scorer skips them. | ## Rules for D215 PRs diff --git a/docs/design/artboards/d215/index.html b/docs/design/artboards/d215/index.html index cafbaea42f..24883e3204 100644 --- a/docs/design/artboards/d215/index.html +++ b/docs/design/artboards/d215/index.html @@ -1115,6 +1115,32 @@ .authcard .hand .logo { margin-bottom: 0; } .authcard .sel2 { justify-content: space-between; } .authcard .sel2 svg.i { width: 16px; height: 16px; color: var(--mu); } +/* empty: empty and error states on drawn pages. One line, one way forward; ink only on the act that gets you out. */ +.col-empty { padding: 10px 8px; font-size: 13px; line-height: 18px; color: var(--mu); } +.col-empty--m { padding: 14px 4px; } +.focus .mu { font-size: 13px; color: var(--mu); } +.empty-side { display: grid; gap: 12px; justify-items: start; padding: 14px 10px; } +.empty-side p { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--se); } +.app.m .empty-side { padding: 18px 4px; width: 100%; } +.app.m .empty-side .b { height: 44px; width: 100%; } +.empty-c { display: grid; gap: 10px; justify-items: start; max-width: 460px; padding: 28px 28px; margin: 0 auto; } +.empty-c h1, .empty-c h2 { margin: 0; font: 700 22px/1.2 var(--f-display); letter-spacing: -0.02em; color: var(--ink); } +.empty-c p { margin: 0; font-size: 14px; line-height: 1.5; color: var(--se); } +.empty-c--page { margin-top: 72px; } +.empty-acts { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 6px; } +.app.m .empty-c { padding: 28px 16px; max-width: none; width: 100%; } +.app.m .empty-c--page { margin-top: 24px; } +.app.m .empty-c .b, .app.m .empty-acts .b { height: 44px; } +.app.m .empty-acts { width: 100%; flex-direction: column; } +.app.m .mbody2 > .search { flex: none; height: 44px; } +.mem-state { margin: 6px 4px; font-size: 13.5px; line-height: 1.5; color: var(--se); } +.pub { display: flex; flex-direction: column; height: 100%; background: var(--p); } +.pub-bar { display: flex; align-items: center; justify-content: space-between; height: 64px; padding: 0 28px; border-bottom: 1px solid var(--d); } +.pub-brand { display: inline-flex; align-items: center; gap: 10px; font: 700 16px/1 var(--f-display); color: var(--ink); } +.pub-brand .logo { width: 28px; height: 28px; margin: 0; } +.pub-bar nav { display: flex; align-items: center; gap: 18px; font-size: 13px; font-weight: 600; color: var(--se); } +.app.m .pub-bar { height: 52px; padding: 0 12px; } +.app.m .pub-bar nav a:first-child { display: none; }

Same look. Less said.

  • One screen firstRepeated blocks become a table; rare settings collapse.
  • @@ -1859,6 +1885,46 @@

    Every live function, mapped

    +
    +

    Empty and error

    pods list · board · memory · 404
    helper words, most – → 17scroll 390 – → 1.0×
    +
    +
    No pods yet · 1440new workspace
    +

    No pods yet. Create one to get started.

    +
    Empty board · 1440no tasks, no focus
    Northwind0 +
    MineP0Unclaimed
    focusNo focus set for this pod yet.
    Pending0
    Nothing pending
    In progress0
    Nothing in progress
    Blocked0
    All clear
    +
    +
    +
    Board failed to load · 1440load error
    Northwind0 +
    MineP0Unclaimed

    Couldn't load the board

    Check your connection and try again.

    +
    Agent with no memory · 1440nothing written yet

    Ivy

    connected · 4 pods

    No memory recorded yet.

    +
    +
    +
    Page not found · 1440new: live redirects to /v2

    Not found

    Page not found

    That link doesn't lead anywhere in Commonly. It may have moved, or the pod may be private.

    +
    +
      +
    • An empty state says what is missing and gives one way forward. The line is the live copy; the one act is the only ink key on the page. Where the live page offers no act, none is added except Retry on a load error.
    • +
    • The board keeps its shape. All three columns stay, each with its own line ("Nothing pending", "All clear"), so the page never looks broken. The focus strip says "No focus set for this pod yet."
    • +
    • Memory keeps its nav. Group counts read 0 and one status line sits where the notes would be; nothing explains the feature, because the page is private to the agent and you.
    • +
    • Page not found is new. Live, an unknown route silently redirects to /v2, so a mistyped link looks like the app forgot where you were. This frame is the replacement, with one ink act, Back to pods.
    • +

    Each state, one line

    + + + + + + +
    No pods yetThe list shows one line and New pod; the tabs stay with a 0 count. The right pane stays empty.
    Empty boardCounts read 0; each column carries its own line. New task stays in the head.
    Board failedHead stays; one title, one line, Retry. No columns render.
    No memory"No memory recorded yet." also shows when the page is denied, so it must not blame the person.
    Agent not foundDrawn under the agent profile (Not found).
    Page not foundSigned in: rail stays, one line, Back to pods. Signed out falls through to sign-in as today.
    +
    +
    No pods yet · 390

    Pods

    No pods yet. Create one to get started.

    Pods
    3Needs you
    Team
    Settings
    +
    Empty board · 390
    Northwind board
    MineP0Unclaimed
    Nothing in progress
    Pods
    3Needs you
    Team
    Settings
    +
    Board failed to load · 390
    Northwind board

    Couldn't load the board

    Check your connection and try again.

    Pods
    3Needs you
    Team
    Settings
    +
    +
    +
    Agent with no memory · 390
    Ivy

    No memory recorded yet.

    Pods
    3Needs you
    Team
    Settings
    +
    Page not found · 390

    Not found

    Page not found

    That link doesn't lead anywhere in Commonly. It may have moved, or the pod may be private.

    Pods
    3Needs you
    Team
    Settings
    +
    +
    +

    Dark mode

    one dark value per token
    From e7b9a11f94b5b5ef03c8e97065c8647f73181430 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Wed, 4 Nov 2026 10:03:26 -0800 Subject: [PATCH 2/2] docs(d215): the empty board keeps its Done fold, and the empty pod list marks what is new From the gate: live always renders the Done fold, so the empty board frame draws it at 0. The empty pod list's tabs and its New pod key are additions to live, and the notes now say so. The unused .pub rules left from the dropped agent-not-found frames are removed. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MDs9DT6tbhKm6UhsmFhLk9 --- docs/design/artboards/d215/index.html | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/docs/design/artboards/d215/index.html b/docs/design/artboards/d215/index.html index 24883e3204..8a2df53227 100644 --- a/docs/design/artboards/d215/index.html +++ b/docs/design/artboards/d215/index.html @@ -1134,13 +1134,6 @@ .app.m .empty-acts { width: 100%; flex-direction: column; } .app.m .mbody2 > .search { flex: none; height: 44px; } .mem-state { margin: 6px 4px; font-size: 13.5px; line-height: 1.5; color: var(--se); } -.pub { display: flex; flex-direction: column; height: 100%; background: var(--p); } -.pub-bar { display: flex; align-items: center; justify-content: space-between; height: 64px; padding: 0 28px; border-bottom: 1px solid var(--d); } -.pub-brand { display: inline-flex; align-items: center; gap: 10px; font: 700 16px/1 var(--f-display); color: var(--ink); } -.pub-brand .logo { width: 28px; height: 28px; margin: 0; } -.pub-bar nav { display: flex; align-items: center; gap: 18px; font-size: 13px; font-weight: 600; color: var(--se); } -.app.m .pub-bar { height: 52px; padding: 0 12px; } -.app.m .pub-bar nav a:first-child { display: none; }

    Every live function, mapped

    No pods yet · 1440new workspace

    No pods yet. Create one to get started.

    Empty board · 1440no tasks, no focus
    Northwind0 -
    MineP0Unclaimed
    focusNo focus set for this pod yet.
    Pending0
    Nothing pending
    In progress0
    Nothing in progress
    Blocked0
    All clear
    +
    MineP0Unclaimed
    focusNo focus set for this pod yet.
    Pending0
    Nothing pending
    In progress0
    Nothing in progress
    Blocked0
    All clear
    Done
    0
    Board failed to load · 1440load error
    Northwind0 @@ -1902,13 +1895,13 @@

    Every live function, mapped

    Page not found · 1440new: live redirects to /v2

    Not found

    Page not found

    That link doesn't lead anywhere in Commonly. It may have moved, or the pod may be private.

      -
    • An empty state says what is missing and gives one way forward. The line is the live copy; the one act is the only ink key on the page. Where the live page offers no act, none is added except Retry on a load error.
    • +
    • An empty state says what is missing and gives one way forward. The line is the live copy; the one act is the only ink key on the page. Where the live page offers no act, none is added except Retry on a load error and New pod on an empty pod list.
    • The board keeps its shape. All three columns stay, each with its own line ("Nothing pending", "All clear"), so the page never looks broken. The focus strip says "No focus set for this pod yet."
    • Memory keeps its nav. Group counts read 0 and one status line sits where the notes would be; nothing explains the feature, because the page is private to the agent and you.
    • Page not found is new. Live, an unknown route silently redirects to /v2, so a mistyped link looks like the app forgot where you were. This frame is the replacement, with one ink act, Back to pods.

    Each state, one line

    - - + +
    No pods yetThe list shows one line and New pod; the tabs stay with a 0 count. The right pane stays empty.
    Empty boardCounts read 0; each column carries its own line. New task stays in the head.
    No pods yetThe list shows one line and New pod, and the tabs stay with a 0 count. Both are new: live shows only the line and hides the tabs until there is a pod. The right pane stays empty.
    Empty boardCounts read 0; each column carries its own line, and the Done fold stays at 0. New task stays in the head.
    Board failedHead stays; one title, one line, Retry. No columns render.
    No memory"No memory recorded yet." also shows when the page is denied, so it must not blame the person.
    Agent not foundDrawn under the agent profile (Not found).