{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Snapshot status projection"
  ],
  "animated": false,
  "apis": [
    {
      "name": "ctx.ui.setStatus",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "ctx.ui.setWidget",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "pi.on",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#events"
    },
    {
      "name": "wrapTextWithAnsi",
      "url": null
    }
  ],
  "applicability": [
    "Use this when several job or workflow states need a coherent display."
  ],
  "category": "lifecycle",
  "categoryLabel": "Lifecycle and mounting",
  "consequences": [
    "Status and detail can reflect one coherent snapshot.",
    "Dimension changes and external status effects remain separate concerns."
  ],
  "family": "presentation",
  "familyLabel": "Presentation",
  "id": "snapshot-lens",
  "implementation": [
    "Separate projection from mutations and external status effects.",
    "Invalidate dimension-dependent layout when identity or coverage changes.",
    "The cmux example is an external sidebar effect rather than a native Pi mount."
  ],
  "intent": "Derive compact status and bounded detail from lifecycle snapshots.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/snapshot-lens.json",
  "kind": "screen",
  "knownUses": [
    {
      "example": "subagents-widget-projection",
      "moreRefs": 0,
      "refs": [
        {
          "file": "src/tui/render.ts",
          "lines": "2520-2585",
          "sha": "6826b054",
          "url": "https://github.com/nicobailon/pi-subagents/blob/6826b0545216077195ae8ffe468a6434715814b7/src/tui/render.ts#L2520-L2585"
        },
        {
          "file": "src/tui/render.ts",
          "lines": "3060-3110",
          "sha": "6826b054",
          "url": "https://github.com/nicobailon/pi-subagents/blob/6826b0545216077195ae8ffe468a6434715814b7/src/tui/render.ts#L3060-L3110"
        }
      ],
      "repo": "pi-subagents",
      "repoUrl": "https://github.com/nicobailon/pi-subagents",
      "title": "Project workflow state before rendering status widgets"
    },
    {
      "example": "cmux-lifecycle-sidebar",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/cmux/index.ts",
          "lines": "60-89",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/cmux/index.ts#L60-L89"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Project agent lifecycle into cmux status slots"
    }
  ],
  "linkedFrom": [],
  "links": {
    "agentGuide": "https://pi-tui.ratstack.sh/llms.txt",
    "index": "https://pi-tui.ratstack.sh/patterns.md",
    "skill": "https://pi-tui.ratstack.sh/skills/build-pi-tui-component.md"
  },
  "mdUrl": "https://pi-tui.ratstack.sh/patterns/snapshot-lens.md",
  "motivation": "Subagents derives workflow widgets from job snapshots, while Dot314 projects lifecycle data into external sidebar slots.",
  "name": "Snapshot Lens",
  "participants": [
    {
      "name": "ctx.ui.setStatus",
      "role": "Writes or clears one named footer slot.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "ctx.ui.setWidget",
      "role": "Mounts, replaces or clears one near-editor widget.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "pi.on",
      "role": "Registers ordered extension event handlers.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#events"
    },
    {
      "name": "Job snapshot",
      "role": "Supplies lifecycle facts without being mutated by rendering.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "provides the two display surfaces",
      "id": "signal-pair",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/signal-pair.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/signal-pair.md",
      "name": "Signal Pair",
      "url": "https://pi-tui.ratstack.sh/patterns/signal-pair/"
    }
  ],
  "sampleCode": {
    "code": "// Snapshot Lens: project lifecycle facts into a compact signal and bounded detail.\nimport { wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\ntype Job = { title: string; status: \"running\" | \"queued\" };\ntype Snapshot =\n  | { kind: \"idle\"; queued: number }\n  | { kind: \"running\"; phase: string; jobs: readonly Job[] }\n  | { kind: \"ended\"; completed: number };\nfunction project(snapshot: Snapshot) {\n  switch (snapshot.kind) {\n    case \"idle\": return { signal: snapshot.queued + \" queued\", lines: [\"Workflow queue\", snapshot.queued + \" jobs queued · no active work\"] };\n    case \"running\": return {\n      signal: snapshot.jobs.filter(job => job.status === \"running\").length + \" running\",\n      lines: [\"Task workflow · \" + snapshot.phase, ...snapshot.jobs.map(job =>\n        \"  - \" + job.title + \" / \" + job.status)],\n    };\n    case \"ended\": return { signal: undefined, lines: [\"Workflow complete\", snapshot.completed + \" jobs checked · lifecycle slot cleared\"] };\n  }\n}\nexport const story: PatternStory = {\n  id: \"snapshot-lens\", title: \"Snapshot Lens\", kind: \"screen\",\n  apis: [\"ctx.ui.setStatus\", \"ctx.ui.setWidget\", \"wrapTextWithAnsi\"],\n  states: [\n    { id: \"idle\", label: \"Idle snapshot\" },\n    { id: \"running\", label: \"Workflow snapshot\", steps: [{ type: \"action\", name: \"running\" }] },\n    { id: \"ended\", label: \"Lifecycle ends\", steps: [{ type: \"action\", name: \"ended\" }] },\n  ],\n  setup({ ui, theme, action, tui }) {\n    // Synthetic lifecycle events replace snapshots; projection never mutates them.\n    function publish(snapshot: Snapshot) {\n      const projection = project(snapshot);\n      ui.setStatus(\"jobs\", projection.signal === undefined ? undefined : theme.fg(\"accent\", projection.signal));\n      ui.setWidget(\"workflow\", () => ({\n        invalidate() {},\n        render(width) {\n          const wrapped = projection.lines.flatMap(line => wrapTextWithAnsi(line, width));\n          const budget = 5, omitted = Math.max(0, wrapped.length - budget);\n          const visible = omitted ? [...wrapped.slice(0, budget - 1),\n            \"+\" + (omitted + 1) + \" detail rows · open workflow\"] : wrapped;\n          return visible.map((line, index) => theme.fg(index === 0 ? \"accent\" : \"muted\", line));\n        },\n      }), { placement: \"aboveEditor\" });\n      tui.requestRender();\n    }\n    ui.setEditorText(\"Review the task list\");\n    publish({ kind: \"idle\", queued: 5 });\n    action(\"running\", () => publish({ kind: \"running\", phase: \"validate\", jobs: [\n      { title: \"Parser boundary\", status: \"running\" },\n      { title: \"Theme preview\", status: \"running\" },\n      { title: \"Keyboard focus\", status: \"queued\" },\n      { title: \"Tool summary\", status: \"queued\" },\n      { title: \"Release notes\", status: \"queued\" },\n    ] }));\n    action(\"ended\", () => publish({ kind: \"ended\", completed: 5 }));\n    return () => { ui.setStatus(\"jobs\", undefined); ui.setWidget(\"workflow\", undefined); };\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/presentation/snapshot-lens.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Snapshot Lens, Idle snapshot state, 40 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-40-dark.94fd9ed9e996.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Snapshot Lens, Idle snapshot state, 40 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-40-light.c35fb8e7696f.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Snapshot Lens, Idle snapshot state, 60 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-60-dark.cc6a27c2a7eb.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Snapshot Lens, Idle snapshot state, 60 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-60-light.feb2588a5761.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Snapshot Lens, Idle snapshot state, 80 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-80-dark.1da076e89c5a.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Snapshot Lens, Idle snapshot state, 80 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-80-light.09cc489e5898.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Snapshot Lens, Idle snapshot state, 120 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-120-dark.8ab8e80c5958.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Snapshot Lens, Idle snapshot state, 120 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/idle-120-light.10e7059784e6.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Project synthetic idle jobs into a compact signal.",
      "id": "idle",
      "label": "Idle snapshot",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 40 columns, dark theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-40-dark.568fbb9d78af.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 40 columns, light theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-40-light.5dda742f0e29.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 60 columns, dark theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-60-dark.6f27200b4cc9.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 60 columns, light theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-60-light.933a0a1b215f.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 80 columns, dark theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-80-dark.7c53886f7bd8.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 80 columns, light theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-80-light.c578db9c7bc7.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 120 columns, dark theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-120-dark.1d6453f341af.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Snapshot Lens, Workflow snapshot state, 120 columns, light theme, 14 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/running-120-light.60860a836b60.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show a phase, nested jobs and bounded widget rows.",
      "id": "running",
      "label": "Workflow snapshot",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 40 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-40-dark.bcfdd2cbc40c.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 40 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-40-light.4cf81ccc0b60.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 60 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-60-dark.45e324904539.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 60 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-60-light.b982149b9148.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 80 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-80-dark.04e0c25b18b3.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 80 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-80-light.c0d0b86ffa52.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 120 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-120-dark.82b6e0d0f764.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Snapshot Lens, Lifecycle ends state, 120 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/snapshot-lens/ended-120-light.2469d3df72d8.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Update the completed snapshot and clear owned lifecycle status.",
      "id": "ended",
      "label": "Lifecycle ends",
      "problems": []
    }
  ],
  "structure": "lifecycle / jobs -> snapshot\nsnapshot -> status + widget",
  "thumbnails": {
    "dark": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/snapshot-lens/dark.8e56d96269aa.webp"
    },
    "light": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/snapshot-lens/light.0b063acc5bd5.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/snapshot-lens/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
