oficina / memoria Public

🤖 spec: verified against a live key, and repin both tiers to dated ids

First round of §13's live checks ran 2026-09-05. Three results.

The text-embedding-3-small probe returned 403. It did not succeed, so no
proxying to OpenAI was demonstrated — but 403 is a refusal, not a
not-found. A 404 would have said "no such model"; 403 is consistent with a
routable name this key is not entitled to. It rules out proxying for
anyone, not proxying for someone, so §8.3 still reads "narrowed, not
closed" and §13 says re-probe with another key if one turns up.

encoding_format: "base64" is accepted and silently discarded — the response
is JSON floats, byte-identical to the request that omits it. So ingest is
~4 GB on the wire for 90k chunks with no opt-out, not the ~2 GB §7.2
hedged with. The behaviour matters as much as the number: a provider that
takes a parameter and drops it will do it again, which argues for asserting
on what comes back rather than on what was asked for.

And the catalogue settles the pinning question with evidence rather than
inference. It lists deepseek/deepseek-v4-pro AND deepseek/deepseek-v4-pro-0813
side by side — the same model as bare alias and dated snapshot, in this
vendor's own inventory. Only DeepSeek and one Qwen offer dated ids at all;
every Kimi, GLM and MiniMax id is bare. So both tiers move to DeepSeek:
v4-flash-0731 cheap, v4-pro-0813 frontier. That is §8.2's own rule applied,
not a quality judgement, and Paul's "categorisation and memory, not complex
reasoning" is what makes a dated id worth more than a preferred family.

The cost is concentration: both tiers are now one lab as well as one host,
where the previous pair spanned two. Recorded in §13, not mitigated. And
v4-flash-0731 is unpriced, so §8.6's cheap-tier month is owed.

Two claims retracted, both mine, both from concluding off a truncated
list: moonshotai/kimi-k3 does exist, and their website's model list does
match the API. head -c 2000 cut the response mid-entry and I read the
absence as evidence. That is §1.6's lesson arriving by a different door —
check the source, and check you have all of it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Paul Campbell pushed by paul@keymail.dev f34ed88092f610ae69fbb5d9a656000f2913bc58 parent 0f559e6
2 files changed, +98 −49
  • QUESTIONS-FOR-PAUL.md +18 −7
  • docs/superpowers/specs/2026-09-03-memoria-design.md +80 −42
diff --git a/QUESTIONS-FOR-PAUL.md b/QUESTIONS-FOR-PAUL.md
index 8d01c03..82edac2 100644
--- a/QUESTIONS-FOR-PAUL.md
+++ b/QUESTIONS-FOR-PAUL.md
@@ -93,13 +93,24 @@ much — the new per-query figures sit *inside* the ranges §8.6 already
carried, near the bottom. The ceilings fell; the estimates didn't. Roughly
$3/month all-cheap, $50 all-frontier.
-**What I could not do:** verify any of it against a live key. If the
-LlamaIndex page's `text-embedding-3-small` call actually succeeds against
-`api.tensorx.ai`, they are proxying to OpenAI and we are back to two
-parties. And even a clean result there doesn't tell us whose GPUs run the
-model — TensorX is young to own datacentres in three cities, so there is
-probably a subprocessor, which is a DPA question and the DPA is unread.
-§8.3 now says "narrowed, not closed" rather than claiming the win.
+**Now verified against your key (2026-09-05), with one caveat.** The
+embeddings endpoint serves `qwen/qwen3-embedding-8b` as documented, and the
+`text-embedding-3-small` probe — the one that would have shown them
+proxying to OpenAI — **came back 403.** That is the good outcome, but read
+it precisely: 403 is a *refusal*, not a *not-found*. A 404 would have said
+"no such model"; 403 is consistent with a routable name your key isn't
+entitled to. It rules out proxying-for-anyone, not proxying-for-someone.
+§8.3 still says "narrowed, not closed", and the subprocessor question is
+untouched by any of this — that needs the DPA, not the API.
+
+**Two corrections to what I told you an hour ago**, both from my reading a
+truncated list and drawing a conclusion from it: `moonshotai/kimi-k3` does
+exist, and their website's model list does match the API. I said otherwise
+on 27 of 27 models' worth of missing data. The same mistake §1.6 is about.
+
+**And one real finding: `encoding_format: "base64"` is accepted and
+silently ignored.** So ingest pulls ~4 GB over the wire for a 90k-chunk
+corpus, not the ~2 GB I hedged with, and there is no opt-out (§7.2).
Still does not bite until slice 2.
diff --git a/docs/superpowers/specs/2026-09-03-memoria-design.md b/docs/superpowers/specs/2026-09-03-memoria-design.md
index 4a70019..aff242f 100644
--- a/docs/superpowers/specs/2026-09-03-memoria-design.md
+++ b/docs/superpowers/specs/2026-09-03-memoria-design.md
@@ -1013,9 +1013,17 @@ red* — and gate 23 carries the measurement it cannot do.
storing, so the table below is unchanged — 90k chunks × 4096 f32 is
**~1.4 GB decoded to store 46 MB**, a ratio of about 32×, not the 8× you
get by mis-reading the kept width as the f32@512 intermediate (184 MB is
-what truncation yields; int8 quantisation is what is stored). On the wire
-it is worse than decoded: **~2 GB base64, ~4 GB as JSON floats**, and
-whether TensorX honours `encoding_format: "base64"` is unverified (§13).
+what truncation yields; int8 quantisation is what is stored).
+
+**On the wire it is ~4 GB, and there is no opt-out.** Tested 2026-09-05:
+`encoding_format: "base64"` is **accepted and silently ignored** — the
+response comes back as JSON floats, byte-identical to the request that
+omits the parameter. Not an error, just dropped. So the ~2 GB base64 figure
+an earlier draft hedged with is unavailable, and the honest number is the
+JSON one. Note the behaviour as well as the number: **a provider that
+accepts a parameter and discards it will do so again**, which is an
+argument for asserting on what comes back rather than on what was asked
+for.
This is ingest-time, not wake-time, so §7.3's ceiling is untouched. It is
not free either: neither the first embed's wall-clock nor the batch size
@@ -1196,22 +1204,37 @@ alongside it. The passages have already passed the gate.
Two configuration names — `model.cheap`, `model.frontier` — with the
route printed on the answer.
-**The pinning rule bit the first two ids this section chose.** They were
-`z-ai/glm-5.3-flash` and `moonshotai/kimi-k3`; neither is datestamped, and
-Kimi's own history (`k2-0711`, `k2-0905`) says a bare family name is an
-alias over dated checkpoints. By the rule below they are floating aliases,
-so **prefer a datestamped id wherever the catalogue offers one** —
-`deepseek/deepseek-v4-pro-0813` for the frontier tier — and where it does
-not, the id is provisional and §13 carries it. Whether TensorX holds a
-stable id to stable weights is **unread**, not established.
-
-**Where no datestamped id exists, a canary substitutes for one.** At first
-configuration, embed a fixed set of public, non-content sentences — they
-are not team content, so §3.2 is untouched — seal the vectors, re-embed on
-wake, and **state an anomaly when cosine drift exceeds a stated ε**. That
-detects a silent weight swap under a stable id, which is the exact failure
-the rule names, and it is the same instrument §13's single-model item
-needs. Gate 24.
+**The pinning rule bit the first two ids this section chose**, and the
+catalogue since settled how to satisfy it. The first pair were
+`z-ai/glm-5.3-flash` and `moonshotai/kimi-k3`, neither datestamped. **The
+live catalogue proves the concern rather than merely suggesting it: it
+lists `deepseek/deepseek-v4-pro` and `deepseek/deepseek-v4-pro-0813` side
+by side** — the same model as a bare alias and as a dated snapshot, which
+is exactly the shape the rule is about, in this vendor's own inventory
+(`GET /v1/models`, 2026-09-05).
+
+**Only two families offer a dated id at all.** DeepSeek
+(`v4-pro-0813`, `v4-flash-0731`, `r1-0528`) and one Qwen
+(`qwen3-235b-a22b-2507`). Every Kimi, GLM and MiniMax id is a bare name —
+`kimi-k3` exists, but no `kimi-k3-<date>` does. So pinning Kimi would make
+gate 24's canary load-bearing, and pinning DeepSeek does not.
+
+**Both tiers are therefore DeepSeek:** `model.cheap` is
+`deepseek/deepseek-v4-flash-0731` and `model.frontier` is
+`deepseek/deepseek-v4-pro-0813`. This is the rule below applied, not a
+quality judgement — Paul's ruling that the work is "categorisation and
+memory, not complex reasoning" (§13) is what makes a dated id worth more
+here than a preferred family. **The cost is concentration:** both tiers now
+come from one lab as well as one host, so a DeepSeek withdrawal moves both
+at once. Recorded rather than mitigated; §13.
+
+**The canary stays, demoted.** At first configuration, embed a fixed set of
+public, non-content sentences — not team content, so §3.2 is untouched —
+seal the vectors, re-embed on wake, and **state an anomaly when cosine
+drift exceeds a stated ε**. With both chat tiers dated it is no longer the
+only thing standing between us and a silent weight swap; it remains the
+only such instrument for **the embedding model**, which has no dated form
+and cannot be swapped without re-embedding the corpus. Gate 24.
**`openrouter/auto` is disqualified**, and so is anything shaped like it.
It selects by trailing-7-day community spend, changes weekly, and cannot be
@@ -1418,12 +1441,14 @@ tokens against a 90k-chunk corpus; draft 3 corrected to 36M by keeping the
from §7.2's measurement, and if that measurement moves so does this.
**Query:** retrieval is free. The generative layer sends ~8 passages plus
-instructions — ~5k tokens in, ~500 out. At §8.3's list prices
-`z-ai/glm-5.3-flash` ($0.20/$0.50 per M) is **~$0.0013 a query** and
-`moonshotai/kimi-k3` ($3.00/$15.00) is **~$0.023**. Five people × 20
-queries/day × 22 days = 2,200 queries: **~$3/month if most route cheap,
-~$50 if most route frontier** — or ~$26 with
-`deepseek/deepseek-v4-pro-0813` as the frontier tier. Read that carefully:
+instructions — ~5k tokens in, ~500 out. Against the ids §8.2 pins:
+`deepseek/deepseek-v4-pro-0813` at $2.00/$4.00 per M is **~$0.012 a
+query**, so 5 people × 20 queries/day × 22 days = 2,200 queries is
+**~$26/month with everything on the frontier tier**. **`deepseek/deepseek-v4-flash-0731`
+is unpriced here** — it was pinned after the price list was read, and the
+figure is owed (§13). For scale only, and not as an estimate: the
+comparably-named `z-ai/glm-5.3-flash` is $0.20/$0.50, which would put the
+all-cheap month near $3. Read the rest carefully:
both figures sit *inside* the $0.001–0.003 and $0.02–0.10 per-query ranges
this section already carried, near the bottom. **The ceilings fell; the
estimates did not move.** Nothing here is a reason to route more queries to
@@ -1680,8 +1705,9 @@ recorded in Docs. **This is the slice that turns on whole-corpus egress**,
so it does not land before its disclosure copy does.
Four things enter with it rather than after, because each is cheap now and
-a silent wrong answer later: **the live-call verification** §13 asks for,
-against a real key, before anything is signed; **gate 22**, which is
+a silent wrong answer later: **the remaining live-key checks** §13 lists —
+the first round ran on 2026-09-05 and left the 403 and the batch size
+open; **gate 22**, which is
deterministic and costs nothing; **a labelled query set**, without which
gate 23 cannot be written at all; and **gate 24's canary**, which is the
only thing standing between a stable model id and a silent weight swap.
@@ -1796,21 +1822,33 @@ rows.
organisation sees the corpus: **whether a subprocessor sits under TensorX
is a DPA question and the DPA is unread**, as are the retention terms
§8.3 calls "advertised". Both before slice 2.
-- **One live call, before anything is signed.** TensorX's *LlamaIndex* page
- configures embeddings as `text-embedding-3-small` against
- `api.tensorx.ai` — a closed-weight OpenAI model an open-weight EU
- provider cannot be serving. It reads as a copy-paste of LlamaIndex's
- OpenAI documentation with the base URL swapped, and it is not a source;
- the API reference is, and says `/v1/embeddings` serves
- `qwen/qwen3-embedding-8b`. **Untested: no API key.** Be clear what the
- call can settle: a 400 proves only that TensorX does not proxy *that
- model name*. It says nothing about whose GPUs run `qwen3-embedding-8b`,
- which is the item above. While there, check `encoding_format: "base64"`
- (§7.2) and the accepted batch size.
-- **Is the model id stable?** §8.2 selects `moonshotai/kimi-k3` and
- `z-ai/glm-5.3-flash`, neither datestamped. **Whether TensorX holds a
- stable id to stable weights is unread.** Ask; and until answered, gate
- 24's canary is what detects the answer being no.
+- **The live calls ran on 2026-09-05, and settled less than hoped.**
+ `/v1/embeddings` serves `qwen/qwen3-embedding-8b` as documented, and the
+ model is in `GET /v1/models`. The `text-embedding-3-small` probe —
+ the one that would have shown TensorX proxying to OpenAI —
+ **returned 403.** It did not succeed, so no proxying was demonstrated.
+ **But 403 is a refusal, not a not-found:** a 404 would have said "no such
+ model", while 403 is consistent with a routable name this key is not
+ entitled to. It rules out "they proxy for anyone"; it does not rule out
+ "the name routes for some account tier". Re-probe with a different key if
+ one is ever to hand, and treat the result as narrowing rather than
+ closing — like the subprocessor item above, which the API cannot answer
+ at all.
+- **`encoding_format: "base64"` is answered and the answer is no** — see
+ §7.2. Accepted and silently discarded.
+- **Is the model id stable?** Partly answered by the catalogue. It lists
+ `deepseek/deepseek-v4-pro` *and* `deepseek/deepseek-v4-pro-0813`, which
+ demonstrates that bare names here are aliases over dated snapshots. §8.2
+ now pins the dated ids for both chat tiers. **Two things remain unread:**
+ whether a dated id is itself immutable at TensorX (ask them), and what
+ happens to the **embedding** model, which has no dated form at all — gate
+ 24's canary is the only detector for that one.
+- **`deepseek/deepseek-v4-flash-0731` is unpriced**, and §8.6's cheap-tier
+ month cannot be stated until it is. One lookup.
+- **Both chat tiers now come from one lab as well as one host.** §8.2 took
+ dated ids over family preference, correctly under its own rule, but a
+ DeepSeek withdrawal would move both tiers at once where the previous pair
+ spanned two labs. Concentration recorded, not mitigated.
- **One embedding model, and the risk is a re-host not a re-embed.** The
catalogue offers exactly one. But the weights are open, so any host
serving the same `qwen3-embedding-8b` yields compatible vectors — closely