{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Incremental filter"
  ],
  "animated": false,
  "apis": [
    {
      "name": "Input",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#compose-built-in-components"
    },
    {
      "name": "SelectList",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#compose-built-in-components"
    },
    {
      "name": "TUI.requestRender",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    }
  ],
  "applicability": [
    "Use this when query extension can only remove candidates from a picker."
  ],
  "category": "lists",
  "categoryLabel": "Lists and pickers",
  "consequences": [
    "Query extension reuses the narrowed candidate set.",
    "Backspace and other non-extension edits require a full rescan."
  ],
  "family": "behavioral",
  "familyLabel": "Behavioral",
  "id": "shrinking-sieve",
  "implementation": [
    "Rescan all candidates when an edit does not extend the previous query.",
    "Reset selection on query changes rather than navigation."
  ],
  "intent": "Narrow existing candidates while a search query grows.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/shrinking-sieve.json",
  "kind": "component",
  "knownUses": [
    {
      "example": "skill-palette-incremental-filter",
      "moreRefs": 0,
      "refs": [
        {
          "file": "index.ts",
          "lines": "622-741",
          "sha": "a5c4429b",
          "url": "https://github.com/nicobailon/pi-skill-palette/blob/a5c4429b8c2e33ab903d07856497014f3d5ad34e/index.ts#L622-L741"
        }
      ],
      "repo": "pi-skill-palette",
      "repoUrl": "https://github.com/nicobailon/pi-skill-palette",
      "title": "Narrow palette results as the query grows"
    }
  ],
  "linkedFrom": [
    {
      "how": "narrows candidates without field ranking",
      "id": "match-ladder",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/match-ladder.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/match-ladder.md",
      "name": "Match Ladder",
      "url": "https://pi-tui.ratstack.sh/patterns/match-ladder/"
    }
  ],
  "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/shrinking-sieve.md",
  "motivation": "Skill Palette filters its current candidates as a query grows but must rescan when that assumption stops holding.",
  "name": "Shrinking Sieve",
  "participants": [
    {
      "name": "Input",
      "role": "Owns single-line editing and cursor state.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#compose-built-in-components"
    },
    {
      "name": "SelectList",
      "role": "Owns a bounded selection list and selection callbacks.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#compose-built-in-components"
    },
    {
      "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": "Candidate set",
      "role": "Narrows on query extension and resets for other edits.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "ranks rather than only narrowing",
      "id": "match-ladder",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/match-ladder.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/match-ladder.md",
      "name": "Match Ladder",
      "url": "https://pi-tui.ratstack.sh/patterns/match-ladder/"
    }
  ],
  "sampleCode": {
    "code": "// Shrinking Sieve: narrow on extension, rescan all candidates on other edits.\nimport { getSelectListTheme } from \"@earendil-works/pi-coding-agent\";\nimport { Input, SelectList, Text, type Component, type Focusable } from \"@earendil-works/pi-tui\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\nconst allCandidates = [\n  [\"build\", \"Compile the app\"], [\"bundle\", \"Package assets\"], [\"browse\", \"Explore tasks\"],\n  [\"review\", \"Inspect a patch\"], [\"test\", \"Run local checks\"],\n].map(([label, description]) => ({ value: label!, label: label!, description }));\n\nexport const story: PatternStory = {\n  id: \"shrinking-sieve\", title: \"Shrinking Sieve\", kind: \"component\",\n  apis: [\"Input\", \"SelectList\", \"TUI.requestRender\"], rows: 12,\n  states: [\n    { id: \"initial\", label: \"All candidates\" },\n    { id: \"extend\", label: \"Narrowed query\", steps: [\n      { type: \"keys\", data: \"b\" }, { type: \"keys\", data: \"u\" },\n    ] },\n    { id: \"backspace\", label: \"Rescan\", steps: [{ type: \"keys\", data: \"\\x7f\" }] },\n  ],\n  setup({ tui, theme, keybindings }) {\n    const input = new Input({ prompt: \"Filter: \", placeholder: \"type a command\" });\n    let previousQuery = \"\", candidates = allCandidates;\n    let choices = new SelectList(candidates, 5, getSelectListTheme());\n    let explanation = \"Full set · 5 commands\";\n    const view: Component & Focusable = {\n      focused: false,\n      invalidate() { input.invalidate(); choices.invalidate(); },\n      handleInput(data) {\n        if (keybindings.matches(data, \"tui.select.up\") || keybindings.matches(data, \"tui.select.down\")) {\n          choices.handleInput(data);\n        } else {\n          input.handleInput(data);\n          const query = input.getValue().toLowerCase();\n          if (query !== previousQuery) {\n            const extendsQuery = query.startsWith(previousQuery);\n            const source = extendsQuery ? candidates : allCandidates;\n            candidates = source.filter(item => item.label.includes(query));\n            explanation = (extendsQuery ? \"Narrow current set\" : \"Rescan full set\")\n              + \" · \" + source.length + \" → \" + candidates.length;\n            choices = new SelectList(candidates, 5, getSelectListTheme());\n            previousQuery = query;\n          }\n        }\n        tui.requestRender();\n      },\n      render(width) {\n        input.focused = this.focused;\n        return [\n          ...new Text(theme.fg(\"accent\", \"Command palette\"), 0, 0).render(width),\n          ...input.render(width), \"\", ...choices.render(width), \"\",\n          ...new Text(theme.fg(\"success\", explanation), 0, 0).render(width),\n          ...new Text(theme.fg(\"dim\", \"Backspace restores excluded candidates\"), 0, 0).render(width),\n        ];\n      },\n    };\n    return view;\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/behavioral/shrinking-sieve.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-40-dark.0ea3a88011f8.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-40-light.a950aec846c1.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-60-dark.45d8b7d77823.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-60-light.2115f69ef427.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-80-dark.1a16efe3577d.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-80-light.5701a7acd508.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-120-dark.8a50e04f6fd5.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Shrinking Sieve, All candidates 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/shrinking-sieve/initial-120-light.889450c15eae.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show the full synthetic command list.",
      "id": "initial",
      "label": "All candidates",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Shrinking Sieve, Narrowed query state, 40 columns, dark theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-40-dark.1bd910d359db.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Shrinking Sieve, Narrowed query state, 40 columns, light theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-40-light.2883a8e67639.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Shrinking Sieve, Narrowed query state, 60 columns, dark theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-60-dark.d8524caf22f2.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Shrinking Sieve, Narrowed query state, 60 columns, light theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-60-light.71f43848f5ac.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Shrinking Sieve, Narrowed query state, 80 columns, dark theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-80-dark.9bb891be7c6d.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Shrinking Sieve, Narrowed query state, 80 columns, light theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-80-light.0fd108662bac.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Shrinking Sieve, Narrowed query state, 120 columns, dark theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-120-dark.2db2c644b53b.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Shrinking Sieve, Narrowed query state, 120 columns, light theme, 8 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": 352,
          "rows": 8,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/extend-120-light.968553ae6e3e.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Append query characters and narrow the current candidates.",
      "id": "extend",
      "label": "Narrowed query",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Shrinking Sieve, Rescan state, 40 columns, dark theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-40-dark.e1e4010635d1.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Shrinking Sieve, Rescan state, 40 columns, light theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-40-light.94d3f7488677.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Shrinking Sieve, Rescan state, 60 columns, dark theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-60-dark.7da2cb0e5f5a.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Shrinking Sieve, Rescan state, 60 columns, light theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-60-light.ad6b70ffa586.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Shrinking Sieve, Rescan state, 80 columns, dark theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-80-dark.dac63aa213fc.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Shrinking Sieve, Rescan state, 80 columns, light theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-80-light.78fd4246cf74.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Shrinking Sieve, Rescan state, 120 columns, dark theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-120-dark.0a2b058bfa40.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Shrinking Sieve, Rescan state, 120 columns, light theme, 9 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": 396,
          "rows": 9,
          "still": "https://pi-tui.ratstack.sh/frames/shrinking-sieve/backspace-120-light.9e5660c91906.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Shorten the query and restore candidates from the full list.",
      "id": "backspace",
      "label": "Rescan",
      "problems": []
    }
  ],
  "structure": "query extends -> narrow set\nother edit -> full rescan",
  "thumbnails": {
    "dark": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/shrinking-sieve/dark.7d170be0f31a.webp"
    },
    "light": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/shrinking-sieve/light.7687fe96b2a9.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/shrinking-sieve/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
