This page is generated from an actual test run on
June 11, 2026: a real model dropped into a fresh, empty
workspace. Nothing here is mocked or hand-written. The transcripts are
complete; secrets are masked and the sandbox temp prefix is shortened to
workspace/-relative paths, nothing else is touched.
Setup
Three copy-paste steps. This is the entire setup.
gcontext init
.envSUPABASE_URL=https://your-project.supabase.co
SUPABASE_SECRET_KEY=sb_secret_...
Only the names SUPABASE_URL and
SUPABASE_SECRET_KEY ever appear in module files. The
values stay in the gitignored .env.
Create a supabase integration module for our Supabase project and load it
into the workspace. The project URL and a secret API key are already in
.env as SUPABASE_URL and SUPABASE_SECRET_KEY. Declare both by name in
module.yaml and NEVER copy their values into any module file. In info.md,
document how to call the Supabase REST API (PostgREST) with those
variables: base path /rest/v1/, the apikey and Authorization headers, and
an example table query.
The test run appends one sandbox-only clause (the gcontext CLI binary is not installed inside the sandbox, so the agent creates the files by hand). You can see it at the end of the prompt in the transcript below; everything else is exactly this prompt.
Session 1 · the agent builds the integration
Every row below is one real tool call. The one-line summaries are generated from the call itself; click any row for the raw call and result.
Create a supabase integration module for our Supabase project and load it into the workspace. The project URL and a secret API key are already in .env as SUPABASE_URL and SUPABASE_SECRET_KEY. Declare both by name in module.yaml and NEVER copy their values into any module file. In info.md, document how to call the Supabase REST API (PostgREST) with those variables: base path /rest/v1/, the apikey and Authorization headers, and an example table query. The gcontext CLI is not installed here, so create the module files and the context/ symlink by hand following context/structure.md and context/principles.md.
Before writing anything, the agent walks the generated docs: how modules are structured, where secrets live, what an integration needs.
{
"file_path": "context/system.md"
}1 <!-- GENERATED by gcontext. This file is rewritten on every `gcontext load`/`unload`. Do not edit it directly — edit modules in modules-repo/ instead. --> 2 3 # System 4 5 You are an AI agent powered by loaded context modules. 6 7 You are direct, efficient, and familiar with the loaded context. No hedging, no filler. Lead with the answer. 8 9 ## Two responsibilities 10 11 1. **Operate modules** — read context, run scripts, answer questions. This file covers that. 12 2. **Modify context** — create or edit modules. See [principles.md](principles.md) before doing this. 13 14 ## First run — setting up a new workspace 15 16 **Trigger:** the user asks to set up gcontext, get started, or onboard the project while the workspace has no real modules yet — the Loaded modules table at the end of this file is empty and `modules-repo/` contains nothing beyond the seeded `example/`. Skip this section entirely when real modules already exist (e.g. a colleague joining an existing workspace — their setup is just filling in `.env`). 17 18 Do NOT explain the module taxonomy, and never ask the user to pick a module kind — you pick it. Run a short interview instead: 19 20 1. Ask three questions: *"What do you find yourself re-explaining to your agent every session?"*, *"What does it always get wrong about this project?"*, and *"What are you in the middle of right now?"* 21 2. From the answers — plus what you can discover yourself in the repo (its README, manifest files like `package.jso … [4174 more chars truncated for the report]
{
"command": "find workspace -not -path '*/node_modules/*' | head -50",
"description": "List workspace files"
}workspace context .gitignore .env modules-repo AGENTS.md CLAUDE.md context/module_features.md context/llms.txt context/principles.md .../test_claude … [969 more chars truncated for the report]
{
"file_path": "context/structure.md"
}1 <!-- GENERATED by gcontext. This file is rewritten on every `gcontext load`/`unload`. Do not edit it directly — edit modules in modules-repo/ instead. -->
2
3 # Module Structure
4
5 Auto-generated from `manifest.py` and `kind_specs.py`. Do not edit by hand.
6
7 ## module.yaml schema
8
9 - `name` (str, required) — Folder slug; must match the module directory name.
10 - `kind` ('integration' | 'task' | 'workflow', default "integration") — One of: "integration", "task", "workflow". Determines the module's file layout (see Module kinds below).
11 - `secrets` (list[str], default []) — Environment variable names this module needs at runtime. Values are read from the `.env` file at the project root (see secrets.md).
12 - `dependencies` (list[str], default []) — Python packages the module's scripts need at runtime. Install them in your environment before running module scripts.
13
14 Omit fields that match their default. Unknown fields are rejected.
15
16 ## Module kinds
17
18 ### `integration`
19
20 Reusable access to an external service, API, database, or local tool.
21
22 **Files written at creation:**
23 - `module.yaml`
24 - `llms.txt`
25 - `info.md` — Purpose, Where it lives, Auth & access, Key entities, Operations, Examples.
26
27 **Default growth folders** (lazy: created on first entry; seed these into `llms.txt` `## Where to write` at module creation):
28 - `notes` -> `notes/<date-slug>.md`
29
30 ### `task`
31
32 A bounded outcome needing progress tracking, subt
… [1421 more chars truncated for the report]{
"file_path": "context/principles.md"
}1 <!-- GENERATED by gcontext. This file is rewritten on every `gcontext load`/`unload`. Do not edit it directly — edit modules in modules-repo/ instead. --> 2 3 # Principles — Modifying Context 4 5 These are the rules for creating, editing, or extending modules. 6 7 ## Module locations 8 9 Modules live at `modules-repo/<slug>/`. The `context/` directory contains symlinks for the subset of modules currently loaded into the active workspace — **it is a view, not a storage location.** 10 11 Two operations that look similar but are NOT the same: 12 13 - **Create / edit a module.** You write files at `modules-repo/<slug>/...`. This is the only kind of write you perform. 14 - **Load a module into the workspace.** This creates a symlink inside `context/`. It is managed by the `gcontext` CLI, not by you. 15 16 Each module is a folder with at least `module.yaml` and `llms.txt`. 17 18 ## Reading context before modifying 19 20 Before answering anything that references or implies a topic likely covered by an existing module, read that module's `llms.txt` first. If `llms.txt` declares a `## Where to write` section, that section governs where any subsequent appends go (path, naming pattern, template). Do NOT invent a new location. 21 22 If no module matches, you may answer from general knowledge — but if the conversation produces durable content (a finding, a note worth keeping, a new procedure), propose a new module rather than silently dropping it. 23 24 ## Module schema and k … [674 more chars truncated for the report]
{
"file_path": "context/secrets.md"
}1 <!-- GENERATED by gcontext. This file is rewritten on every `gcontext load`/`unload`. Do not edit it directly — edit modules in modules-repo/ instead. --> 2 3 # Secrets 4 5 Secrets are environment variables. Modules declare which variables they need in `module.yaml` under the `secrets:` list — variable names only, never values. 6 7 ## How it works 8 9 1. Check a module's `module.yaml` for its `secrets:` list 10 2. Values live in `.env` at the project root (gitignored, never committed) 11 3. `.env.example` is auto-generated with all required variable names 12 4. Run `gcontext env` to check which variables are set or missing 13 14 ## Rules 15 16 - Never hardcode secret values in module files 17 - Never commit `.env` to version control 18 - Access secrets via `os.environ` in scripts 19
{
"file_path": "context/llms.txt"
}1 <!-- GENERATED by gcontext. This file is rewritten on every `gcontext load`/`unload`. Do not edit it directly — edit modules in modules-repo/ instead. --> 2 3 # Context 4 5
{
"file_path": "modules-repo/example/module.yaml"
}1 name: example 2
{
"file_path": "modules-repo/example/llms.txt"
}1 # example 2 3 > A sample module demonstrating the context module structure 4 5 - [info.md](info.md): What this module contains and how to use it 6 - [module.yaml](module.yaml): Module configuration 7
{
"file_path": "modules-repo/example/info.md"
}1 # example 2 3 ## Purpose 4 This is a sample module showing the structure of a context module. Use it as a reference when creating your own modules. 5 6 ## Where it lives 7 This module exists locally in your workspace. 8 9 ## Auth & access 10 No authentication needed — this is a documentation-only module. 11 12 ## Key entities 13 - **Modules** — folders with a `module.yaml` and `llms.txt` 14 - **Kinds** — integration, task, or workflow 15 16 ## Operations 17 - Read this module's files to understand the structure 18 - Create your own module with `gcontext new integration <name>` 19 20 ## Examples 21 ```bash 22 # Create a new integration module 23 gcontext new integration stripe 24 25 # Load it into the workspace 26 gcontext load stripe 27 28 # Check module structure 29 gcontext validate stripe 30 ``` 31
{
"command": "cut -d= -f1 .env",
"description": "List variable names in .env without values"
}Permission to use Bash with command cut -d= -f1 .env has been denied.
module.yaml declares the secret names only, llms.txt is the navigation index, info.md carries the API know-how.
{
"file_path": "modules-repo/supabase/module.yaml",
"content": "name: supabase\nsecrets:\n - SUPABASE_URL\n - SUPABASE_SECRET_KEY\n"
}File created successfully at: modules-repo/supabase/module.yaml (file state is current in your context — no need to Read it back)
{
"file_path": "modules-repo/supabase/llms.txt",
"content": "# supabase\n\n> Integration with our Supabase project: how to call the REST API (PostgREST) using the `SUPABASE_URL` and `SUPABASE_SECRET_KEY` secrets\n\n- [info.md](info.md): Auth headers, the /rest/v1/ base path, and example table queries against the Supabase REST API\n- [module.yaml](module.yaml): Module configuration and required secret names\n\n## Where to write\n\n- notes/<date-slug>.md: dated notes (schema findings, gotchas, query recipes) discovered while working with Supabase\n"
}File created successfully at: modules-repo/supabase/llms.txt (file state is current in your context — no need to Read it back)
{
"file_path": "modules-repo/supabase/info.md",
"content": "# supabase\n\n## Purpose\nREST access to our Supabase project's Postgres database through the PostgREST API, authenticated with the project's secret API key.\n\n## Where it lives\nThe project base URL is the value of `SUPABASE_URL` (stored in `.env` at the project root, never in this module). The REST API is served under the base path:\n\n```\n{SUPABASE_URL}/rest/v1/\n```\n\n## Auth & access\nTwo secrets, declared by name in `module.yaml`, values read from `.env`:\n\n- `SUPABASE_URL`: the Supabase project URL\n- `SUPABASE_SECRET_KEY`: a secret API key; it bypasses Row Level Security, so it is server-side only and must never be exposed to a browser, logged, or written into module files\n\nEvery REST request must send the key in both headers:\n\n```\napikey: <value of SUPABASE_SECRET_KEY>\nAuthorization: Bearer <value of SUPABASE_SECRET_KEY>\n```\n\nIn scripts, read both values via `os.environ`; in shell, source `.env` first. Never hardcode the values.\n\n## Key entities\n- **Tables and views**: each exposed table or view in the `public` schema is available at `{SUPABASE_URL}/rest/v1/<table>`\n- **Rows**: returned as JSON arrays of objects; selected, filtered, ordered, and paginated via query parameters\n- **RPC functions**: exposed Postgres functions are callable at `{SUPABASE_URL}/rest/v1/rpc/<function>` with a JSON body of arguments\n\n## Operations\n- **Read rows**: `GET /rest/v1/<table>?select=<columns>&<filters>`\n- **Filter**: `?<column>=eq.<value>` (also `gt.`, `gte.`, `lt.`, `lte.`, `neq.`, `like.`, `in.(a,b)`)\n- **Order and paginate**: `?order=<column>.desc&limit=<n>&offset=<n>`\n- **Insert**: `POST /rest/v1/<table>` with a JSON object (or array) body, plus `Content-Type: application/json`; add `Prefer: return=representation` to get the inserted rows back\n- **Update**
… [1414 more chars truncated for the report]File created successfully at: modules-repo/supabase/info.md (file state is current in your context — no need to Read it back)
The gcontext CLI is not installed in the test sandbox, so the agent emulates gcontext load by hand: a symlink into context/ plus the two regenerated index files.
{
"command": "ln -s ../modules-repo/supabase context/supabase && ls -la context/",
"description": "Create context/ symlink to the supabase module"
}total 56 drwxr-xr-x@ 9 bsampera staff 288 Jun 11 00:34 . drwxr-xr-x@ 8 bsampera staff 256 Jun 11 00:33 .. -rw-r--r--@ 1 bsampera staff 169 Jun 11 00:33 llms.txt -rw-r--r--@ 1 bsampera staff 712 Jun 11 00:33 module_features.md -rw-r--r--@ 1 bsampera staff 2099 Jun 11 00:33 principles.md -rw-r--r--@ 1 bsampera staff 758 Jun 11 00:33 secrets.md -rw-r--r--@ 1 bsampera staff 2757 Jun 11 00:33 structure.md lrwxr-xr-x@ 1 bsampera staff 24 Jun 11 00:34 supabase -> ../modules-repo/supabase -rw-r--r--@ 1 bsampera staff 5482 Jun 11 00:33 system.md
{
"replace_all": false,
"file_path": "context/llms.txt",
"old_string": "# Context\n\n",
"new_string": "# Context\n\n- [supabase/llms.txt](supabase/llms.txt): Supabase project integration: REST API (PostgREST) access using the SUPABASE_URL and SUPABASE_SECRET_KEY secrets\n"
}The file context/llms.txt has been updated successfully. (file state is current in your context — no need to Read it back)
{
"replace_all": false,
"file_path": "context/system.md",
"old_string": "## Loaded modules\n\nNo modules loaded.",
"new_string": "## Loaded modules\n\n| Module | Kind | Description |\n| --- | --- | --- |\n| [supabase](supabase/llms.txt) | integration | Supabase project REST API (PostgREST) access using `SUPABASE_URL` and `SUPABASE_SECRET_KEY` |"
}The file context/system.md has been updated successfully. (file state is current in your context — no need to Read it back)
The symlink resolves, and no secret value appears anywhere in the module files.
{
"command": "ls context/supabase/ && grep -rn \"SUPABASE\" modules-repo/supabase/ | grep -v -E \"SUPABASE_(URL|SECRET_KEY)\" || echo \"OK: only variable names referenced, no values\"",
"description": "Verify symlink resolves and no secret values leaked into module files"
}info.md llms.txt module.yaml OK: only variable names referenced, no values
The result
Three files make an integration. Note that
module.yaml declares secret names only, never values.
modules-repo/supabase/info.md81 lines# supabase
## Purpose
REST access to our Supabase project's Postgres database through the PostgREST API, authenticated with the project's secret API key.
## Where it lives
The project base URL is the value of `SUPABASE_URL` (stored in `.env` at the project root, never in this module). The REST API is served under the base path:
```
{SUPABASE_URL}/rest/v1/
```
## Auth & access
Two secrets, declared by name in `module.yaml`, values read from `.env`:
- `SUPABASE_URL`: the Supabase project URL
- `SUPABASE_SECRET_KEY`: a secret API key; it bypasses Row Level Security, so it is server-side only and must never be exposed to a browser, logged, or written into module files
Every REST request must send the key in both headers:
```
apikey: <value of SUPABASE_SECRET_KEY>
Authorization: Bearer <value of SUPABASE_SECRET_KEY>
```
In scripts, read both values via `os.environ`; in shell, source `.env` first. Never hardcode the values.
## Key entities
- **Tables and views**: each exposed table or view in the `public` schema is available at `{SUPABASE_URL}/rest/v1/<table>`
- **Rows**: returned as JSON arrays of objects; selected, filtered, ordered, and paginated via query parameters
- **RPC functions**: exposed Postgres functions are callable at `{SUPABASE_URL}/rest/v1/rpc/<function>` with a JSON body of arguments
## Operations
- **Read rows**: `GET /rest/v1/<table>?select=<columns>&<filters>`
- **Filter**: `?<column>=eq.<value>` (also `gt.`, `gte.`, `lt.`, `lte.`, `neq.`, `like.`, `in.(a,b)`)
- **Order and paginate**: `?order=<column>.desc&limit=<n>&offset=<n>`
- **Insert**: `POST /rest/v1/<table>` with a JSON object (or array) body, plus `Content-Type: application/json`; add `Prefer: return=representation` to get the inserted rows back
- **Update**: `PATCH /rest/v1/<table>?<filter>` with a JSON body of changed columns; always include a filter
- **Delete**: `DELETE /rest/v1/<table>?<filter>`; always include a filter, an unfiltered DELETE affects every row
## Examples
Query a table with curl (loads secrets from `.env`, never inlines them):
```bash
set -a; source .env; set +a
curl "$SUPABASE_URL/rest/v1/todos?select=id,title,done&done=eq.false&order=id.desc&limit=10" \
-H "apikey: $SUPABASE_SECRET_KEY" \
-H "Authorization: Bearer $SUPABASE_SECRET_KEY"
```
Same query from Python (stdlib only, run with `uv run`):
```python
# uv run query_todos.py
import json
import os
import urllib.request
base = os.environ["SUPABASE_URL"].rstrip("/")
key = os.environ["SUPABASE_SECRET_KEY"]
req = urllib.request.Request(
f"{base}/rest/v1/todos?select=id,title,done&done=eq.false&limit=10",
headers={"apikey": key, "Authorization": f"Bearer {key}"},
)
with urllib.request.urlopen(req) as resp:
print(json.dumps(json.load(resp), indent=2))
```
Insert a row:
```bash
set -a; source .env; set +a
curl -X POST "$SUPABASE_URL/rest/v1/todos" \
-H "apikey: $SUPABASE_SECRET_KEY" \
-H "Authorization: Bearer $SUPABASE_SECRET_KEY" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d '{"title": "buy milk", "done": false}'
```
modules-repo/supabase/llms.txt10 lines# supabase > Integration with our Supabase project: how to call the REST API (PostgREST) using the `SUPABASE_URL` and `SUPABASE_SECRET_KEY` secrets - [info.md](info.md): Auth headers, the /rest/v1/ base path, and example table queries against the Supabase REST API - [module.yaml](module.yaml): Module configuration and required secret names ## Where to write - notes/<date-slug>.md: dated notes (schema findings, gotchas, query recipes) discovered while working with Supabase
modules-repo/supabase/module.yaml4 linesname: supabase secrets: - SUPABASE_URL - SUPABASE_SECRET_KEY
Verification
Every check is deterministic; none of them trusts the agent's own account of what it did.
| Tables (independent Supabase API call) | users |
| Module created by the agent | supabase |
| users row count (independent Supabase API call) | 14 |
| Agent's answer (session 2) | 14 |
gcontext validate supabase (output)supabase PASS
Session 2 · a fresh agent uses it
A second session starts with zero context: a new
conversation that has never seen the project. It gets one question:
Using the supabase integration module in this workspace, find out how many users are in the users table, and reply with only the number.
Using the supabase integration module in this workspace, find out how many users are in the users table, and reply with only the number.
A fresh conversation with zero prior context: it reads the workspace index, finds the supabase module in the loaded-modules table, and reads the docs the first agent wrote.
{
"file_path": "context/system.md"
}1 <!-- GENERATED by gcontext. This file is rewritten on every `gcontext load`/`unload`. Do not edit it directly — edit modules in modules-repo/ instead. --> 2 3 # System 4 5 You are an AI agent powered by loaded context modules. 6 7 You are direct, efficient, and familiar with the loaded context. No hedging, no filler. Lead with the answer. 8 9 ## Two responsibilities 10 11 1. **Operate modules** — read context, run scripts, answer questions. This file covers that. 12 2. **Modify context** — create or edit modules. See [principles.md](principles.md) before doing this. 13 14 ## First run — setting up a new workspace 15 16 **Trigger:** the user asks to set up gcontext, get started, or onboard the project while the workspace has no real modules yet — the Loaded modules table at the end of this file is empty and `modules-repo/` contains nothing beyond the seeded `example/`. Skip this section entirely when real modules already exist (e.g. a colleague joining an existing workspace — their setup is just filling in `.env`). 17 18 Do NOT explain the module taxonomy, and never ask the user to pick a module kind — you pick it. Run a short interview instead: 19 20 1. Ask three questions: *"What do you find yourself re-explaining to your agent every session?"*, *"What does it always get wrong about this project?"*, and *"What are you in the middle of right now?"* 21 2. From the answers — plus what you can discover yourself in the repo (its README, manifest files like `package.jso … [4355 more chars truncated for the report]
{
"file_path": "supabase/llms.txt"
}File does not exist. Note: your current working directory is workspace.
{
"command": "ls -la context/ modules-repo/supabase/ 2>&1",
"description": "List workspace, context, and supabase module directories"
}: total 32 drwxr-xr-x@ 8 bsampera staff 256 Jun 11 00:33 . drwx------@ 3 bsampera staff 96 Jun 11 00:33 .. -rw-r--r--@ 1 bsampera staff 116 Jun 11 00:33 .env -rw-r--r--@ 1 bsampera staff 5 Jun 11 00:33 .gitignore -rw-r--r--@ 1 bsampera staff 346 Jun 11 00:33 AGENTS.md -rw-r--r--@ 1 bsampera staff 11 Jun 11 00:33 CLAUDE.md drwxr-xr-x@ 9 bsampera staff 288 Jun 11 00:35 context drwxr-xr-x@ 4 bsampera staff 128 Jun 11 00:34 modules-repo context/: total 56 drwxr-xr-x@ 9 bsampera staff 288 Jun 11 00:35 . drwxr-xr-x@ 8 bsampera staff 256 Jun 11 00:33 .. -rw-r--r--@ 1 bsampera staff 324 Jun 11 00:35 llms.txt -rw-r--r--@ 1 bsampera staff 712 Jun 11 00:33 module_features.md -rw-r--r--@ 1 bsampera staff 2099 Jun 11 00:33 principles.md -rw-r--r--@ 1 bsampera staff 758 Jun 11 00:33 secrets.md -rw-r--r--@ 1 bsampera staff 2757 Jun 11 00:33 structure.md lrwxr-xr-x@ 1 bsampera staff 24 Jun 11 00:34 supabase -> ../modules-repo/supabase -rw-r--r--@ 1 bsampera staff 5657 Jun 11 00:35 system.md modules-repo/supabase/: total 24 drwxr-xr-x@ 5 bsampera staff 160 Jun 11 00: … [232 more chars truncated for the report]
{
"file_path": "modules-repo/supabase/info.md"
}1 # supabase
2
3 ## Purpose
4 REST access to our Supabase project's Postgres database through the PostgREST API, authenticated with the project's secret API key.
5
6 ## Where it lives
7 The project base URL is the value of `SUPABASE_URL` (stored in `.env` at the project root, never in this module). The REST API is served under the base path:
8
9 ```
10 {SUPABASE_URL}/rest/v1/
11 ```
12
13 ## Auth & access
14 Two secrets, declared by name in `module.yaml`, values read from `.env`:
15
16 - `SUPABASE_URL`: the Supabase project URL
17 - `SUPABASE_SECRET_KEY`: a secret API key; it bypasses Row Level Security, so it is server-side only and must never be exposed to a browser, logged, or written into module files
18
19 Every REST request must send the key in both headers:
20
21 ```
22 apikey: <value of SUPABASE_SECRET_KEY>
23 Authorization: Bearer <value of SUPABASE_SECRET_KEY>
24 ```
25
26 In scripts, read both values via `os.environ`; in shell, source `.env` first. Never hardcode the values.
27
28 ## Key entities
29 - **Tables and views**: each exposed table or view in the `public` schema is available at `{SUPABASE_URL}/rest/v1/<table>`
30 - **Rows**: returned as JSON arrays of objects; selected, filtered, ordered, and paginated via query parameters
31 - **RPC functions**: exposed Postgres functions are callable at `{SUPABASE_URL}/rest/v1/rpc/<function>` with a JSON body of arguments
32
33 ## Operations
34 - **Read rows**: `GET /rest/v1/<table>?select=<columns>&<filters>`
… [1832 more chars truncated for the report]{
"file_path": "modules-repo/supabase/module.yaml"
}1 name: supabase 2 secrets: 3 - SUPABASE_URL 4 - SUPABASE_SECRET_KEY 5
{
"file_path": "context/secrets.md"
}1 <!-- GENERATED by gcontext. This file is rewritten on every `gcontext load`/`unload`. Do not edit it directly — edit modules in modules-repo/ instead. --> 2 3 # Secrets 4 5 Secrets are environment variables. Modules declare which variables they need in `module.yaml` under the `secrets:` list — variable names only, never values. 6 7 ## How it works 8 9 1. Check a module's `module.yaml` for its `secrets:` list 10 2. Values live in `.env` at the project root (gitignored, never committed) 11 3. `.env.example` is auto-generated with all required variable names 12 4. Run `gcontext env` to check which variables are set or missing 13 14 ## Rules 15 16 - Never hardcode secret values in module files 17 - Never commit `.env` to version control 18 - Access secrets via `os.environ` in scripts 19
Straight from the module docs: a count request against the REST API, no table dump.
{
"command": "set -a; source .env; set +a; curl -s -I \"$SUPABASE_URL/rest/v1/users?select=id\" -H \"apikey: $SUPABASE_SECRET_KEY\" -H \"Authorization: Bearer $SUPABASE_SECRET_KEY\" -H \"Prefer: count=exact\" -H \"Range: 0-0\" | grep -i content-range",
"description": "Get exact row count of users table via PostgREST"
}content-range: 0-13/14
The numbers match. The test fails if they do not.