{
  "doc": {
    "id": "ui-coverage/configuration/views",
    "title": "views: group URLs with URL patterns in UI Coverage",
    "description": "The `views` configuration groups related URLs into a single view in UI Coverage using URL patterns, so reports and scores reflect the actual pages of your application.",
    "section": "ui-coverage",
    "source_path": "/llm/markdown/ui-coverage/configuration/views.md",
    "version": "fbc9225067c51c52ee13224e3b702cf8a025ec12",
    "updated_at": "2026-08-14T12:36:26.878Z",
    "headings": [
      {
        "id": "ui-coverage/configuration/views#group-name-views-views",
        "text": "Group & name views - views",
        "level": 1
      },
      {
        "id": "ui-coverage/configuration/views#why-use-views",
        "text": "Why use views?",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#scope",
        "text": "Scope",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#syntax",
        "text": "Syntax",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#options",
        "text": "Options",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#how-are-urls-matched-to-views",
        "text": "How are URLs matched to views?",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#using-groupby",
        "text": "Using groupBy",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#how-views-are-named",
        "text": "How views are named",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#examples",
        "text": "Examples",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#grouping-dynamic-path-parameters",
        "text": "Grouping dynamic path parameters",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#config",
        "text": "Config",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#visited-urls",
        "text": "Visited URLs",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#views-shown-in-ui",
        "text": "Views shown in UI",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#grouping-with-a-named-path-parameter",
        "text": "Grouping with a named path parameter",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#config",
        "text": "Config",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#visited-urls",
        "text": "Visited URLs",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#views-shown-in-ui",
        "text": "Views shown in UI",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#grouping-by-a-path-parameter",
        "text": "Grouping by a path parameter",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#config",
        "text": "Config",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#visited-urls",
        "text": "Visited URLs",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#views-shown-in-ui",
        "text": "Views shown in UI",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#grouping-by-a-query-parameter",
        "text": "Grouping by a query parameter",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#config",
        "text": "Config",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#visited-urls",
        "text": "Visited URLs",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#views-shown-in-ui",
        "text": "Views shown in UI",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#grouping-urls-across-subdomains",
        "text": "Grouping URLs across subdomains",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#config",
        "text": "Config",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#visited-urls",
        "text": "Visited URLs",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#views-shown-in-ui",
        "text": "Views shown in UI",
        "level": 4
      },
      {
        "id": "ui-coverage/configuration/views#troubleshooting",
        "text": "Troubleshooting",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/views#a-pattern-you-configured-doesnt-appear-in-the-report",
        "text": "A pattern you configured doesn't appear in the report",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#error-value-was-not-found-in-the-pattern",
        "text": "Error: Value \"...\" was not found in the pattern",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#error-no-duplicate-values-allowed-was-added-multiple-times",
        "text": "Error: No duplicate values allowed - \"...\" was added multiple times",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/views#see-also",
        "text": "See also",
        "level": 2
      }
    ]
  },
  "chunks": [
    {
      "id": "ui-coverage/configuration/views#why-use-views",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Why use views?",
      "heading_level": 2,
      "content_markdown": "## Why use views?\n\n*   **Group dynamic URLs**: Combine URLs with dynamic values that the automatic rules don't recognize, such as usernames or slugs, into a single view.\n*   **Split views by query parameters**: By default, query strings are ignored when views are created, so `/home?status=done` and `/home?status=new` group into a single `/home` view. A pattern that captures a query parameter lets you report on them separately.\n*   **Create distinct view groups**: Use `groupBy` to create a separate view for each value of a meaningful URL parameter, while still grouping the parts that are dynamic.\n*   **Consolidate environments**: Patterns can span subdomains, or omit the protocol and hostname entirely, so the same page visited on different environments rolls up into one view.\n",
      "section": "ui-coverage",
      "anchors": [
        "why-use-views"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 163
    },
    {
      "id": "ui-coverage/configuration/views#scope",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Scope",
      "heading_level": 2,
      "content_markdown": "## Scope\n\n**Note:** setting `views` impacts both Accessibility and UI Coverage reports. It is defined at the root of your configuration and, unlike `viewFilters` and `elementFilters`, it cannot be nested under an `accessibility` or `uiCoverage` key to configure each product separately.\n\nThe `views` configuration applies to URLs visited in end-to-end tests. Views for component tests are created from the path of the spec file, and are not affected by this configuration.\n",
      "section": "ui-coverage",
      "anchors": [
        "scope"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 95
    },
    {
      "id": "ui-coverage/configuration/views#syntax",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Syntax",
      "heading_level": 2,
      "content_markdown": "## Syntax\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": string,      \"groupBy\": string | [string],      \"comment\": string    }  ]}\n```\n\nA view can also be defined as just a pattern string when no other options are needed:\n\nApp Quality Config\n\n```\n{  \"views\": [\"https://www.my-app.com/users/*\"]}\n```\n\n### Options\n\n| Option | Required | Default | Description |\n| --- | --- | --- | --- |\n| `pattern` | Required |  | A URL pattern to group matching URLs into a single view. Uses [URL Pattern API](https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API) syntax. |\n| `groupBy` | Optional |  | One or more named parameters from the pattern that should create separate views. Accepts a single string or an array of strings. Each name must appear in `pattern` as a named parameter (for example, `:type`), in the path, query string, or hash. |\n| `comment` | Optional |  | A description of the purpose of this view configuration. Has no effect on behavior. |\n",
      "section": "ui-coverage",
      "anchors": [
        "syntax"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 212
    },
    {
      "id": "ui-coverage/configuration/views#options",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Options",
      "heading_level": 3,
      "content_markdown": "### Options\n\n| Option | Required | Default | Description |\n| --- | --- | --- | --- |\n| `pattern` | Required |  | A URL pattern to group matching URLs into a single view. Uses [URL Pattern API](https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API) syntax. |\n| `groupBy` | Optional |  | One or more named parameters from the pattern that should create separate views. Accepts a single string or an array of strings. Each name must appear in `pattern` as a named parameter (for example, `:type`), in the path, query string, or hash. |\n| `comment` | Optional |  | A description of the purpose of this view configuration. Has no effect on behavior. |\n",
      "section": "ui-coverage",
      "anchors": [
        "options"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 151
    },
    {
      "id": "ui-coverage/configuration/views#how-are-urls-matched-to-views",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "How are URLs matched to views?",
      "heading_level": 2,
      "content_markdown": "## How are URLs matched to views?\n\n*   Patterns are evaluated in the order they are defined, and each URL is grouped into the view of the first pattern it matches. A URL only ever belongs to one view.\n*   URLs that don't match any pattern are grouped by the [automatic view grouping rules](/llm/markdown/ui-coverage/core-concepts/views.md#How-views-are-created), where possible.\n*   A pattern that doesn't match any URLs in the run does not appear in the report.\n*   URLs excluded by a `viewFilters` rule are excluded before `views` patterns are applied. A `views` pattern cannot bring an excluded URL back into the report.\n\nPattern matching follows [URL Pattern API](https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API) semantics, with a few behaviors worth knowing:\n\n*   A pattern that omits the query string and hash matches URLs with any query string or hash. For example, `https://www.my-app.com/users/*` matches `https://www.my-app.com/users/bob#settings`.\n*   Trailing slashes are optional by default: `/users/bob` and `/users/bob/` both match a pattern ending in `/users/:name`. If your pattern ends with a `/`, only URLs with a trailing slash match it.\n*   A pattern without a protocol and hostname, such as `/users/*`, matches that path on any protocol, hostname, and port.\n",
      "section": "ui-coverage",
      "anchors": [
        "how-are-urls-matched-to-views"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 249
    },
    {
      "id": "ui-coverage/configuration/views#using-groupby",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Using groupBy",
      "heading_level": 2,
      "content_markdown": "## Using groupBy\n\nThe `groupBy` property creates distinct views based on named parameters in your URL pattern. For example, if your pattern is `/analytics/:type/:id`, using `groupBy: [\"type\"]` creates a separate view for each unique value of `type` (like `/analytics/performance/:id` and `/analytics/usage/:id`).\n\nThis is particularly useful when:\n\n*   Different parameter values represent distinct functional areas\n*   You want to track coverage separately for different categories of content\n*   URL parameters determine significant UI changes\n\nURLs with the same values for the specified parameters are grouped together, while different values create distinct views. Values can be captured from named parameters in the path, the query string, or the hash of the pattern.\n",
      "section": "ui-coverage",
      "anchors": [
        "using-groupby"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 147
    },
    {
      "id": "ui-coverage/configuration/views#how-views-are-named",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "How views are named",
      "heading_level": 2,
      "content_markdown": "## How views are named\n\nA view created from your configuration is named by the pattern you wrote. When `groupBy` is used, the grouped parameters are replaced with their matched values, and any remaining named parameters and wildcards stay in the name, as the examples below show.\n\nWhen every view in a report shares the same protocol and hostname, view names are displayed without them. The examples below show the names as they appear in this most common case.\n",
      "section": "ui-coverage",
      "anchors": [
        "how-views-are-named"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 105
    },
    {
      "id": "ui-coverage/configuration/views#examples",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Examples",
      "heading_level": 2,
      "content_markdown": "## Examples\n\n### Grouping dynamic path parameters\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/users/*\"    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/users/alicehttps://www.my-app.com/users/bobhttps://www.my-app.com/users/bob#settingshttps://www.my-app.com/users?assigned=true\n```\n\n#### Views shown in UI\n\n```\n/users/*/users\n```\n\nThe first three URLs match the pattern and group into `/users/*`. The last URL doesn't match (its path is `/users`, not `/users/` followed by more), so the automatic grouping rules create a `/users` view for it, with its query string ignored.\n\n* * *\n\n### Grouping with a named path parameter\n\nA named parameter like `:name` matches a single path segment, just like `*`, but keeps a readable placeholder in the view name and can be referenced by `groupBy`.\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/users/:name\"    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/users/alicehttps://www.my-app.com/users/bobhttps://www.my-app.com/users/bob#settingshttps://www.my-app.com/users?assigned=true\n```\n\n#### Views shown in UI\n\n```\n/users/:name/users\n```\n\n* * *\n\n### Grouping by a path parameter\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/analytics/:type/:id\",      \"groupBy\": [\"type\"]    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/analytics/performance/amarahttps://www.my-app.com/analytics/performance/harperhttps://www.my-app.com/analytics/usage/amarahttps://www.my-app.com/analytics/usage/harper\n```\n\n#### Views shown in UI\n\n```\n/analytics/performance/:id/analytics/usage/:id\n```\n\n* * *\n\n### Grouping by a query parameter\n\nThe `?*status=:status{&*}?` syntax captures the `status` query parameter wherever it appears in the query string, regardless of what other parameters surround it, and `#*` allows any hash.\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/home?*status=:status{&*}?#*\",      \"groupBy\": [\"status\"]    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/home?page=1&status=donehttps://www.my-app.com/home?status=done&group=2https://www.my-app.com/home?tag=trip&status=new&group=4https://www.my-app.com/home?tag=trip&status=new#statusView\n```\n\n#### Views shown in UI\n\n```\n/home?*status=done{&*}?/home?*status=new{&*}?\n```\n\nView names keep the query string portion of the pattern as you wrote it, with the grouped parameter replaced by its matched values.\n\n* * *\n\n### Grouping URLs across subdomains\n\nEach unique value of `:path*` creates a view, and the same path visited on different subdomains is grouped into a single view. All of the views share the `*.my-app.com` hostname pattern, so it is omitted from the view names.\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://*.my-app.com/:path*\",      \"groupBy\": [\"path\"]    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://staging1.my-app.com/homehttps://staging2.my-app.com/homehttps://www.my-app.com/homehttps://staging1.my-app.com/profilehttps://www.my-app.com/profile/edit\n```\n\n#### Views shown in UI\n\n```\n/home/profile/profile/edit\n```\n",
      "section": "ui-coverage",
      "anchors": [
        "examples"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 469
    },
    {
      "id": "ui-coverage/configuration/views#grouping-dynamic-path-parameters",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Grouping dynamic path parameters",
      "heading_level": 3,
      "content_markdown": "### Grouping dynamic path parameters\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/users/*\"    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/users/alicehttps://www.my-app.com/users/bobhttps://www.my-app.com/users/bob#settingshttps://www.my-app.com/users?assigned=true\n```\n\n#### Views shown in UI\n\n```\n/users/*/users\n```\n\nThe first three URLs match the pattern and group into `/users/*`. The last URL doesn't match (its path is `/users`, not `/users/` followed by more), so the automatic grouping rules create a `/users` view for it, with its query string ignored.\n\n* * *\n",
      "section": "ui-coverage",
      "anchors": [
        "grouping-dynamic-path-parameters"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 104
    },
    {
      "id": "ui-coverage/configuration/views#views-shown-in-ui",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Views shown in UI",
      "heading_level": 4,
      "content_markdown": "#### Views shown in UI\n\n```\n/users/*/users\n```\n\nThe first three URLs match the pattern and group into `/users/*`. The last URL doesn't match (its path is `/users`, not `/users/` followed by more), so the automatic grouping rules create a `/users` view for it, with its query string ignored.\n\n* * *\n",
      "section": "ui-coverage",
      "anchors": [
        "views-shown-in-ui"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 69
    },
    {
      "id": "ui-coverage/configuration/views#grouping-with-a-named-path-parameter",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Grouping with a named path parameter",
      "heading_level": 3,
      "content_markdown": "### Grouping with a named path parameter\n\nA named parameter like `:name` matches a single path segment, just like `*`, but keeps a readable placeholder in the view name and can be referenced by `groupBy`.\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/users/:name\"    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/users/alicehttps://www.my-app.com/users/bobhttps://www.my-app.com/users/bob#settingshttps://www.my-app.com/users?assigned=true\n```\n\n#### Views shown in UI\n\n```\n/users/:name/users\n```\n\n* * *\n",
      "section": "ui-coverage",
      "anchors": [
        "grouping-with-a-named-path-parameter"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 89
    },
    {
      "id": "ui-coverage/configuration/views#grouping-by-a-path-parameter",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Grouping by a path parameter",
      "heading_level": 3,
      "content_markdown": "### Grouping by a path parameter\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/analytics/:type/:id\",      \"groupBy\": [\"type\"]    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/analytics/performance/amarahttps://www.my-app.com/analytics/performance/harperhttps://www.my-app.com/analytics/usage/amarahttps://www.my-app.com/analytics/usage/harper\n```\n\n#### Views shown in UI\n\n```\n/analytics/performance/:id/analytics/usage/:id\n```\n\n* * *\n",
      "section": "ui-coverage",
      "anchors": [
        "grouping-by-a-path-parameter"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 53
    },
    {
      "id": "ui-coverage/configuration/views#grouping-by-a-query-parameter",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Grouping by a query parameter",
      "heading_level": 3,
      "content_markdown": "### Grouping by a query parameter\n\nThe `?*status=:status{&*}?` syntax captures the `status` query parameter wherever it appears in the query string, regardless of what other parameters surround it, and `#*` allows any hash.\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://www.my-app.com/home?*status=:status{&*}?#*\",      \"groupBy\": [\"status\"]    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://www.my-app.com/home?page=1&status=donehttps://www.my-app.com/home?status=done&group=2https://www.my-app.com/home?tag=trip&status=new&group=4https://www.my-app.com/home?tag=trip&status=new#statusView\n```\n\n#### Views shown in UI\n\n```\n/home?*status=done{&*}?/home?*status=new{&*}?\n```\n\nView names keep the query string portion of the pattern as you wrote it, with the grouped parameter replaced by its matched values.\n\n* * *\n",
      "section": "ui-coverage",
      "anchors": [
        "grouping-by-a-query-parameter"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 120
    },
    {
      "id": "ui-coverage/configuration/views#views-shown-in-ui",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Views shown in UI",
      "heading_level": 4,
      "content_markdown": "#### Views shown in UI\n\n```\n/home?*status=done{&*}?/home?*status=new{&*}?\n```\n\nView names keep the query string portion of the pattern as you wrote it, with the grouped parameter replaced by its matched values.\n\n* * *\n",
      "section": "ui-coverage",
      "anchors": [
        "views-shown-in-ui"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 45
    },
    {
      "id": "ui-coverage/configuration/views#grouping-urls-across-subdomains",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Grouping URLs across subdomains",
      "heading_level": 3,
      "content_markdown": "### Grouping URLs across subdomains\n\nEach unique value of `:path*` creates a view, and the same path visited on different subdomains is grouped into a single view. All of the views share the `*.my-app.com` hostname pattern, so it is omitted from the view names.\n\n#### Config\n\nApp Quality Config\n\n```\n{  \"views\": [    {      \"pattern\": \"https://*.my-app.com/:path*\",      \"groupBy\": [\"path\"]    }  ]}\n```\n\n#### Visited URLs\n\n```\nhttps://staging1.my-app.com/homehttps://staging2.my-app.com/homehttps://www.my-app.com/homehttps://staging1.my-app.com/profilehttps://www.my-app.com/profile/edit\n```\n\n#### Views shown in UI\n\n```\n/home/profile/profile/edit\n```\n",
      "section": "ui-coverage",
      "anchors": [
        "grouping-urls-across-subdomains"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 100
    },
    {
      "id": "ui-coverage/configuration/views#troubleshooting",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Troubleshooting",
      "heading_level": 2,
      "content_markdown": "## Troubleshooting\n\n### A pattern you configured doesn't appear in the report\n\nA pattern that doesn't match any URLs in the run is dropped from the report. Confirm that the pattern matches the full URL, including the protocol and hostname, or omit them so the pattern matches any origin. Also check that a `viewFilters` rule isn't excluding the URLs before `views` patterns are applied.\n\n### Error: `Value \"...\" was not found in the pattern`\n\nEach name in `groupBy` must appear in `pattern` as a named parameter. For example, `groupBy: [\"type\"]` requires `:type` somewhere in the pattern's path, query string, or hash.\n\n### Error: `No duplicate values allowed - \"...\" was added multiple times`\n\nEach pattern in `views` must be unique. Named parameters are compared as wildcards, so `/users/:name` and `/users/*` count as the same pattern and trigger this error.\n",
      "section": "ui-coverage",
      "anchors": [
        "troubleshooting"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 185
    },
    {
      "id": "ui-coverage/configuration/views#a-pattern-you-configured-doesnt-appear-in-the-report",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "A pattern you configured doesn't appear in the report",
      "heading_level": 3,
      "content_markdown": "### A pattern you configured doesn't appear in the report\n\nA pattern that doesn't match any URLs in the run is dropped from the report. Confirm that the pattern matches the full URL, including the protocol and hostname, or omit them so the pattern matches any origin. Also check that a `viewFilters` rule isn't excluding the URLs before `views` patterns are applied.\n",
      "section": "ui-coverage",
      "anchors": [
        "a-pattern-you-configured-doesnt-appear-in-the-report"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 83
    },
    {
      "id": "ui-coverage/configuration/views#error-value-was-not-found-in-the-pattern",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Error: Value \"...\" was not found in the pattern",
      "heading_level": 3,
      "content_markdown": "### Error: `Value \"...\" was not found in the pattern`\n\nEach name in `groupBy` must appear in `pattern` as a named parameter. For example, `groupBy: [\"type\"]` requires `:type` somewhere in the pattern's path, query string, or hash.\n",
      "section": "ui-coverage",
      "anchors": [
        "error-value-was-not-found-in-the-pattern"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 49
    },
    {
      "id": "ui-coverage/configuration/views#error-no-duplicate-values-allowed-was-added-multiple-times",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "Error: No duplicate values allowed - \"...\" was added multiple times",
      "heading_level": 3,
      "content_markdown": "### Error: `No duplicate values allowed - \"...\" was added multiple times`\n\nEach pattern in `views` must be unique. Named parameters are compared as wildcards, so `/users/:name` and `/users/*` count as the same pattern and trigger this error.\n",
      "section": "ui-coverage",
      "anchors": [
        "error-no-duplicate-values-allowed-was-added-multiple-times"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 51
    },
    {
      "id": "ui-coverage/configuration/views#see-also",
      "doc_id": "ui-coverage/configuration/views",
      "heading": "See also",
      "heading_level": 2,
      "content_markdown": "## See also\n\n*   [Views core concept](/llm/markdown/ui-coverage/core-concepts/views.md): how views are created by default and used in your report\n*   [`viewFilters` configuration](/llm/markdown/ui-coverage/configuration/viewfilters.md): exclude URLs from your reports\n*   [Ignore views and links guide](/llm/markdown/ui-coverage/guides/ignore-views-and-links.md): exclude irrelevant views from coverage scores\n*   [UI Coverage FAQ](/llm/markdown/ui-coverage/faq.md): common questions about view grouping and missing pages\n",
      "section": "ui-coverage",
      "anchors": [
        "see-also"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/views.json",
      "token_estimate": 67
    }
  ]
}