Repository navigation
Software paper for the v3 substrate; README demotes the v1 technical note - #34
Conversation
paper.md and paper.bib are the software paper for the v3 substrate, in the Journal of Open Source Software form (Summary, Statement of need, State of the field, Software design, Research impact statement, AI usage disclosure, Acknowledgements, References; 1,720 words). It states what the package contributes and no more: a disclosure-typed retrieval contract in which the one representation a consumer can receive for each fragment is fixed before any query, forbidden representations are uninhabitable in the consumer-facing type, and the drafting of a released description is separated from the authority to release it. It names what the type does not fix (the residue a sequence of hits reveals; the strip, not the type, keeps text off the wire in deployment; the served index is trusted to descend from a validated private one) and it bounds what the deployment shows: feasibility of one architectural claim in the answerability papers, not evidence for the working paper's empirical claim. The deployment serves private material at `locator`; `semantic` is exercised by tests and demo. The AI usage disclosure reports the default branch as of this commit: 169 commits, 69 authored as Claude, every change reviewed in a pull request with an automated review, the offline tests, and the gold evaluation as the gate. Refresh those numbers before submission. README: the "formal write-up" is now the earlier technical note on the v1 engine; the paper is the write-up for v3. Both citations keep their DOIs. The paper is unsubmitted; the README says to cite the software DOI until it has a venue. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01F2ti456guy1bXVmjA3fBTV
Automated Checks (advisory, non-blocking)✅ All checks passed. Standards Compliance
SummaryThis PR appears to add the v3 software paper ( Reviewer: most of the risk is in the factual accuracy of What to pay attention to
Things I noticed
Good patterns
Suggested improvements
Questions for the author
Surmado Code Review (v1.5-mt, review #1 on Want to change your STANDARDS.md or YML? Edit it directly, or tune it with our AI agent Scout. Comment |
|
Both suggestions done, no push needed. Render: Counts: the AI-usage numbers are tied to this commit's Wording spot-check against Generated by Claude Code |
What & why
paper.mdandpaper.bibare the software paper for the v3 substrate, in the Journal of Open Source Software form (Summary, Statement of need, State of the field, Software design, Research impact statement, AI usage disclosure, Acknowledgements, References). 1,720 body words against the 1,750 cap; 22 citations, all resolving topaper.bib; 0 em-dashes, 0 contractions, 0 tell-words. The README's "formal write-up" is now the earlier technical note on the v1 engine, and the paper is named as the write-up for v3; both keep their DOIs, and the README says to cite the software DOI until the paper has a venue.What the paper claims, and no more: a disclosure-typed retrieval contract in which the one representation a consumer can receive for each fragment is fixed before any query, forbidden representations are uninhabitable in the consumer-facing type, and the drafting of a released description is separated from the authority to release it. What it declines to claim: that the type bounds what a sequence of hits reveals (the contract names that residue and assigns it to rate limiting and policy); that the type is what keeps text off the wire in deployment (the strip is); that a served gist is re-linted where the text is blank (a served index is trusted to descend from a validated private one); that the deployment serves
semantic(it serveslocator;semanticis exercised by tests and demo); and that the software is evidence for the answerability working paper's empirical claim (it shows the feasibility of one architectural claim).The AI usage disclosure reports the default branch as of this commit (169 commits, 69 authored by the coding agent, every change reviewed in a PR with the automated review, the offline tests, and the gold evaluation as the gate) and names the runtime model components. Refresh the counts before submission. The paper is not submitted: the venue is decided at the Phase 6 checkpoint (JOSS needs six months of public history with activity and demonstrated research use; the fallbacks are JORS, then SoftwareX).
Review record
The draft went through the corpus's two standing reader seats (locate-the-paper, earn-the-inference) before this commit. Their reports are banked below; they quote the pre-adjudication draft, so some quoted sentences no longer exist. The adjudication:
noneincluded"; the Impact statement says the endpoint is rate-limitedprivate + textin data, where types do not reach; "In deployment the strip keeps text off the wire; the type states and checks the contract and binds a consumer holding the private index"locator;semanticis exercised by tests and demo and reaches the deployment only as a policy change and a rebuild; the feasibility boundary sentenceDeclined: reporting canary-sweep coverage numbers (none exist yet and none will be invented); dropping the answerability lineage (it is the question's origin; it is bounded instead); renaming the package.
Seat report: locate-the-paper (on the pre-adjudication draft)
LOCATE-THE-PAPER REPORT: "Answer Engine: a disclosure-typed retrieval substrate for an author-owned archive"
Files read (nothing else): (the draft) and (the draft)
Four names: the body supplies all four, page 1 does not. Page 1 plus the last page fits three different papers.
What the whole manuscript gives for each, and where it sits:
Question (page 1, Statement of need ¶2, sentence 1). Can the amount of a retrieved archive fragment that may reach a language model be made a property of the data? That means fixed at build time, carried on the wire, and impossible to express in the type when forbidden. The alternatives are leaving the material out, filtering the output, or trusting a prompt.
Home conversation (page 2 only, State of the field ¶2–¶3). Selective disclosure, declassification and information-flow control for RAG and agent systems (SD-RAG, MNC, Rasul et al., Siddiqui et al.). The older lineage is language-based information-flow control (Goguen–Meseguer, Sabelfeld–Myers). Page 1 names a different home.
Missing case (last page and State of the field ¶1; never posed as a puzzle on page 1). An unpublished fragment should still help answer a query: search finds it, and it comes back as a location, or as a description the author has released. None of its text reaches the model. Access control that works on whole chunks can only drop it or show it.
Argument. By construction:
project()is the only path intoEvidenceHit, a discriminated union. Itslocatorvariant carries provenance only. Itssemanticvariant accepts only a brandedLintedGist, which only the lint can construct.This is the mechanism the paper claims. It is easy to identify and is the best-placed of the four: Summary sentences 3–4 put it on page 1.
Candidate papers that page 1 plus the last page currently support:
More than one candidate is the finding. Working from page 1, an editor cannot tell whether to send this to an information-flow/privacy reviewer, a RAG-tooling reviewer, or a philosophy-of-AI reader.
Payload
The compressed idea ("don't trust the model or an output filter with what must stay private; make the forbidden state impossible to express") sounds like three known things:
The obvious version is to exclude private chunks, or filter them with access-control lists. That version is also decided before the model sees anything, stored with the data, and checkable.
What the obvious version cannot show is a private item that still contributes to an answer. It is found, located and cited, and can be described in words the author released, with none of its text on the wire. That payload is in the paper:
It is not on page 1 as the reason the obvious version fails. Page 1 lists the exposure levels as features (Summary S2). It states the gap as a matter of checkability (Statement of need ¶1 S5), and exclusion already passes that test.
The sharpest instance is split across the two ends. Page 1 says MCP lets "any client model" call the search tool, and lists the operator's options, two of which (filter the output, trust a prompt) assume the operator controls the model's output and prompt. The last page reports an external model that "receives hits at the exposure the author set, with no synthesis on the server". The paper never puts these side by side.
Hierarchy: mostly a pile at one level, with a partial spine in the Statement of need.
Fork: presentation.
All four things are in the body (question in Statement of need ¶2 S1; home in State of the field ¶2; case in impact S1–S2 with State of the field ¶1; argument in Software design), but page 1 and the last page credit the question to the author's answerability program and leave the deciding case as deployment detail; if the answerability paper (candidate B) is the one intended, its home conversation is missing rather than misplaced.
Pinpoints
The two ends and the body name different homes.
answer-engineis that argument's materials: the runnable link between the design theory and a live deployment, cited as such in the working paper [@walton2026d]."The page-1 gap is one the obvious version already passes.
text; a shortsemanticdescription; alocatorthat says only where the moment is; ornone)."The MCP premise and the external-model instance are never joined.
Two different cores; the novelty is an unranked combination.
The Summary prints at one level.
private + textis not a member of the type, so it cannot be written down."p. 184or12:30–14:05), so a caller can cite and reason about what it found with no synthesis on the server."Candidate C is signalled by the name, the tags and the last page.
Page 1 promises a test; the last page reports a gate.
The scope of the phenomenon shifts.
What I am not saying
I do not demand four management-journal paragraphs or any departure from JOSS house form.
I do not restyle sentences or propose wording.
I do not diagnose AI authorship; the AI disclosure and the conflict-of-interest note are out of scope.
I do not recut or reorder sections.
I do not ask for simpler ideas, or for the answerability frame or Shoemaker to be dropped.
I do not audit the decisive inference. That means I do not judge:
project()and the type really make disclosure a property of the data, given the leakage the paper names;That belongs to another seat.
Seat report: earn-the-inference (on the pre-adjudication draft)
Contribution granted:
answer-engineis a TypeScript retrieval package that makes three moves. It resolves and stores each fragment's permitted representation (public or private; text, semantic, locator, or none) before any query. It strips private text from the served index. Hits reach a consumer only throughproject(), into a union type with no variant for private text, and model-drafted descriptions of private fragments are kept apart from the author's authority to release them.Decisive step:
The central distinction is original and well placed against SD-RAG and MNC: what may travel about a private fragment is fixed in the artifact before any query, not decided on text already in the pipeline.
The step that carries the conclusions is in Software design, "One crossing": "
project()is the only path from them toEvidenceHit, a discriminated union onexposurewhoselocatorvariant carries provenance and nothing else and whosesemanticvariant carries a brandedLintedGistthat only the lint can construct."The inference: one constructor, plus a consumer type with no slot for private text, means that what reaches a model about a private fragment is exactly what the author released.
For that to go through, three things must hold:
EvidenceHitvalues, and those values carry only their declared fields. The paper saysproject()is "the only path from them toEvidenceHit." It does not say what makesEvidenceHitthe only path to a model, whenretrieve()hands the fragments themselves "to the process that holds the index."LintedGistcarries nothing beyond what was released.The paper withdraws (ii) two sentences later: "A sequence of queries still learns something per query, which fragment answered and roughly how well." It withdraws (iii) in the next paragraph: "Close paraphrase, names, and spoilers are owned by policy, veto, and the evaluation's canaries." It asserts (i), and in the deployment what (i) is meant to secure is secured by the strip, not by the type.
So the step earns two things: in the served deployment no hit carries private text, and whatever is released about a private fragment was fixed before any query. It does not earn "no more than the author released," and it does not earn "never what was said."
Jumps, if any:
A lint, therefore no quotation.
A bound on the form of a hit, therefore a bound on what is disclosed.
locatorreleases relevance per query (the reading that lets "the author's policy" act as a bound at all), then "no more than the author released" holds. But the author has then released, query by query, a signal about what was said, and "never what was said" holds only of the text. On the other reading, the residue is more than was released.The type lacks a field, therefore nothing rides.
private + textis not a member of the type, so it cannot be written down."locatorvariant can carry properties the type does not declare, and serialization emits them. The compiler flags extra properties only on a fresh object literal, not on a spread or on assignment from a variable.private + textout of the data. What keeps text off the wire is howproject()builds each value, and in deployment the fact that the text is no longer there.A branded type, therefore served gists were linted.
LintedGistthat only the lint can construct" with "The private index … re-earns every lint at each load; the served index is the same file after a strip that blanks text …, and a load-time check verifies that the strip happened."LintedGistcertifies only that the file came through the build pipeline intact. The paper does not state that premise, and the check it describes does not test it.The Statement of need's premise is stronger than the paper's own survey.
A deployment, therefore the mechanism is shown live.
semanticin production.Minor: keyless.
text-embedding-3-largeas a runtime component.Independent variation, if relevant:
(a) The typed wire versus the stripped artifact. The paper presents these as one mechanism ("One crossing"; "Two artifacts, one validator").
(b) The typed wire with query-time resolution.
private + textis forbidden at every exposure, that strip needs no exposure decision at all. Resolve exposure at query time by a deterministic lookup, keep the sameEvidenceHit, and the guarantee is unchanged.(c) Authorization with inspection versus without ("Authorship and authorization are separate").
Space:
The proposition the paper has already paid for is that the consumer type has no private-text variant and exposure is resolved before any query. It is true by construction once the union is shown. It is stated four times: in the Summary, the Statement of need, the novelty sentence, and Software design. JOSS sections overlap by design, so the repetition is not itself the problem. The problem is that every restatement repeats the build-time-and-type point, while the premises the decisive step needs get a clause or nothing:
project()the only route to a model, and keeps undeclared properties off its values.LintedGistin the served process, where the text the lint needs has been blanked.semantic, and what the canary sweep covers and found.On the paper's own text, that answer is split:
The paper never states this answer. The Summary and Impact read as an unqualified yes, and the remainder sits in one sentence in the middle of "One crossing." That sentence is among the most careful in the paper, and it is the one the conclusions most need.
What you are not saying:
project()and the strip would have to do.Checklist
npm testpasses without an API key (the offline CI gate) — no hiddendependency on live calls (117 pass, 0 fail, 2 skipped)
npm run typecheckpassesif this touches the no-leak path (not touched)
npm run evalsubset (not touched).github/STANDARDS.md— the rubric a PR is judged by🤖 Generated with Claude Code
https://claude.ai/code/session_01F2ti456guy1bXVmjA3fBTV
Generated by Claude Code