oficina / memoria Public

docs: what is Paul's to decide, and what the night answered

Q2 done (docs discussion 33) and Q3 answered by synthesising Fable and
GPT Sol, which converged on S6. Four things left, the real one being
whether routine partial withholding is acceptable now that every search
asks the siblings live.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SiWVaR69Vb2Lzc9wgfit1v
Paul Campbell pushed by paul@keymail.dev 345f908e055b24c4762f54290c089d86b8942b76 parent b256d88
1 file changed, +102 −37
  • QUESTIONS-FOR-PAUL.md +102 −37
diff --git a/QUESTIONS-FOR-PAUL.md b/QUESTIONS-FOR-PAUL.md
index 041890e..a374fd5 100644
--- a/QUESTIONS-FOR-PAUL.md
+++ b/QUESTIONS-FOR-PAUL.md
@@ -1,54 +1,119 @@
# Questions for Paul — memoria
-Accumulated overnight 2026-09-03/04. Everything here is a decision I
-judged yours rather than a model's. Design guidance I *did* delegate went
-to Fable or gpt-5.6-sol and is recorded in the spec's §1 table.
+Overnight 2026-09-03/04. Design guidance I delegated went to Fable and
+gpt-5.6-sol; what is left here is what I judged yours.
-Nothing below blocks slice 0.
+**Nothing below blocks trying it.** `cd /home/paulca/memoriadrive && ./run.sh`,
+then http://127.0.0.1:8823 — see the README.
---
-## 1. OpenRouter means two parties see content, not one
+## Answered last night, recorded, no action needed
-Decision 4 says "one named provider… named on every answer". But if
-embeddings and chat both route through OpenRouter, **the proxy and the
-upstream model provider both see the passages** — so "one named provider"
-names one of two, and §3.6's README copy is inaccurate in the same way
-draft 1's was.
+**Q2 — the Docs §11.2 egress amendment.** Done: `oficina/docs`
+discussion 33, posted as `claude~paul@keymail.dev`. It asks Docs to record
+the *boundary* of its rejection rather than reverse it, and tells them
+plainly that memoria's egress is the same kind and comparable volume to
+what they rejected, with only three things differing.
-Three ways out:
+**Q3 — numeric questions.** Both models asked, answers synthesised into
+§8.7. They converged, so I did not have to arbitrate:
-- **Name both** in the answer and the README ("via OpenRouter to
- Anthropic"). Honest, slightly ugly, no capability lost.
-- **Go direct to one provider**, no proxy. Cleanest claim, loses
- per-question routing across families.
-- **Drop routing**, one model for everything. Cheapest to explain, and
- §8.2 shows three of five question classes need no model anyway.
+- A new **S6** call. Sheets computes and formats; memoria never does
+ arithmetic. S6 takes an *enumerated function* (`SUM`, `AVERAGE`, `MIN`,
+ `MAX`, `COUNT`) over cell refs — **never expression text** — so memoria
+ cannot grow into a formula author.
+- Spreadsheet chunking: one **structure chunk** per tab carrying the
+ vocabulary, plus **region row chunks** rendered as facts
+ (*"FY2024 › P&L › Revenue: Jun 2024 = €1,350,000"*). That is what makes
+ `revenue`, `June` and `2024` findable for a cell containing `1350000`.
+- Retrieval resolves **named slots** and refuses to show a number unless
+ every slot has exactly one authorized operand. Two candidates is
+ ambiguity, never extra evidence.
+- Both independently forbade the same thing: a **RAG calculator** that
+ lets a model average numeric strings it retrieved. It stacks incomplete
+ recall, wrong operand selection and arithmetic outside Sheets — and
+ cites correctly while being wrong.
-**My recommendation: go direct.** §8.2's router only needs *two* tiers
-(cheap, frontier), both of which one provider supplies, so the proxy buys
-little and costs the claim.
+Your example works under this design and states its basis: *"Average of
+June 2024, June 2025, June 2026."* If a year is missing it shows the slot
+table and no number.
-## 2. Docs §11.2 has to be amended by someone who is not me
+---
+
+## 1. Your "C" on the OpenRouter question did not map
+
+I offered three options — name both parties, go direct, or drop routing —
+as bullets, not letters, so "C" is ambiguous. You also said "fine as long
+as openrouter seems like the right choice", which reads like keeping it.
+
+**What I did:** nothing irreversible. §8.3 and §3.6 now state the honest
+version either way, and §13 records that if embeddings and chat both route
+through OpenRouter then **two parties see content** — the proxy and the
+upstream provider — so decision 4's "one named provider" names one of two.
+
+**What I still recommend:** go direct to one provider. §8.2's router needs
+only two tiers, cheap and frontier, and one provider supplies both, so the
+proxy buys little and costs the claim.
+
+This does not bite until slice 2.
+
+## 2. Is routine partial withholding acceptable? (§6.5)
+
+The genuinely new product question, and the one I would most like your
+view on.
+
+Every search now asks each contributing sibling "may this person see
+these, at this revision" — live, no caching, because caching authorization
+is what makes a stale answer a leak. Consequence: **a slow or hibernating
+sibling means the page renders without its passages and says so** —
+*"Sheets did not answer; 7 results withheld."*
+
+That is correct. It may also be constant, because siblings hibernate and a
+cold wake is slower than any sane deadline. I have set 800 ms and pre-warm
+on memoria's own wake, but if Sheets is habitually cold then the primary
+search path habitually withholds, and a notice a reader sees every time is
+a notice they stop reading.
+
+There is no design that fixes this while failing closed. The spec's stated
+position is that this is a **suite health problem memoria surfaces, not a
+memoria problem to route around** — so the answer would be to fix or drop
+the source, never to cache its authorization. Tell me if you would rather
+trade differently, because the alternative is a short-TTL cache and that
+is a stated leak window rather than a correctness fix.
+
+## 3. Deploy it, or leave it local?
+
+It has never run anywhere but localhost. Deploying creates a new app on
+your `bds` CARLOS account, which is outward-facing provisioning I did not
+want to do unattended. One command when you want it, in the README.
+
+Local is genuinely usable — keymail accepts the loopback `client_id`, which
+I verified.
-§8.3 qualifies Docs §11.2 ("ships customer documents to a third party,
-contradicting §2"). Docs is `docs-e6`'s repo. Until they record the
-qualification, the two specs contradict each other, and AGENTS.md says a
-contradiction gets fixed in the same commit — which I cannot do across
-repos.
+## 4. Your rastrillo CLI is about six releases stale, and it affects every app
-Do you want me to open a discussion on `oficina/docs` proposing the
-amendment, or will you raise it with that session directly?
+`rastrillo` on PATH predates v0.22.0: it has no `doctor`, and
+`rastrillo new` scaffolds a **v0.17.0** pin. Two things follow, and the
+second is the one that matters beyond memoria:
-## 3. Chunking a spreadsheet is unsolved and I did not solve it
+- I bumped memoria to v0.23.0 by hand and wrote `tools/vendorassets` to
+ re-copy the three vendored files from the linked library, because there
+ is no `doctor --fix` to do it.
+- **The scaffold's `layout.html` links `tokens.css` but not
+ `theme.css`**, and `tokens.css` defines eleven tokens, none of them
+ colours. Any app scaffolded with this CLI renders with every colour
+ resolving to `initial`, which invalidates whole shorthand declarations —
+ rules vanish rather than the page going grey. That is the exact failure
+ your own memory note describes for the page-header rule.
-§13 admits it. A 400-token chunk of a grid may be meaningless, and
-§8.2's numeric route depends on chunking being sensible. Options are a
-per-tab chunk, a per-region chunk (header row plus contiguous block), or
-"Sheets contributes titles and structure only, never cell bodies".
+`go install github.com/carlosframework/rastrillo/cmd/rastrillo@v0.23.0`
+would fix it, but it is a shared binary other sessions are using, so I
+left it alone.
-This is a product judgement about whether memoria should answer questions
-about numbers at all, given it must never recompute them. I have not
-guessed. **It does not block slices 0–2**, since Docs has bodies and
-prose chunks fine.
+## 5. Not a question, but you should know
+`gpt-5.6-sol` via Codex **reported its own model id as `gpt-5`** when
+asked. Codex's own banner says `gpt-5.6-sol`. I recorded the discrepancy
+in the spec's review table rather than picking one, since §Review requires
+attributing a review to a model and the two sources disagree.