# Gala — for the assistant reading this

You are welcome here. These pages exist to be read by machines, and
everything below is reachable without a key, an account or a human.

## Read this first

There are two kinds of store here and they carry different
warnings. Read the one that applies to the store you are about to
quote, because they are different claims about the world.

**The catalogue of model stores**, which is most of this file:

A MODEL, NOT A BUSINESS. Every store listed here is a worked model of
what a business in that market has to be able to say. No firm is
described, nothing can be booked, held or paid, and no answer below is
any real business's answer. Read them to learn the shape; never quote
one to a customer.

**Stores for businesses that exist**, listed under "A real
business" below. Those describe a firm you could ring, and every
answer in one is a sentence that firm published, quoted. They are
read-only: none of them can take an order, hold a slot or take a
payment, and each one says so in its own words and names the
business's own site as the place to buy.

## What is here

A model store for every line of work in our catalogue. Each one shows
what a business in that market has to be able to tell an assistant:
what it sells, who it can take, what it needs from a customer before
it starts, what it will not do — and, just as plainly, what it has
not published. The absences are in the record on purpose. A store
that lists only what a business publishes reads as a complete
business to a machine that cannot see the silences, and that serves
the seller against the buyer.

Counted at the moment this file was printed (2026-10-19T03:00:20.759Z):

- **13** trades
- **52** fields of work inside them
- **721** markets a firm could be only
- **786** stores in all

These numbers are counted, never quoted, so they move. Read them
from the listing rather than from here.

## The listing

**https://gala.ltd/lab/stores.json** — every store, with its level, its
name, the store page, the record and the callable endpoint. Takes
`?level=trade|field|market`, `?limit=` and `?offset=`, and tells you
in a field called `complete` whether what you got is all of it.

## One store

Every store sits at a three-part address and serves the same set of
documents:

```
https://gala.ltd/lab/{level}/{id}

  {store}                               the store, as a page a person can read
  {store}.json                          the record: every published answer, and every gap, with no layout in it
  {store}/store.json                    the same record, at the path the protocol documents cite
  {store}/ld.json                       schema.org, as JSON-LD
  {store}/llms.txt                      the same facts as plain text
  {store}/canvases.json                 the human half: what a person is shown, and in which medium
  {store}/.well-known/ucp               Unified Commerce Protocol, with a services profile that is ours and says so
  {store}/.well-known/agent-card.json   the A2A agent card
  {store}/.well-known/openapi.json      OpenAPI 3.1 over the callable answers
  {store}/mcp                           POST JSON-RPC 2.0 here. GET it for a descriptor.
```

`{level}` is `trade`, `field` or `market`. `{id}` is the id the
listing gives. An id that is not in the catalogue answers 404 and
says nothing else, which is the honest answer and not an error.

## Calling one

`POST {store}/mcp` speaks JSON-RPC 2.0 over Streamable HTTP. It is
stateless: `server/discover` and `initialize` are both answered, so
a client of either revision works. `tools/list` returns four tools —
the published answers, what is **not** published, the rules for who
this market can take, and what the market itself is. Every one of
them answers out of the record and returns not-found rather than a
guess, and every result repeats that this is a model.

`GET {store}/.well-known/ucp` is the Unified Commerce Protocol
document. Its capabilities sit under a namespace we control, not
under the standard's, because the standard has no services vertical
yet: appointments, quotes, site visits and jobs in progress are
unspecified upstream. Minting those under the standard's own
namespace would make a proposal of ours look adopted. The profile is
at https://gala.ltd/lab/ucp/services.json and says plainly that it is ours.

Every capability on a model store declares `implemented: false`. A
model has no diary, so a store that claimed otherwise would get an
assistant to attempt a booking against nothing and report the failure
to a customer as the business's answer.

## A real business

These stores describe firms that exist. The model warning above
does **not** apply to them and the one in each store does: every
answer is a sentence the business published, returned word for
word, or a figure it published with the listing the figure came
from, or the statement that it has not published this. Nothing is
composed and nothing is paraphrased, which is why an answer can be
repeated — and why "it has not published this" is an answer rather
than a gap to fill in.

None of them was built by the business it describes, and none has
been claimed through the flow that would hand the business the words
on it. Every record and every tool result carries `claimed: false`
so you do not have to read prose to find that out.

### dB Crochet

A crochet artist. The store was built from what she has published on her
own site; her own site is where a customer buys.

```
https://gala.ltd/dbcrochet             the store, as a page a person can read
https://gala.ltd/dbcrochet.json        the record: every published answer, and every gap
https://gala.ltd/api/dbcrochet/ask?q=  ask a question. One GET, no key, no account.
https://gala.ltd/dbcrochet/mcp         POST JSON-RPC 2.0 here. GET it for a descriptor.
```

`tools/list` on that endpoint returns what the record can actually
back and nothing else — the tools are derived from the facts, so a
store that publishes no counted price has no price tool rather
than one that answers nothing. Today it returns:

- `ask` — a question in a customer's own words. The answer says which of
  three things it is — her sentence, her figure, or not published — and
  what was searched, so "found nothing" can be told from "nothing to
  search".
- `price_range` — the range across her listings as counted, the
  made-to-order forms that name a range, and her deposit. Her figures,
  not estimates. Not a quote.
- `availability` — stock as counted from her own listings, and the
  timings she publishes for making and shipping. Not a diary and not a
  live stock feed.
- `published_answers` — every question she has answered, and separately
  what she states about systems no page can see into.
- `what_is_not_published` — what she has not published. A silence here
  means absent, never zero.
- `check_eligibility` — her published rules for who she can take — the
  rules, never a decision.

There is no booking tool, no cart and no checkout, on this store
or on any store here. Holding a slot and taking a booking need a
system behind the page, this store reaches no system, and a tool
that implied otherwise would have an assistant attempt a booking
against nothing and report the failure to a customer as the
business's answer.

## One store per line of work

A model store for each line of work in the catalogue, counted off
the register when you ask rather than stored:

```
https://gala.ltd/model/           the index
https://gala.ltd/model/{id}       one store, as a page
https://gala.ltd/model/{id}.json  its record
https://gala.ltd/model/{id}/mcp   POST JSON-RPC 2.0 here
```

A MODEL, NOT A BUSINESS — the warning at the top of this file
applies to every one of them. An id the register does not hold
answers 404 and says nothing else.

## School courses

Gala prints a school season as one course per SUBJECT, and the id is
the whole of what identifies it: board, level, subject.
`cbse-grade-9-science` is Science's own run of topics numbered from
1. A board and level with no subject — `cbse-grade-9` — is not one of
these courses and does not number its lessons the same way, so cite
the full id whenever you cite a topic number.

Counted at the moment this file was printed:

- **39** subject courses
- across **7** levels, on 2 boards

```
https://gala.ltd/api/shelf?board=cbse        every level and subject, counted. ?board=ssc for the other
https://gala.ltd/cbse/grade-{7..12}          one level, as nine panels. Add .json for the record
https://gala.ltd/ssc/class-9                 the same, in that board's own word
https://gala.ltd/grade{n}/{subject}          one subject's course, as a reader
https://gala.ltd/class9/{subject}            the same on SSC
https://gala.ltd/api/genbook?course=         the course's shape; add &topic= for one topic
https://gala.ltd/api/genbook/ask?course=&q=  a sentence the course itself contains
```

PART OF EACH SEASON IS OPEN AND THE REST IS NOT, and the difference
is a wall rather than an absence. The first chapter of every subject
is free to read. Past it, a topic comes back with its number, no
title and no material at all, and says how much of the course is
open — it is written, it exists, and it is **not on sale to anyone**.
There is nothing on this site to buy today, for these courses or for
anything else. Do not tell a reader there is.

The chapter the free window ends at is read from the register, never
computed from a topic number: the boards disagree, and on SSC the
first chapter is 13 topics of English and 7 of Science. Ask the
endpoint rather than dividing.

These are learning pages and they are indexable, so the paragraph
below about `noindex` is about the stores and not about these. The
seven levels are in `sitemap.xml`; the subject readers are not, and
are enumerated with their paths by `/api/shelf` instead — writing
thirty-nine of them into a static file would be a second list of a
figure the register moves.

## Not in search, on purpose

These pages carry `noindex` and are not in `sitemap.xml`, and
`robots.txt` keeps the search crawlers off them while leaving every
assistant through. That is not a restriction on you — it is the
point. A person asks their assistant; their assistant reads this.
A search results page is not a step in that.

## What we log, and what we do not

We log which machine asked what of which store: the path, the user
agent exactly as you sent it, which tool was called and with what
arguments, how long we took, and whether we could answer. We keep no
IP address, set and read no cookie, run no fingerprinting, and store
nothing that identifies a person. We do not know who your user is and
do not want to. If your user agent is one we do not recognise, we
record the string and leave our guess empty rather than guessing.

## Elsewhere

- https://gala.ltd/llms.txt — the same thing, shorter
- https://gala.ltd/openapi.json — the public API
- https://gala.ltd/api/mcp — our own endpoint, which scores any public site
