Skip to content

store: a workspace window keeps its (workspace_id, id) index whatever the planner statistics say - #195

Merged
robertohluna merged 1 commit into
mainfrom
fix/pin-workspace-window-plans
Oct 30, 2026
Merged

robertohluna merged 1 commit into
mainfrom
fix/pin-workspace-window-plans

Conversation

@robertohluna

Copy link
Copy Markdown
Contributor

Since #182 the Store refreshes planner statistics when it opens. A test restarts the Store mid-suite, the shared test store then gets statistics, and with them SQLite planned the chunk backfill window as a range over the chunks primary key instead of idx_chunks_workspace_id, so chunk_backfill_test's plan check failed depending on test order (main run 41049651178). Live stores now have statistics too, so the same flip could make a backfill window read across every workspace.

  • ChunkBackfill window statements and Graph.Backfill pages of one workspace name their index with INDEXED BY, which fixes the plan; a tenant or whole-store graph scan still plans freely.
  • Store.Dialect drops INDEXED BY / NOT INDEXED for PostgreSQL (no index hints there), with a test, so the statements stay supported on the PostgreSQL store.
  • The census lines of the four plan checks carry the hint.

… the planner statistics say

Since #182 the Store refreshes planner statistics when it opens. A test
crashes and restarts the Store mid-suite, the shared test store then gets
statistics, and with them SQLite planned the chunk backfill window as a range
over the chunks primary key instead of the (workspace_id, id) index, so
chunk_backfill_test's plan check failed depending on test order (main run
41049651178). Live stores have statistics too now, so the same flip could
make a backfill window read across every workspace.

- ChunkBackfill's window statements and Graph.Backfill's pages of one
  workspace name their index with INDEXED BY, which fixes the plan; a tenant
  or whole-store graph scan still plans freely.
- Store.Dialect drops INDEXED BY and NOT INDEXED for PostgreSQL, which has
  no index hints, so the same statements stay supported there.
- The census lines of the four plan checks carry the hint.
@robertohluna
robertohluna merged commit 6480c29 into main Oct 30, 2026
13 of 17 checks passed
@robertohluna
robertohluna deleted the fix/pin-workspace-window-plans branch October 30, 2026 12:24
robertohluna added a commit that referenced this pull request Nov 1, 2026
## Release 0.3.11

Moves the version from 0.3.10 to 0.3.11 in the 16 files the 0.3.10 bump
(#178) touched: application, CLI, MCP, client installer, contract, docs
and the tests that pin it.
Contract schema `1`, API `v1` and expected migration `85` are unchanged:
nothing since 0.3.10 adds a migration.
Two lines in `docs/guides/versioning-and-releases.md` that record when a
feature arrived ("From 0.3.10 on") stay as they are.

## In 0.3.11 (since v0.3.10)

- bundles: a rolled-back batch leaves no line in the written log, and
the boot take-back runs beside boot (#177)
- sync: a replica removes what it made from a source package only once
the package row is gone, as the origin does (#173)
- workspace: the crawl skips files in no workspace, and a takeover
relabels default rows only, atomically with the row (#179)
- steward: a tenant takes back the default rows its source packages
vouch for under a bare workspace id (#171)
- ci: run the Linux merge-gating jobs on MIOSA self-hosted runners
(#180)
- api: ingest takes occurred_at, source_id and write_files (#181)
- search: the full-text match drives the join, and the store keeps its
planner statistics fresh (#182)
- graph: a backfill job done in slices records the whole run when its
last slice finishes (#183)
- deps: plug_crypto 2.2.1, which keeps the secret key base out of stack
traces (CVE-2026-105963) (#184)
- intake: a cross-reference copy is dated when its signal happened, not
when its file was written (#185)
- docs: the README leads with what the engine does, measured results,
what sets it apart, how it works, and a five-minute start (#186)
- wiki: a page without citations goes stale by age, and RAG skips stale
or unsourced pages (#187)
- api: bound search text, collapse duplicate hits, honor limit on graph
and exports, scope stats (#189)
- wiki: re-curate a stale page only when the curator has material (#190)
- health: report a broken embedder as degraded, count rag, connector and
intake metrics, keep the git sha current (#188)
- tests: retry a bundle job cancel sent from a telemetry handler until
the store answers (#191)
- api: an offset without a limit on the graph windows its edges like a
limit does (#192)
- tests: judge the gate cache only on a run where no other write moved
the stamp (#193)
- bundle jobs: answer a Store that did not answer as busy, not as a job
that is not there (#194)
- store: a workspace window keeps its (workspace_id, id) index whatever
the planner statistics say (#195)
- test: three tests no longer depend on timing or on what else the store
is doing (#196)
- memory: an episode's provenance is projected as evidence links, so
assemble no longer fails (#197)
- embed: an input Ollama refuses as longer than the model's window is
sent again at half its length (#198)
- embed: the two request clauses sit together again, so a strict compile
passes (#200)
- memory: a recall over a stale associative projection queues its
rebuild (#199)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant