{
  "request_duration_ms": 65.27074801851995,
  "sum_trace_duration_ms": 15.906360902590677,
  "num_traces": 30,
  "traces": [
    {
      "type": "sql",
      "start": 140618.012606686,
      "end": 140618.012940171,
      "duration_ms": 0.3334849898237735,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1451, in ensure_permission\n    if not await self.allowed(action=action, resource=resource, actor=actor):\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1399, in allowed\n    result = await check_permission_for_resource(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/actions_sql.py\", line 584, in check_permission_for_resource\n    result = await datasette.get_internal_database().execute(query, all_params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_24034889 AS reason\n            )\n),\nmatched_rules AS (\n  SELECT ar.*,\n    CASE\n      WHEN ar.child IS NOT NULL THEN 2  -- child-level (most specific)\n      WHEN ar.parent IS NOT NULL THEN 1  -- parent-level\n      ELSE 0                             -- root/global\n    END AS depth\n  FROM all_rules ar\n  WHERE (ar.parent IS NULL OR ar.parent = :_check_parent)\n    AND (ar.child IS NULL OR ar.child = :_check_child)\n),\nwinner AS (\n  SELECT *\n  FROM matched_rules\n  ORDER BY\n    depth DESC,                          -- specificity first (higher depth wins)\n    CASE WHEN allow=0 THEN 0 ELSE 1 END, -- then deny over allow\n    source_plugin                        -- stable tie-break\n  LIMIT 1\n)\nSELECT COALESCE((SELECT allow FROM winner), 0) AS is_allowed",
      "params": {
        "reason_24034889": "default allow for view-instance",
        "action": "view-instance",
        "actor": null,
        "actor_id": null,
        "_check_parent": null,
        "_check_child": null
      }
    },
    {
      "type": "sql",
      "start": 140618.0132598,
      "end": 140618.015977678,
      "duration_ms": 2.7178780001122504,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 31, in get\n    db_page = await self.ds.allowed_resources(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1301, in allowed_resources\n    result = await self.get_internal_database().execute(query, params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nbase AS (\n  \n            SELECT database_name AS parent, NULL AS child\n            FROM catalog_databases\n        \n),\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_24034890 AS reason\n            )\n),\nanon_rules AS (\n  SELECT NULL AS parent, NULL AS child, 1 AS allow, :anon_reason_24034891 AS reason\n),\nchild_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nparent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nglobal_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_child_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nanon_parent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_global_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_decisions AS (\n  SELECT\n    b.parent, b.child,\n    CASE\n      WHEN acl.any_deny = 1 THEN 0\n      WHEN acl.any_allow = 1 THEN 1\n      WHEN apl.any_deny = 1 THEN 0\n      WHEN apl.any_allow = 1 THEN 1\n      WHEN agl.any_deny = 1 THEN 0\n      WHEN agl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS anon_is_allowed\n  FROM base b\n  JOIN anon_child_lvl acl ON b.parent = acl.parent AND (b.child = acl.child OR (b.child IS NULL AND acl.child IS NULL))\n  JOIN anon_parent_lvl apl ON b.parent = apl.parent AND (b.child = apl.child OR (b.child IS NULL AND apl.child IS NULL))\n  JOIN anon_global_lvl agl ON b.parent = agl.parent AND (b.child = agl.child OR (b.child IS NULL AND agl.child IS NULL))\n),\ndecisions AS (\n  SELECT\n    b.parent, b.child,\n    -- Cascading permission logic: child \u2192 parent \u2192 global, DENY beats ALLOW at each level\n    -- Priority order:\n    --   1. Child-level deny (most specific, blocks access)\n    --   2. Child-level allow (most specific, grants access)\n    --   3. Parent-level deny (intermediate, blocks access)\n    --   4. Parent-level allow (intermediate, grants access)\n    --   5. Global-level deny (least specific, blocks access)\n    --   6. Global-level allow (least specific, grants access)\n    --   7. Default deny (no rules match)\n    CASE\n      WHEN cl.any_deny = 1 THEN 0\n      WHEN cl.any_allow = 1 THEN 1\n      WHEN pl.any_deny = 1 THEN 0\n      WHEN pl.any_allow = 1 THEN 1\n      WHEN gl.any_deny = 1 THEN 0\n      WHEN gl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS is_allowed,\n    CASE\n      WHEN cl.any_deny = 1 THEN cl.deny_reasons\n      WHEN cl.any_allow = 1 THEN cl.allow_reasons\n      WHEN pl.any_deny = 1 THEN pl.deny_reasons\n      WHEN pl.any_allow = 1 THEN pl.allow_reasons\n      WHEN gl.any_deny = 1 THEN gl.deny_reasons\n      WHEN gl.any_allow = 1 THEN gl.allow_reasons\n      ELSE '[]'\n    END AS reason\n    , CASE WHEN ad.anon_is_allowed = 0 THEN 1 ELSE 0 END AS is_private\n  FROM base b\n  JOIN child_lvl cl ON b.parent = cl.parent AND (b.child = cl.child OR (b.child IS NULL AND cl.child IS NULL))\n  JOIN parent_lvl pl ON b.parent = pl.parent AND (b.child = pl.child OR (b.child IS NULL AND pl.child IS NULL))\n  JOIN global_lvl gl ON b.parent = gl.parent AND (b.child = gl.child OR (b.child IS NULL AND gl.child IS NULL))\n  JOIN anon_decisions ad ON b.parent = ad.parent AND (b.child = ad.child OR (b.child IS NULL AND ad.child IS NULL))\n)\nSELECT parent, child, reason, is_private\nFROM decisions\nWHERE is_allowed = 1\nORDER BY parent, child LIMIT :limit",
      "params": {
        "reason_24034890": "default allow for view-database",
        "action": "view-database",
        "actor": null,
        "actor_id": null,
        "anon_reason_24034891": "default allow for view-database",
        "anon_action": "view-database",
        "anon_actor": null,
        "anon_actor_id": null,
        "limit": 101
      }
    },
    {
      "type": "sql",
      "start": 140618.016294928,
      "end": 140618.021984492,
      "duration_ms": 5.689563986379653,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 39, in get\n    table_page = await self.ds.allowed_resources(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1301, in allowed_resources\n    result = await self.get_internal_database().execute(query, params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nbase AS (\n  \n            SELECT database_name AS parent, table_name AS child\n            FROM catalog_tables\n            UNION ALL\n            SELECT database_name AS parent, view_name AS child\n            FROM catalog_views\n        \n),\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_24034892 AS reason\n            )\n),\nanon_rules AS (\n  SELECT NULL AS parent, NULL AS child, 1 AS allow, :anon_reason_24034893 AS reason\n),\nchild_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nparent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nglobal_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_child_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nanon_parent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_global_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_decisions AS (\n  SELECT\n    b.parent, b.child,\n    CASE\n      WHEN acl.any_deny = 1 THEN 0\n      WHEN acl.any_allow = 1 THEN 1\n      WHEN apl.any_deny = 1 THEN 0\n      WHEN apl.any_allow = 1 THEN 1\n      WHEN agl.any_deny = 1 THEN 0\n      WHEN agl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS anon_is_allowed\n  FROM base b\n  JOIN anon_child_lvl acl ON b.parent = acl.parent AND (b.child = acl.child OR (b.child IS NULL AND acl.child IS NULL))\n  JOIN anon_parent_lvl apl ON b.parent = apl.parent AND (b.child = apl.child OR (b.child IS NULL AND apl.child IS NULL))\n  JOIN anon_global_lvl agl ON b.parent = agl.parent AND (b.child = agl.child OR (b.child IS NULL AND agl.child IS NULL))\n),\ndecisions AS (\n  SELECT\n    b.parent, b.child,\n    -- Cascading permission logic: child \u2192 parent \u2192 global, DENY beats ALLOW at each level\n    -- Priority order:\n    --   1. Child-level deny (most specific, blocks access)\n    --   2. Child-level allow (most specific, grants access)\n    --   3. Parent-level deny (intermediate, blocks access)\n    --   4. Parent-level allow (intermediate, grants access)\n    --   5. Global-level deny (least specific, blocks access)\n    --   6. Global-level allow (least specific, grants access)\n    --   7. Default deny (no rules match)\n    CASE\n      WHEN cl.any_deny = 1 THEN 0\n      WHEN cl.any_allow = 1 THEN 1\n      WHEN pl.any_deny = 1 THEN 0\n      WHEN pl.any_allow = 1 THEN 1\n      WHEN gl.any_deny = 1 THEN 0\n      WHEN gl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS is_allowed,\n    CASE\n      WHEN cl.any_deny = 1 THEN cl.deny_reasons\n      WHEN cl.any_allow = 1 THEN cl.allow_reasons\n      WHEN pl.any_deny = 1 THEN pl.deny_reasons\n      WHEN pl.any_allow = 1 THEN pl.allow_reasons\n      WHEN gl.any_deny = 1 THEN gl.deny_reasons\n      WHEN gl.any_allow = 1 THEN gl.allow_reasons\n      ELSE '[]'\n    END AS reason\n    , CASE WHEN ad.anon_is_allowed = 0 THEN 1 ELSE 0 END AS is_private\n  FROM base b\n  JOIN child_lvl cl ON b.parent = cl.parent AND (b.child = cl.child OR (b.child IS NULL AND cl.child IS NULL))\n  JOIN parent_lvl pl ON b.parent = pl.parent AND (b.child = pl.child OR (b.child IS NULL AND pl.child IS NULL))\n  JOIN global_lvl gl ON b.parent = gl.parent AND (b.child = gl.child OR (b.child IS NULL AND gl.child IS NULL))\n  JOIN anon_decisions ad ON b.parent = ad.parent AND (b.child = ad.child OR (b.child IS NULL AND ad.child IS NULL))\n)\nSELECT parent, child, reason, is_private\nFROM decisions\nWHERE is_allowed = 1\nORDER BY parent, child LIMIT :limit",
      "params": {
        "reason_24034892": "default allow for view-table",
        "action": "view-table",
        "actor": null,
        "actor_id": null,
        "anon_reason_24034893": "default allow for view-table",
        "anon_action": "view-table",
        "anon_actor": null,
        "anon_actor_id": null,
        "limit": 101
      }
    },
    {
      "type": "sql",
      "start": 140618.022318517,
      "end": 140618.022685293,
      "duration_ms": 0.3667759883683175,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 541, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "WITH base AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE  name IN ('sqlite_stat1', 'sqlite_stat2', 'sqlite_stat3', 'sqlite_stat4')\n                          OR substr(name, 1, 1) == '_'\n                      ),\n                      fts_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_data'), ('_idx'), ('_docsize'), ('_content'), ('_config'))\n                      ),\n                      fts5_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS%'\n                      ),\n                      fts5_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts5_names.name, fts_suffixes.suffix) AS name\n                        FROM fts5_names\n                        JOIN fts_suffixes\n                      ),\n                      fts3_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_content'), ('_segdir'), ('_segments'), ('_stat'), ('_docsize'))\n                      ),\n                      fts3_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS3%'\n                          OR sql LIKE '%VIRTUAL TABLE%USING FTS4%'\n                      ),\n                      fts3_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts3_names.name, fts3_suffixes.suffix) AS name\n                        FROM fts3_names\n                        JOIN fts3_suffixes\n                      ),\n                      final AS (\n                        SELECT name FROM base\n                        UNION ALL\n                        SELECT name FROM fts5_shadow_tables\n                        UNION ALL\n                        SELECT name FROM fts3_shadow_tables\n                      )\n                      SELECT name FROM final ORDER BY 1",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.022826913,
      "end": 140618.022999443,
      "duration_ms": 0.17253000987693667,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 594, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "SELECT name\n                  FROM sqlite_master\n                  WHERE sql LIKE '%VIRTUAL TABLE%'\n                    AND sql LIKE '%USING FTS%'\n                    AND sql LIKE '%content=%'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.023249053,
      "end": 140618.023432261,
      "duration_ms": 0.18320800154469907,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 62, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 637, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.023848552,
      "end": 140618.024169521,
      "duration_ms": 0.320969003951177,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 541, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "WITH base AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE  name IN ('sqlite_stat1', 'sqlite_stat2', 'sqlite_stat3', 'sqlite_stat4')\n                          OR substr(name, 1, 1) == '_'\n                      ),\n                      fts_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_data'), ('_idx'), ('_docsize'), ('_content'), ('_config'))\n                      ),\n                      fts5_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS%'\n                      ),\n                      fts5_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts5_names.name, fts_suffixes.suffix) AS name\n                        FROM fts5_names\n                        JOIN fts_suffixes\n                      ),\n                      fts3_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_content'), ('_segdir'), ('_segments'), ('_stat'), ('_docsize'))\n                      ),\n                      fts3_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS3%'\n                          OR sql LIKE '%VIRTUAL TABLE%USING FTS4%'\n                      ),\n                      fts3_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts3_names.name, fts3_suffixes.suffix) AS name\n                        FROM fts3_names\n                        JOIN fts3_suffixes\n                      ),\n                      final AS (\n                        SELECT name FROM base\n                        UNION ALL\n                        SELECT name FROM fts5_shadow_tables\n                        UNION ALL\n                        SELECT name FROM fts3_shadow_tables\n                      )\n                      SELECT name FROM final ORDER BY 1",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.024287328,
      "end": 140618.024507845,
      "duration_ms": 0.22051698761060834,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 594, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "SELECT name\n                  FROM sqlite_master\n                  WHERE sql LIKE '%VIRTUAL TABLE%'\n                    AND sql LIKE '%USING FTS%'\n                    AND sql LIKE '%content=%'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.024754365,
      "end": 140618.024955518,
      "duration_ms": 0.20115298684686422,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 62, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 637, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.025068116,
      "end": 140618.025418266,
      "duration_ms": 0.35015001776628196,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 75, in get\n    table_counts = await db.table_counts(10)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 384, in table_counts\n    for table in await self.table_names():\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 433, in table_names\n    results = await self.execute(\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "select name from sqlite_master where type='table' order by name",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.025566344,
      "end": 140618.025804007,
      "duration_ms": 0.23766298545524478,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 75, in get\n    table_counts = await db.table_counts(10)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 387, in table_counts\n    await self.execute(\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "select count(*) from (select * from [counters] limit 10001)",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.026612117,
      "end": 140618.026885809,
      "duration_ms": 0.2736919850576669,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 541, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "ephemeral",
      "sql": "WITH base AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE  name IN ('sqlite_stat1', 'sqlite_stat2', 'sqlite_stat3', 'sqlite_stat4')\n                          OR substr(name, 1, 1) == '_'\n                      ),\n                      fts_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_data'), ('_idx'), ('_docsize'), ('_content'), ('_config'))\n                      ),\n                      fts5_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS%'\n                      ),\n                      fts5_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts5_names.name, fts_suffixes.suffix) AS name\n                        FROM fts5_names\n                        JOIN fts_suffixes\n                      ),\n                      fts3_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_content'), ('_segdir'), ('_segments'), ('_stat'), ('_docsize'))\n                      ),\n                      fts3_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS3%'\n                          OR sql LIKE '%VIRTUAL TABLE%USING FTS4%'\n                      ),\n                      fts3_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts3_names.name, fts3_suffixes.suffix) AS name\n                        FROM fts3_names\n                        JOIN fts3_suffixes\n                      ),\n                      final AS (\n                        SELECT name FROM base\n                        UNION ALL\n                        SELECT name FROM fts5_shadow_tables\n                        UNION ALL\n                        SELECT name FROM fts3_shadow_tables\n                      )\n                      SELECT name FROM final ORDER BY 1",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.027048123,
      "end": 140618.027258534,
      "duration_ms": 0.21041100262664258,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 594, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "ephemeral",
      "sql": "SELECT name\n                  FROM sqlite_master\n                  WHERE sql LIKE '%VIRTUAL TABLE%'\n                    AND sql LIKE '%USING FTS%'\n                    AND sql LIKE '%content=%'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.02755251,
      "end": 140618.027744446,
      "duration_ms": 0.19193600746802986,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 62, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 637, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "ephemeral",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.027859653,
      "end": 140618.028030964,
      "duration_ms": 0.17131099593825638,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 75, in get\n    table_counts = await db.table_counts(10)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 384, in table_counts\n    for table in await self.table_names():\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 433, in table_names\n    results = await self.execute(\n"
      ],
      "error": null,
      "database": "ephemeral",
      "sql": "select name from sqlite_master where type='table' order by name",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.028336397,
      "end": 140618.028629134,
      "duration_ms": 0.2927370078396052,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 541, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "extra_database",
      "sql": "WITH base AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE  name IN ('sqlite_stat1', 'sqlite_stat2', 'sqlite_stat3', 'sqlite_stat4')\n                          OR substr(name, 1, 1) == '_'\n                      ),\n                      fts_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_data'), ('_idx'), ('_docsize'), ('_content'), ('_config'))\n                      ),\n                      fts5_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS%'\n                      ),\n                      fts5_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts5_names.name, fts_suffixes.suffix) AS name\n                        FROM fts5_names\n                        JOIN fts_suffixes\n                      ),\n                      fts3_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_content'), ('_segdir'), ('_segments'), ('_stat'), ('_docsize'))\n                      ),\n                      fts3_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS3%'\n                          OR sql LIKE '%VIRTUAL TABLE%USING FTS4%'\n                      ),\n                      fts3_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts3_names.name, fts3_suffixes.suffix) AS name\n                        FROM fts3_names\n                        JOIN fts3_suffixes\n                      ),\n                      final AS (\n                        SELECT name FROM base\n                        UNION ALL\n                        SELECT name FROM fts5_shadow_tables\n                        UNION ALL\n                        SELECT name FROM fts3_shadow_tables\n                      )\n                      SELECT name FROM final ORDER BY 1",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.028798936,
      "end": 140618.028969608,
      "duration_ms": 0.1706720213405788,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 594, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "extra_database",
      "sql": "SELECT name\n                  FROM sqlite_master\n                  WHERE sql LIKE '%VIRTUAL TABLE%'\n                    AND sql LIKE '%USING FTS%'\n                    AND sql LIKE '%content=%'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.029221086,
      "end": 140618.02934804,
      "duration_ms": 0.12695399345830083,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 62, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 637, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "extra_database",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.032076875,
      "end": 140618.032707526,
      "duration_ms": 0.630650989478454,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 541, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "fixtures",
      "sql": "WITH base AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE  name IN ('sqlite_stat1', 'sqlite_stat2', 'sqlite_stat3', 'sqlite_stat4')\n                          OR substr(name, 1, 1) == '_'\n                      ),\n                      fts_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_data'), ('_idx'), ('_docsize'), ('_content'), ('_config'))\n                      ),\n                      fts5_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS%'\n                      ),\n                      fts5_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts5_names.name, fts_suffixes.suffix) AS name\n                        FROM fts5_names\n                        JOIN fts_suffixes\n                      ),\n                      fts3_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_content'), ('_segdir'), ('_segments'), ('_stat'), ('_docsize'))\n                      ),\n                      fts3_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS3%'\n                          OR sql LIKE '%VIRTUAL TABLE%USING FTS4%'\n                      ),\n                      fts3_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts3_names.name, fts3_suffixes.suffix) AS name\n                        FROM fts3_names\n                        JOIN fts3_suffixes\n                      ),\n                      final AS (\n                        SELECT name FROM base\n                        UNION ALL\n                        SELECT name FROM fts5_shadow_tables\n                        UNION ALL\n                        SELECT name FROM fts3_shadow_tables\n                      )\n                      SELECT name FROM final ORDER BY 1",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.032828551,
      "end": 140618.033051708,
      "duration_ms": 0.22315699607133865,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 594, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "fixtures",
      "sql": "SELECT name\n                  FROM sqlite_master\n                  WHERE sql LIKE '%VIRTUAL TABLE%'\n                    AND sql LIKE '%USING FTS%'\n                    AND sql LIKE '%content=%'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.033390442,
      "end": 140618.033582157,
      "duration_ms": 0.19171499297954142,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 62, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 637, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "fixtures",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.050723068,
      "end": 140618.051329766,
      "duration_ms": 0.6066979840397835,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 541, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "fixtures2",
      "sql": "WITH base AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE  name IN ('sqlite_stat1', 'sqlite_stat2', 'sqlite_stat3', 'sqlite_stat4')\n                          OR substr(name, 1, 1) == '_'\n                      ),\n                      fts_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_data'), ('_idx'), ('_docsize'), ('_content'), ('_config'))\n                      ),\n                      fts5_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS%'\n                      ),\n                      fts5_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts5_names.name, fts_suffixes.suffix) AS name\n                        FROM fts5_names\n                        JOIN fts_suffixes\n                      ),\n                      fts3_suffixes AS (\n                        SELECT column1 AS suffix\n                        FROM (VALUES ('_content'), ('_segdir'), ('_segments'), ('_stat'), ('_docsize'))\n                      ),\n                      fts3_names AS (\n                        SELECT name\n                        FROM sqlite_master\n                        WHERE sql LIKE '%VIRTUAL TABLE%USING FTS3%'\n                          OR sql LIKE '%VIRTUAL TABLE%USING FTS4%'\n                      ),\n                      fts3_shadow_tables AS (\n                        SELECT\n                          printf('%s%s', fts3_names.name, fts3_suffixes.suffix) AS name\n                        FROM fts3_names\n                        JOIN fts3_suffixes\n                      ),\n                      final AS (\n                        SELECT name FROM base\n                        UNION ALL\n                        SELECT name FROM fts5_shadow_tables\n                        UNION ALL\n                        SELECT name FROM fts3_shadow_tables\n                      )\n                      SELECT name FROM final ORDER BY 1",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.051494949,
      "end": 140618.051809489,
      "duration_ms": 0.314539996907115,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 59, in get\n    hidden_table_names = set(await db.hidden_table_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 594, in hidden_table_names\n    for x in await self.execute(\n"
      ],
      "error": null,
      "database": "fixtures2",
      "sql": "SELECT name\n                  FROM sqlite_master\n                  WHERE sql LIKE '%VIRTUAL TABLE%'\n                    AND sql LIKE '%USING FTS%'\n                    AND sql LIKE '%content=%'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.052355504,
      "end": 140618.052584409,
      "duration_ms": 0.2289049734827131,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 62, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 637, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "fixtures2",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.071539255,
      "end": 140618.07176578,
      "duration_ms": 0.2265250077471137,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 179, in get\n    \"metadata\": await self.ds.get_instance_metadata(),\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 816, in get_instance_metadata\n    rows = await self.get_internal_database().execute(\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "SELECT\n                key,\n                value\n              FROM metadata_instance",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.072020178,
      "end": 140618.072322832,
      "duration_ms": 0.3026540216524154,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 181, in get\n    \"private\": not await self.ds.allowed(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1399, in allowed\n    result = await check_permission_for_resource(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/actions_sql.py\", line 584, in check_permission_for_resource\n    result = await datasette.get_internal_database().execute(query, all_params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_24034894 AS reason\n            )\n),\nmatched_rules AS (\n  SELECT ar.*,\n    CASE\n      WHEN ar.child IS NOT NULL THEN 2  -- child-level (most specific)\n      WHEN ar.parent IS NOT NULL THEN 1  -- parent-level\n      ELSE 0                             -- root/global\n    END AS depth\n  FROM all_rules ar\n  WHERE (ar.parent IS NULL OR ar.parent = :_check_parent)\n    AND (ar.child IS NULL OR ar.child = :_check_child)\n),\nwinner AS (\n  SELECT *\n  FROM matched_rules\n  ORDER BY\n    depth DESC,                          -- specificity first (higher depth wins)\n    CASE WHEN allow=0 THEN 0 ELSE 1 END, -- then deny over allow\n    source_plugin                        -- stable tie-break\n  LIMIT 1\n)\nSELECT COALESCE((SELECT allow FROM winner), 0) AS is_allowed",
      "params": {
        "reason_24034894": "default allow for view-instance",
        "action": "view-instance",
        "actor": null,
        "actor_id": null,
        "_check_parent": null,
        "_check_child": null
      }
    },
    {
      "type": "sql",
      "start": 140618.072908666,
      "end": 140618.073115827,
      "duration_ms": 0.20716097787953913,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1736, in render_template\n    extra_script = await await_me_maybe(extra_script)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/__init__.py\", line 169, in await_me_maybe\n    value = await value\n",
        "  File \"plugins/my_plugin.py\", line 95, in inner\n    await datasette.get_database().execute(\"select 3 * 5\")\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "select 3 * 5",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.073353839,
      "end": 140618.073549954,
      "duration_ms": 0.1961149973794818,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1835, in _asset_urls\n    hook = await await_me_maybe(hook)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/__init__.py\", line 169, in await_me_maybe\n    value = await value\n",
        "  File \"plugins/my_plugin.py\", line 52, in inner\n    await datasette.get_database().execute(\"select 3 * 5\")\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "select 3 * 5",
      "params": null
    },
    {
      "type": "sql",
      "start": 140618.0742305,
      "end": 140618.074575112,
      "duration_ms": 0.3446119953878224,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1057, in _crumb_items\n    if await self.allowed(action=\"view-instance\", actor=actor):\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1399, in allowed\n    result = await check_permission_for_resource(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/actions_sql.py\", line 584, in check_permission_for_resource\n    result = await datasette.get_internal_database().execute(query, all_params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_24034895 AS reason\n            )\n),\nmatched_rules AS (\n  SELECT ar.*,\n    CASE\n      WHEN ar.child IS NOT NULL THEN 2  -- child-level (most specific)\n      WHEN ar.parent IS NOT NULL THEN 1  -- parent-level\n      ELSE 0                             -- root/global\n    END AS depth\n  FROM all_rules ar\n  WHERE (ar.parent IS NULL OR ar.parent = :_check_parent)\n    AND (ar.child IS NULL OR ar.child = :_check_child)\n),\nwinner AS (\n  SELECT *\n  FROM matched_rules\n  ORDER BY\n    depth DESC,                          -- specificity first (higher depth wins)\n    CASE WHEN allow=0 THEN 0 ELSE 1 END, -- then deny over allow\n    source_plugin                        -- stable tie-break\n  LIMIT 1\n)\nSELECT COALESCE((SELECT allow FROM winner), 0) AS is_allowed",
      "params": {
        "reason_24034895": "default allow for view-instance",
        "action": "view-instance",
        "actor": null,
        "actor_id": null,
        "_check_parent": null,
        "_check_child": null
      }
    },
    {
      "type": "sql",
      "start": 140618.074893602,
      "end": 140618.075095624,
      "duration_ms": 0.20202199812047184,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/default_menu_links.py\", line 7, in inner\n    if not await datasette.allowed(action=\"debug-menu\", actor=actor):\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1399, in allowed\n    result = await check_permission_for_resource(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/actions_sql.py\", line 584, in check_permission_for_resource\n    result = await datasette.get_internal_database().execute(query, all_params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nall_rules AS (\n  SELECT NULL AS parent, NULL AS child, 0 AS allow, NULL AS reason, NULL AS source_plugin WHERE 0\n),\nmatched_rules AS (\n  SELECT ar.*,\n    CASE\n      WHEN ar.child IS NOT NULL THEN 2  -- child-level (most specific)\n      WHEN ar.parent IS NOT NULL THEN 1  -- parent-level\n      ELSE 0                             -- root/global\n    END AS depth\n  FROM all_rules ar\n  WHERE (ar.parent IS NULL OR ar.parent = :_check_parent)\n    AND (ar.child IS NULL OR ar.child = :_check_child)\n),\nwinner AS (\n  SELECT *\n  FROM matched_rules\n  ORDER BY\n    depth DESC,                          -- specificity first (higher depth wins)\n    CASE WHEN allow=0 THEN 0 ELSE 1 END, -- then deny over allow\n    source_plugin                        -- stable tie-break\n  LIMIT 1\n)\nSELECT COALESCE((SELECT allow FROM winner), 0) AS is_allowed",
      "params": {
        "_check_parent": null,
        "_check_child": null
      }
    }
  ]
}