Three fixes to ADR-033:
1. ResultQuality split into RetrievalQuality (per-candidate) and
ResponseQuality (per-response at API boundary). ResponseQuality
survives serialization across JSON/gRPC/MCP. DegradationReason
provides structured, inspectable evidence for why quality dropped.
2. Brute-force safety net dual-budgeted: max 5ms wall-clock AND max
50K candidates, whichever hits first. Both configurable via
QueryOptions. Budget=0 disables fallback entirely. Prevents O(N)
DoS from adversarial queries on large hot caches.
3. Mandatory acceptance test: malicious tail manifest with valid CRC
but redirected hotset pointers must fail deterministically under
Strict policy with a logged, stable error code. Separate test for
re-signed forgery (wrong signer vs no signature distinction).
https://claude.ai/code/session_01RnwD4x5cbpB7FPvoyYQz8G
Three fixes to ADR-033:
1. ResultQuality split into RetrievalQuality (per-candidate) and
ResponseQuality (per-response at API boundary). ResponseQuality
survives serialization across JSON/gRPC/MCP. DegradationReason
provides structured, inspectable evidence for why quality dropped.
2. Brute-force safety net dual-budgeted: max 5ms wall-clock AND max
50K candidates, whichever hits first. Both configurable via
QueryOptions. Budget=0 disables fallback entirely. Prevents O(N)
DoS from adversarial queries on large hot caches.
3. Mandatory acceptance test: malicious tail manifest with valid CRC
but redirected hotset pointers must fail deterministically under
Strict policy with a logged, stable error code. Separate test for
re-signed forgery (wrong signer vs no signature distinction).
https://claude.ai/code/session_01RnwD4x5cbpB7FPvoyYQz8G
Addresses four structural weaknesses in the progressive indexing system:
1. Content-addressed centroid stability — hotset pointers verified by
SHAKE-256 content hashes, not just byte offsets. Compaction becomes
physically destructive but logically stable.
2. Adversarial distribution resilience — distance entropy detection
with adaptive n_probe widening. Silent recall collapse replaced by
detected degradation with ResultQuality signaling.
3. Honest recall framing — empirical targets scoped to distribution
classes (natural/synthetic/adversarial). Monotonic recall improvement
property proven from append-only invariant. Brute-force safety net
when candidate count is insufficient.
4. Mandatory manifest signatures — SecurityPolicy defaults to Strict.
No signature = no mount in production. Prevents segment-swap attacks
on hotset pointers. CRC32C catches corruption; ML-DSA-65 catches
adversaries.
https://claude.ai/code/session_01RnwD4x5cbpB7FPvoyYQz8G
Addresses four structural weaknesses in the progressive indexing system:
1. Content-addressed centroid stability — hotset pointers verified by
SHAKE-256 content hashes, not just byte offsets. Compaction becomes
physically destructive but logically stable.
2. Adversarial distribution resilience — distance entropy detection
with adaptive n_probe widening. Silent recall collapse replaced by
detected degradation with ResultQuality signaling.
3. Honest recall framing — empirical targets scoped to distribution
classes (natural/synthetic/adversarial). Monotonic recall improvement
property proven from append-only invariant. Brute-force safety net
when candidate count is insufficient.
4. Mandatory manifest signatures — SecurityPolicy defaults to Strict.
No signature = no mount in production. Prevents segment-swap attacks
on hotset pointers. CRC32C catches corruption; ML-DSA-65 catches
adversaries.
https://claude.ai/code/session_01RnwD4x5cbpB7FPvoyYQz8G
Add the WASM_SEG segment type and complete self-bootstrapping
architecture that allows RVF files to carry their own execution
runtime. When an RVF file embeds a WASM interpreter alongside the
microkernel, the host only needs raw execution capability — making
RVF "run anywhere compute exists."
Changes:
- rvf-types: Add SegmentType::Wasm (0x10), WasmHeader (64-byte),
WasmRole, WasmTarget enums, and feature flag constants
- rvf-runtime: Add embed_wasm(), extract_wasm(), extract_wasm_all(),
is_self_bootstrapping() methods on RvfStore, plus write_wasm_seg()
in the write path
- rvf-wasm: Add bootstrap module with resolve_bootstrap_chain() that
discovers WASM_SEGs, parses headers, and resolves the optimal
bootstrap strategy (None/HostRequired/SelfContained/TwoStage/Full)
- docs: Add spec/11-wasm-bootstrap.md with complete wire format,
bootstrap protocol, size budget analysis, and security model
The three-layer bootstrap stack:
Layer 0: Raw bytes (.rvf file)
Layer 1: Embedded WASM interpreter (~50 KB)
Layer 2: WASM microkernel (~5.5 KB)
Layer 3: RVF data segments
All 131 rvf-types tests and 72 rvf-runtime tests pass.
https://claude.ai/code/session_01RnwD4x5cbpB7FPvoyYQz8G
Add the WASM_SEG segment type and complete self-bootstrapping
architecture that allows RVF files to carry their own execution
runtime. When an RVF file embeds a WASM interpreter alongside the
microkernel, the host only needs raw execution capability — making
RVF "run anywhere compute exists."
Changes:
- rvf-types: Add SegmentType::Wasm (0x10), WasmHeader (64-byte),
WasmRole, WasmTarget enums, and feature flag constants
- rvf-runtime: Add embed_wasm(), extract_wasm(), extract_wasm_all(),
is_self_bootstrapping() methods on RvfStore, plus write_wasm_seg()
in the write path
- rvf-wasm: Add bootstrap module with resolve_bootstrap_chain() that
discovers WASM_SEGs, parses headers, and resolves the optimal
bootstrap strategy (None/HostRequired/SelfContained/TwoStage/Full)
- docs: Add spec/11-wasm-bootstrap.md with complete wire format,
bootstrap protocol, size budget analysis, and security model
The three-layer bootstrap stack:
Layer 0: Raw bytes (.rvf file)
Layer 1: Embedded WASM interpreter (~50 KB)
Layer 2: WASM microkernel (~5.5 KB)
Layer 3: RVF data segments
All 131 rvf-types tests and 72 rvf-runtime tests pass.
https://claude.ai/code/session_01RnwD4x5cbpB7FPvoyYQz8G
- Fix BackendSpec.as_ref() error: backend is a struct, not Option; access options.early_exit directly
- Fix ii_IndexAttrNumbers array indexing: use [0] instead of .offset(0) for fixed-size [i16; 32]
- Bump rvf-cli deps to match rvf-launch 0.2.0 and rvf-server 0.2.0
- Update Docker image version label to 2.0.2
Co-Authored-By: claude-flow <ruv@ruv.net>
- Fix BackendSpec.as_ref() error: backend is a struct, not Option; access options.early_exit directly
- Fix ii_IndexAttrNumbers array indexing: use [0] instead of .offset(0) for fixed-size [i16; 32]
- Bump rvf-cli deps to match rvf-launch 0.2.0 and rvf-server 0.2.0
- Update Docker image version label to 2.0.2
Co-Authored-By: claude-flow <ruv@ruv.net>
HNSW fixes:
- Extract vector dimensions from column atttypmod instead of hardcoding 128,
which caused corrupted indexes for non-128-dim embeddings (#171, #164)
- Add page boundary checks in read_vector/read_neighbors to prevent
segfaults on large tables with >100K rows (#164)
- Use BinaryHeap::into_sorted_vec() for deterministic result ordering
instead of into_iter() which yields arbitrary order (#171)
- Handle non-kNN scans (COUNT, WHERE IS NOT NULL) gracefully by returning
false from hnsw_gettuple when no ORDER BY operator is present (#152)
Agent/SPARQL fixes:
- Fix SQL type mismatch: ruvector_list_agents() and
ruvector_find_agents_by_capability() now use RETURNS TABLE(...)
matching the Rust TableIterator signatures instead of RETURNS SETOF jsonb (#167)
- Add empty query validation to ruvector_sparql() and
ruvector_sparql_json() to prevent panics on invalid input (#167)
- Change workspace panic profile from "abort" to "unwind" so pgrx can
convert Rust panics to PostgreSQL errors instead of killing the backend (#167)
Security:
- Bump lru dependency from 0.12 to 0.16 in ruvector-graph, ruvector-cli,
and ruvLLM to resolve GHSA-xpfx-fvgv-hgqp Stacked Borrows violation (#148)
Version bumps: workspace 2.0.3, ruvector-postgres 2.0.2
Co-Authored-By: claude-flow <ruv@ruv.net>
HNSW fixes:
- Extract vector dimensions from column atttypmod instead of hardcoding 128,
which caused corrupted indexes for non-128-dim embeddings (#171, #164)
- Add page boundary checks in read_vector/read_neighbors to prevent
segfaults on large tables with >100K rows (#164)
- Use BinaryHeap::into_sorted_vec() for deterministic result ordering
instead of into_iter() which yields arbitrary order (#171)
- Handle non-kNN scans (COUNT, WHERE IS NOT NULL) gracefully by returning
false from hnsw_gettuple when no ORDER BY operator is present (#152)
Agent/SPARQL fixes:
- Fix SQL type mismatch: ruvector_list_agents() and
ruvector_find_agents_by_capability() now use RETURNS TABLE(...)
matching the Rust TableIterator signatures instead of RETURNS SETOF jsonb (#167)
- Add empty query validation to ruvector_sparql() and
ruvector_sparql_json() to prevent panics on invalid input (#167)
- Change workspace panic profile from "abort" to "unwind" so pgrx can
convert Rust panics to PostgreSQL errors instead of killing the backend (#167)
Security:
- Bump lru dependency from 0.12 to 0.16 in ruvector-graph, ruvector-cli,
and ruvLLM to resolve GHSA-xpfx-fvgv-hgqp Stacked Borrows violation (#148)
Version bumps: workspace 2.0.3, ruvector-postgres 2.0.2
Co-Authored-By: claude-flow <ruv@ruv.net>
- Examples (self_booting, linux_microkernel, claude_code_appliance,
live_boot_proof) now use KernelBuilder::build() which tries Docker
first and falls back to builtin stub — real 5.2 MB bzImage embedded
- Fix Docker kernel extraction: clean up stale containers, pass dummy
entrypoint for scratch-based images
- README: add real measured boot benchmarks (257ms boot→service,
381ms boot→verify), kernel size comparison (5.1 MB general vs
3.8 MB ultrafast = 26% smaller)
- Fix claude_code_appliance idempotency (remove old file before create)
Co-Authored-By: claude-flow <ruv@ruv.net>
- Examples (self_booting, linux_microkernel, claude_code_appliance,
live_boot_proof) now use KernelBuilder::build() which tries Docker
first and falls back to builtin stub — real 5.2 MB bzImage embedded
- Fix Docker kernel extraction: clean up stale containers, pass dummy
entrypoint for scratch-based images
- README: add real measured boot benchmarks (257ms boot→service,
381ms boot→verify), kernel size comparison (5.1 MB general vs
3.8 MB ultrafast = 26% smaller)
- Fix claude_code_appliance idempotency (remove old file before create)
Co-Authored-By: claude-flow <ruv@ruv.net>
- Add live_boot_proof.rs: end-to-end Docker boot + SSH + RVF verification
- Add ULTRAFAST_BOOT_CONFIG: sub-100ms kernel config (no NUMA/cgroups/ext4/netfilter)
- Add build_fast_initramfs(): minimal init path (3 mounts + direct service start)
- Add KernelBuilder::ultrafast() with optimized cmdline for fast boot
- Update README with live boot proof instructions and ultra-fast boot docs
- 5 new tests (44 total in rvf-kernel), all passing
Co-Authored-By: claude-flow <ruv@ruv.net>
- Add live_boot_proof.rs: end-to-end Docker boot + SSH + RVF verification
- Add ULTRAFAST_BOOT_CONFIG: sub-100ms kernel config (no NUMA/cgroups/ext4/netfilter)
- Add build_fast_initramfs(): minimal init path (3 mounts + direct service start)
- Add KernelBuilder::ultrafast() with optimized cmdline for fast boot
- Update README with live boot proof instructions and ultra-fast boot docs
- 5 new tests (44 total in rvf-kernel), all passing
Co-Authored-By: claude-flow <ruv@ruv.net>