{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Terminal process view"
  ],
  "animated": false,
  "apis": [
    {
      "name": "ctx.ui.custom",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#use-custom-screens-and-overlays"
    },
    {
      "name": "Component",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "TUI.requestRender",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "custom",
      "url": null
    },
    {
      "name": "Text",
      "url": null
    },
    {
      "name": "matchesKey",
      "url": null
    }
  ],
  "applicability": [
    "Use this when a command needs interactive terminal input instead of captured output."
  ],
  "category": "lifecycle",
  "categoryLabel": "Lifecycle and mounting",
  "consequences": [
    "An interactive process can have a temporary terminal view.",
    "PTY construction and failure cleanup remain outside Pi's UI API."
  ],
  "family": "lifecycle",
  "familyLabel": "Lifecycle",
  "id": "process-shell",
  "implementation": [
    "Resolve process exit and cancellation exactly once.",
    "Clean up handlers and process ownership if initialization fails.",
    "Pi does not supply the PTY implementation."
  ],
  "intent": "Bind a temporary terminal process view to one custom interaction.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/process-shell.json",
  "kind": "screen",
  "knownUses": [
    {
      "example": "shell-overlay-lifecycle",
      "moreRefs": 0,
      "refs": [
        {
          "file": "overlay-component.ts",
          "lines": "20-205",
          "sha": "77df9a81",
          "url": "https://github.com/nicobailon/pi-interactive-shell/blob/77df9a8142a2f731635a4c5a01d68feecb5cced4/overlay-component.ts#L20-L205"
        }
      ],
      "repo": "pi-interactive-shell",
      "repoUrl": "https://github.com/nicobailon/pi-interactive-shell",
      "title": "Interactive shell overlay lifecycle and terminal sizing"
    },
    {
      "example": "interactive-shell-custom-terminal",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/interactive-shell.ts",
          "lines": "145-180",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/interactive-shell.ts#L145-L180"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Host an interactive shell inside a custom TUI lifecycle"
    }
  ],
  "linkedFrom": [
    {
      "how": "owns the temporary foreground interaction",
      "id": "output-vault",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/output-vault.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/output-vault.md",
      "name": "Output Vault",
      "url": "https://pi-tui.ratstack.sh/patterns/output-vault/"
    }
  ],
  "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/process-shell.md",
  "motivation": "Nico's interactive shell mounts or attaches a process inside a custom UI with an exit result.",
  "name": "Process Shell",
  "participants": [
    {
      "name": "ctx.ui.custom",
      "role": "Mounts one interaction and resolves through done.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#use-custom-screens-and-overlays"
    },
    {
      "name": "Component",
      "role": "Renders width-bounded lines and invalidates cached output.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "TUI.requestRender",
      "role": "Requests a coalesced redraw after state changes.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "Process owner",
      "role": "Constructs or attaches the terminal job and owns failure cleanup.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "keeps output beyond the view",
      "id": "output-vault",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/output-vault.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/output-vault.md",
      "name": "Output Vault",
      "url": "https://pi-tui.ratstack.sh/patterns/output-vault/"
    }
  ],
  "sampleCode": {
    "code": "// Process Shell: bind one synthetic process view to one custom interaction.\nimport { Text, matchesKey, Key } from \"@earendil-works/pi-tui\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\ntype ProcessResult = { kind: \"exit\"; code: number } | { kind: \"cancelled\" };\n\nexport const story: PatternStory = {\n  id: \"process-shell\", title: \"Process Shell\", kind: \"screen\",\n  apis: [\"custom\", \"Text\", \"TUI.requestRender\", \"matchesKey\"],\n  states: [\n    { id: \"running\", label: \"Process attached\" },\n    { id: \"exited\", label: \"Process exit\", steps: [{ type: \"action\", name: \"exit\" }] },\n    { id: \"cancelled\", label: \"Cancelled view\", steps: [\n      { type: \"action\", name: \"attach\" }, { type: \"keys\", data: \"\\x1b\" },\n    ] },\n  ],\n  setup({ ui, theme, action }) {\n    let processExit: () => void = () => {};\n    ui.setEditorText(\"Summarize the check output.\");\n    const attach = () => {\n      ui.setWidget(\"process\", [theme.fg(\"accent\", \"Attached to synthetic parser checks\")]);\n      void ui.custom<ProcessResult>((tui, _theme, _keys, done) => {\n        // Synthetic driver only. Pi supplies the view, not a PTY.\n        let state: \"attached\" | \"closed\" = \"attached\";\n        const finish = (result: ProcessResult) => {\n          if (state === \"closed\") return;\n          state = \"closed\";\n          done(result);\n        };\n        processExit = () => finish({ kind: \"exit\", code: 0 });\n        const output = new Text(theme.fg(\"toolTitle\", \"$ check parser\") + \"\\n\" +\n          theme.fg(\"toolOutput\", \"PASS token stream\\nPASS empty input\\nWaiting for final assertion…\") + \"\\n\" +\n          theme.fg(\"muted\", \"Esc cancels the attached view\"), 0, 0);\n        tui.requestRender();\n        return {\n          render: width => output.render(width), invalidate: () => output.invalidate(),\n          handleInput: data => { if (matchesKey(data, Key.escape)) finish({ kind: \"cancelled\" }); },\n          dispose: () => { state = \"closed\"; processExit = () => {}; },\n        };\n      }).then(result => ui.setWidget(\"process\", [result.kind === \"exit\"\n        ? theme.fg(\"success\", \"Process exited · code \" + result.code)\n        : theme.fg(\"warning\", \"View cancelled · input owner released\")]));\n    };\n    action(\"exit\", () => processExit());\n    action(\"attach\", attach);\n    attach();\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/lifecycle/process-shell.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Process Shell, Process attached state, 40 columns, dark theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-40-dark.862ea8761875.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Process Shell, Process attached state, 40 columns, light theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-40-light.81a89e9683fb.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Process Shell, Process attached state, 60 columns, dark theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-60-dark.030bb9164f35.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Process Shell, Process attached state, 60 columns, light theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-60-light.43032130591e.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Process Shell, Process attached state, 80 columns, dark theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-80-dark.cb16e79b3916.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Process Shell, Process attached state, 80 columns, light theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-80-light.f93c22e5a425.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Process Shell, Process attached state, 120 columns, dark theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-120-dark.ce0ae05f90f8.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Process Shell, Process attached state, 120 columns, light theme, 12 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": 528,
          "rows": 12,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/running-120-light.95e36a10d1c5.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show synthetic process output in a terminal-like custom view.",
      "id": "running",
      "label": "Process attached",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Process Shell, Process exit state, 40 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-40-dark.69f3a7d808cf.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Process Shell, Process exit state, 40 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-40-light.21d19d5513ed.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Process Shell, Process exit state, 60 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-60-dark.870a20dee668.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Process Shell, Process exit state, 60 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-60-light.8694341cb4b0.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Process Shell, Process exit state, 80 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-80-dark.92695938bfd4.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Process Shell, Process exit state, 80 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-80-light.2912192cda46.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Process Shell, Process exit state, 120 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-120-dark.355a935e9c65.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Process Shell, Process exit state, 120 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/exited-120-light.0775fc89e92e.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Resolve an exit result and return to the host.",
      "id": "exited",
      "label": "Process exit",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Process Shell, Cancelled view state, 40 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-40-dark.8587d8264f88.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Process Shell, Cancelled view state, 40 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-40-light.4032caaa188e.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Process Shell, Cancelled view state, 60 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-60-dark.259f4356c709.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Process Shell, Cancelled view state, 60 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-60-light.11dd53616210.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Process Shell, Cancelled view state, 80 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-80-dark.9c0cdd03f5dc.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Process Shell, Cancelled view state, 80 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-80-light.fdb0435985a7.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Process Shell, Cancelled view state, 120 columns, dark theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-120-dark.1e692c14ebb9.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Process Shell, Cancelled view state, 120 columns, light theme, 10 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": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/process-shell/cancelled-120-light.7af960743566.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Resolve cancellation and clean up temporary input ownership.",
      "id": "cancelled",
      "label": "Cancelled view",
      "problems": []
    }
  ],
  "structure": "process / attachment -> view\nexit / cancel -> done(result)\nfinish -> owned cleanup",
  "thumbnails": {
    "dark": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/process-shell/dark.128ebcf3ba96.webp"
    },
    "light": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/process-shell/light.d75a8dff2c3e.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/process-shell/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
