| 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 |