Skip to content

bug: import --source and search --source silently ignore source routing #1167

@tyad67-netizen

Description

@tyad67-netizen

Bug Description

In v0.31.3, source routing is silently ignored in two places:

  1. gbrain import does not honor documented source-routing signals for attribution. In my repro, imported pages/chunks landed under default even when the caller intended a named source.
  2. gbrain search --source <id> behaves like a no-op filter. Searching known-empty sources returns the same results as searching the populated source.

This makes multi-source attribution unsafe because the CLI exits successfully while writing/searching the wrong source partition.

Steps to Reproduce

rm -rf ~/.gbrain
gbrain init --pglite

gbrain sources add hermesclaude-main --path /Users/tm_admin/Documents/HermesClaude --federated
gbrain sources add hermesintake --path /Users/tm_admin/Documents/HermesIntake --no-federated
gbrain sources add openclaw-wiki --path /Users/tm_admin/.openclaw/wiki/main --no-federated

# Attempt import into registered source
gbrain import /Users/tm_admin/Documents/HermesClaude --source hermesclaude-main --no-embed

gbrain sources list

gbrain search HermesClaude --source hermesclaude-main --limit 5
gbrain search HermesClaude --source hermesintake --limit 5
gbrain search HermesClaude --source openclaw-wiki --limit 5
gbrain search HermesClaude --source default --limit 5

Expected Behavior

  • import --source hermesclaude-main writes pages/chunks under pages.source_id = 'hermesclaude-main'.
  • default remains at 0 pages when nothing is imported to default.
  • search --source hermesintake / --source openclaw-wiki returns no hits for HermesClaude-only content.
  • search --source hermesclaude-main returns the imported hits.

Actual Behavior Observed on v0.31.3

  • Import completed with rc=0 but source attribution went to default.
  • search --source <id> returned the same top results for populated and known-empty sources.

Local Fix Verified

I patched locally and verified the acceptance case now passes:

default               federated          0 pages
hermes-local-wiki     isolated           0 pages
hermesclaude-main     federated        567 pages
hermesintake          isolated           0 pages
openclaw-wiki         isolated           0 pages

Search query: HermesClaude

  • --source hermesclaude-main: returns HermesClaude hits
  • --source hermesintake: No results
  • --source openclaw-wiki: No results
  • --source default: No results
  • --source __all__: returns HermesClaude hits

Focused tests passed:

bun run typecheck
bun test test/source-id-tx-regression.test.ts test/build-llms.test.ts
27 pass / 0 fail

Patch Shape

Local patch does the following:

  • src/commands/import.ts

    • Adds CLI --source <id> support.
    • Uses existing resolveSourceId(engine, explicitSource, process.cwd()).
    • Preserves programmatic opts.sourceId compatibility.
    • Guards missing --source values.
    • Prevents the source value from being mistaken for the import directory.
  • src/core/operations.ts

    • Adds source param to the search operation.
    • Threads it into engine.searchKeyword(..., { sourceId }).
  • src/core/pglite-engine.ts and src/core/postgres-engine.ts

    • Apply p.source_id = $N filter in searchKeyword when opts.sourceId is set.
    • Treat __all__ as explicit unfiltered search.
  • Adds regression coverage in test/source-id-tx-regression.test.ts.

Environment

  • gbrain version: 0.31.3
  • DB: PGLite
  • OS: macOS
  • Local patch commit: fc143bb fix source routing for import and search

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions