oficina / memoria Public

🤖 spec: one provider settled, and memoria is a search page not a chat

Paul ruled both open questions on 2026-09-04. Decision 13 loses its hedge:
exactly one provider, TensorX, swappable later by code change and a review
rather than by a setting. And the open-weight frontier tier is accepted,
with his reasoning recorded because it is load-bearing — "lightweight LLM
inference based on categorisation and memory, not complex reasoning" is
the right reading of §8.2, where three of five classes call no model and
§8.7 sends arithmetic to Sheets.

That reasoning prompts a question back, now in §13: if it is not complex
reasoning, does §8.2 need two tiers at all? Measuring the cheap tier on the
synthesis class before building the expensive one would strengthen §8.6's
cost argument, not weaken it.

§8.4 gains the ruling the spec implied everywhere and stated nowhere: this
is a search page, one GET form, one query in and one page out. No turns, no
history, no follow-up. The reason is decision 3 rather than taste — a chat
transcript is a cache of authorized passages. Turn 1's snippets sit on
screen while turn 4 is asked, their grants were evaluated minutes ago, and
a revocation in between is invisible. That is precisely what decision 3
forbids, with the twist that the passages are on the reader's screen where
no purge reaches them. Re-authorizing the whole transcript per turn is the
only correct version and it re-pays every prior turn's S2 calls against
§6.5's 800 ms deadline. The shape does not survive its own rule.

Stated because the spec used the words "chat", "conversation" and
"follow-up" exactly zero times, which is how a chat box gets added later by
someone reading "frontier model" and reaching for the familiar shape.

§8.4 is new since Fable's pass and is not covered by it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EaqFkVdF9fx2mR1s8MEUy3
Paul Campbell pushed by paul@keymail.dev c0acc9b59fd31cc067c44b61216003aa58672369 parent adf7ae8
2 files changed, +76 −34
  • QUESTIONS-FOR-PAUL.md +18 −20
  • docs/superpowers/specs/2026-09-03-memoria-design.md +58 −14
diff --git a/QUESTIONS-FOR-PAUL.md b/QUESTIONS-FOR-PAUL.md
index e545a47..496adf3 100644
--- a/QUESTIONS-FOR-PAUL.md
+++ b/QUESTIONS-FOR-PAUL.md
@@ -71,26 +71,24 @@ can't be printed on an answer, then picked `kimi-k3` and
"records how that was established" three paragraphs from §13 saying
**untested**. §1.5 has the rest.
-**One question I need you to answer, because it is two different
-products.** Decision 4 says the provider is "fixed by the team owner". If
-that means the base URL is configurable, an owner can point memoria at
-OpenRouter and the answer will still print "one named provider" — the
-exact hole this change was closing. **I have written the spec as: memoria
-supports exactly one provider, and the owner's choice is on or off.** That
-is narrower than decision 4's words and I would rather you confirmed it
-than discovered it. New decision row 13 says so and points here.
-
-**Two things you may want to push back on:**
-
-- **The frontier tier is now open-weight.** `kimi-k3` rather than Claude or
- GPT. §8.2's synthesis class is where answer quality shows, so this is a
- product call and it is yours. Fable's line on it is right and I have put
- it in §13: acceptable as a product call, unacceptable as an unmeasured
- one, and we have measured everything else in this spec.
-- **Cost did not really fall.** I first wrote that it did. 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.
+**Both questions this section asked are now answered** (2026-09-04):
+
+- **Exactly one provider, TensorX** — *"if we want to swap that later we
+ can."* Decision 13 records both halves. Swapping stays cheap in code (one
+ client, one base URL, two model ids) and goes through §Review, which is
+ where the two-parties question gets asked again.
+- **Open-weight frontier is fine** — *"this is lightweight LLM inference
+ based on categorisation and memory. It's not complex reasoning."* That is
+ the right reading of §8.2 and I have put your words in §13. It also
+ prompts a question back: **if it is not complex reasoning, does §8.2 need
+ two tiers at all?** Measuring the cheap tier on the synthesis class
+ before building the expensive one would make §8.6's cost argument
+ stronger, not weaker. Not urgent; slice 2.
+
+**One correction to what I told you earlier.** I said cost fell. It didn't,
+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
diff --git a/docs/superpowers/specs/2026-09-03-memoria-design.md b/docs/superpowers/specs/2026-09-03-memoria-design.md
index 0e66473..f6e0556 100644
--- a/docs/superpowers/specs/2026-09-03-memoria-design.md
+++ b/docs/superpowers/specs/2026-09-03-memoria-design.md
@@ -68,7 +68,7 @@ embedding is a plaintext cell in a costume — §3.1.
| 10 | **memoria never does arithmetic. A number comes from a cell, or from Sheets' engine via S6.** S6 takes an enumerated function over cell refs — never expression text — so memoria is never a formula author. | memoria computing and showing its working (a second calculator, arrived at one `mean` at a time); writing a formula into a scratch sheet (a write, forbidden by §6.4) | Paul asked for numeric questions, 2026-09-03; shape ruled by Fable and GPT Sol independently, converging |
| 11 | **Admission is derived from the siblings, not from a members table memoria maintains.** A person may enter memoria if at least one sibling says they are a member of this team. | Draft 2's own members table, which left a person removed everywhere else still able to read memoria-owned content | after the draft-2 review, 2026-09-03 |
| 12 | **Name: `memoria`.** House convention is plain Spanish office nouns. A *memoria* is both a memory and, in Spanish office usage, a written record. | `archivo`; `cerebro`; `base`; anything English | Paul, 2026-09-03 |
-| 13 | **The provider is TensorX, and memoria supports exactly one.** A team owner's choice is on or off, not which — a configurable base URL would let an owner reinstate a proxy while the answer still printed "one named provider". Chosen for EU jurisdiction and open weights, criteria decision 4 did not state, at a known cost in id-pinning and frontier quality (§8.3). | OpenRouter (a proxy: two parties see content); OpenAI direct (better id-pinning, worse jurisdiction and cost) | Paul, 2026-09-04. **The "supports exactly one" half is the spec's reading of decision 4's "fixed by the team owner" and needs Paul's confirmation** — §13 |
+| 13 | **The provider is TensorX, and memoria supports exactly one.** A team owner's choice is on or off, not which — a configurable base URL would let an owner reinstate a proxy while the answer still printed "one named provider". Chosen for EU jurisdiction and open weights, criteria decision 4 did not state, at a known cost in id-pinning and frontier quality (§8.3). | OpenRouter (a proxy: two parties see content); OpenAI direct (better id-pinning, worse jurisdiction and cost) | Paul, 2026-09-04, both halves — *"we go with exactly one for now: TensorX. If we want to swap that later we can."* Swapping is a code change and a review, not a setting |
### 1.1 The proposal review, and what it killed
@@ -1184,14 +1184,15 @@ Paris, with **advertised** zero retention. Advertised: no account exists,
no terms have been read, and §3.6 tells the reader we cannot verify a
retention promise. That sentence keeps saying so.
-**The provider is not team-configurable.** Supporting one is a code change,
-and a team owner's choice is on or off. Decision 4 says "fixed by the team
-owner", which reads as picking one, and these are different products: a
-configurable base URL on an OpenAI-compatible client lets an owner point
-memoria at a proxy and still have the answer print "one named provider",
-which is the failure this whole section is about. The spec takes the
-narrower reading. **It is Paul's to confirm and decision 4's wording needs
-it** — QUESTIONS #1, §13.
+**The provider is not team-configurable**, ruled by Paul on 2026-09-04.
+Supporting one is a code change; a team owner's choice is on or off. This
+is narrower than decision 4's "fixed by the team owner", and deliberately:
+a configurable base URL on an OpenAI-compatible client would let an owner
+point memoria at a proxy while the answer still printed "one named
+provider", which is the failure this whole section is about. Decision 13
+records it. Swapping providers later stays cheap — one client, one base
+URL, two model ids — but it goes through code and §Review, where the
+two-parties question gets asked again.
**Why this one, honestly stated.** Not because it beats OpenRouter and
OpenAI on decision 4's own words — on one half of them it loses:
@@ -1260,6 +1261,41 @@ list; every sentence carries a passage id from it, and a sentence citing
nothing is dropped before render. **If every sentence is dropped, say
so** — an empty paragraph is indistinguishable from AI being off.
+**This is a search page, not a chat.** The spec implied it everywhere and
+stated it nowhere, which is how a chat box gets added by someone reading
+§8.2's "frontier model" and reaching for the familiar shape. Written down:
+one GET form, `?q=`, one query in and one page out. No turns, no history,
+no thread, no follow-up that refers to "it". §8.1's floor is already this
+page, and it is what slice 0 shipped.
+
+**The reason is decision 3, not taste.** Authorization is asked of the
+owning sibling per person *per query*, live, never cached, because caching
+authorization is what makes a stale answer a leak. **A chat transcript is a
+cache of authorized passages.** Turn 1's snippets sit on screen while turn
+4 is asked; their grants were evaluated minutes ago; a revocation in
+between is invisible, and the page is now doing exactly what decision 3
+forbids — with the added twist that the passages are on the reader's screen
+rather than in a database, so no purge reaches them. Re-authorizing the
+whole transcript on every turn is the only correct version, and it makes
+each turn cost the previous turns' S2 calls again, against §6.5's 800 ms
+deadline. The shape does not survive its own rule.
+
+Two consequences worth stating, since both are places a chat UI would have
+been the easy answer:
+
+- **A refined search is a new query, not a follow-up.** The affordance is
+ editing `?q=` and asking again. Nothing carries over, and nothing needs
+ to, because retrieval is free (§8.2).
+- **The 🤖 paragraph is disposable.** It is one paragraph above one list,
+ regenerated per query and stored nowhere. Nothing accumulates that §5.2's
+ provenance rule would then have to expire, and no runtime record of
+ prompts exists to fall under §8.3's ledger rule.
+
+Hybrid, then, in the only sense that matters: **the search page is the
+product and the answer is a garnish on it** (decision 5). Not a chat with
+citations bolted on, which is the same components in the order that breaks
+the authorization rule.
+
### 8.5 Prompt injection
- **No tools.** memoria retrieves and answers. It never writes to a
@@ -1683,11 +1719,19 @@ rows.
- **§7.2's 24M tokens is now an estimate under a different tokeniser.** It
came from an OpenAI-style ~1.34 tokens/word; billing is Qwen's. Probably
close, unverified, and §8.6 inherits it.
-- **Answer quality for the synthesis class is unmeasured, for any model.**
- §8.2's frontier tier moved from "Claude or GPT" to an open-weight model
- with no measurement either side of the change. QUESTIONS #1 puts the
- product call to Paul, correctly; the measurement is still owed. The spec
- measures everything else.
+- **Answer quality for the synthesis class is unmeasured, and Paul has
+ ruled it need not block.** *"Frontier open weight is fine. This is
+ lightweight LLM inference based on categorisation and memory. It's not
+ complex reasoning."* (2026-09-04.) That is the right reading of §8.2: the
+ three model-free classes carry the navigational, numeric and
+ who-knows-about-X work, §8.7 sends arithmetic to Sheets, and what is left
+ for a model is extractive summary over passages that have already been
+ retrieved, filtered and authorized. **It also raises a question this spec
+ should answer rather than inherit:** if the work is not complex
+ reasoning, does §8.2 need two tiers at all, or is the frontier tier a
+ habit? Measure the cheap tier on the synthesis class before building the
+ expensive one — the router's cost argument (§8.6) gets stronger, not
+ weaker, if the answer is one tier.
- **Docs §11.2's qualification** must be recorded in the Docs repo by
`docs-e6`, or the two specs contradict.
- **A `carlos/platform` discussion** noting the app boundary is the