Repository navigation
Open Questions
Unsettled items. Each one gets closed by a conformance fixture, not by a paragraph — a question you can't write a fixture for is a question you haven't thought through.
Each entry carries a proposed default, so that the runtime has something to implement on Day 3 and the discussion has something to argue with. Proposed defaults are not decisions; a decision moves to Design Decisions.
Two plugins return spans that overlap, with different replacement strings and different types. What does the host write?
Proposed default. Overlapping and adjacent spans coalesce into one interval. The replacement for a coalesced interval comes from the contributing span with the highest severity; ties break by plugin order. The type recorded in metadata is the list of all contributing types.
Closed by. Fixtures for: disjoint spans, exact overlap, partial overlap, adjacency, full containment, and equal-severity tie.
Blocks. Day 5 (verdict composition).
Plugin 1 returns REDACT. Plugin 2 runs next. Does it receive the original content or the redacted content?
This is not cosmetic: redaction changes length, so spans from plugin 2 are offsets into whichever string it was given, and the host has to map them back.
Proposed default. Every plugin in a hook sees the original content. Redactions are applied once, after all plugins in the hook have returned. Consequence: all spans share one coordinate system and no remapping is needed.
Cost of the default. A plugin cannot benefit from an earlier plugin's masking — e.g. an entropy scanner will still see the raw secret and may flag it again. Duplicate findings on the same bytes are expected and are resolved by Q1's coalescing.
Closed by. A fixture with two plugins redacting different ranges of the same chunk, asserting final content and final metadata.
Blocks. Day 5.
At ingestion, BLOCK means "not indexed." At retrieval, the content is already stored. Does BLOCK mean "drop this node from the result set" or "fail the whole query"?
Proposed default. Drop the node, and record the drop in the response metadata so the host can tell the user their results were filtered. Failing the query is a host policy decision, not a protocol one.
Closed by. A fixture asserting the result set shrinks and the metadata names the dropped node and the plugin that dropped it.
Blocks. Day 8 (LlamaIndex postprocessor).
Proposed default. 5 seconds per call, per plugin, configurable. Timeout is an error, so D3 applies: timeout → BLOCK.
Open sub-question: is the timeout per call or per batch when a host pipelines many chunks to one plugin process? Depends on Q6.
Closed by. A rsp-chaos hang mode fixture asserting the host returns BLOCK within the timeout plus a bounded margin, and the host does not leak the process.
Blocks. Day 7.
Known needs: rsp_version, plugin name, plugin version, supported hooks, determinism declaration, large-content threshold (D5).
Proposed default. Exactly those fields, nothing speculative. Unknown fields ignored per D8.
Open sub-question: does the host advertise anything the plugin can act on — for example, that it will never send on_response — or is the handshake plugin→host only?
Closed by. A fixture where a plugin declares support for only on_chunk and the host never calls it on another hook.
Blocks. Day 3.
Spawn one process per call, or keep a long-lived process and stream framed requests to it?
Spawn-per-call is simpler and matches "JSON in, JSON out, exit." It is also the reason D4 exists. Long-lived processes cut spawn cost but add framing, restart policy, per-request timeouts, and state leakage between calls — a plugin that holds state across chunks is a plugin that can be confused by chunk ordering.
Proposed default for v0.1. Spawn per call. Revisit only if profiling after caching shows spawn cost dominating. Framing is the part that would need spec text, so if this changes it is a v0.2 protocol change, not an implementation detail — noted here so the door is left open deliberately rather than by accident.
Closed by. Profiling the demo corpus on Day 8, recorded in the roadmap's post-v0.1 table.
stdout is the protocol channel. A plugin that prints a debug line corrupts it, and a plugin that floods stdout can exhaust host memory.
Proposed default. Exactly one JSON object on stdout per call. Diagnostics go to stderr, which the host captures and surfaces on error. The host caps the bytes it will read from a single call; exceeding the cap is an error, so D3 applies.
Closed by. rsp-chaos flood mode and garbage-on-stdout mode fixtures.
Blocks. Day 7.
When a chunk is redacted and then indexed, what does the stored node's metadata record? Plugin names, finding types, span count, severities — or nothing, on the grounds that metadata about secrets is itself a signal about where secrets live?
Proposed default. Record plugin name, finding types, and severity. Do not record the matched bytes, the original spans, or anything from which the redacted content could be narrowed down.
Closed by. A fixture asserting the stored metadata for a redacted chunk contains the type but not the original value or offsets.
Blocks. Day 8.
RSP v0.2 proposal — the spec is the deliverable; everything else is evidence that it works.
Status: v0.2 proposal
Target v0.1 tag: 2026-09-29