feat(brain): re-embed on file edit (Sync should respect mtime) #23
Closed
opened 2026-05-19 11:11:25 +00:00 by mathias
·
1 comment
No Branch/Tag Specified
main
fix/pipeline-writes-158
fix/edit-path-io-192
fix/create-regular-188
fix/guard-special-179
fix/linkcheck-keeps-write-178
fix/write-dir-redirect-173
fix/tunnel-detect-174
fix/pipeline-root-157
w3/154-mcp-auth-wiring
fix/tunnel-traversal
test/in-brain-targets-171
fix/brain-scan-root-157
fix/graph-wiki-root-157
fix/vectorstore-root-157
fix/notes-root-157
fix/search-root-157
fix/brainwide-root-157
fix/raw-symlinks-153
feat/symlink-tripwire-157
fix/rest-auth-149
fix/123-brain-edit-envelope-check
feat/106-page-aware-extraction
fix/105-source-drift-on-main
fix/104-surface-merge-conflicts-on-main
agent/b1-compile-on-ingest
agent/104-surface-merge-conflicts
agent/105-source-drift
agent/107-loud-unconfigured-alerting
feat/brain-read-edit
fix/capture-i1-refusal-names-target
renovate/configure
feat/consolidate-single-harness
icebox/cmd-routing
feat/brain-pending-promote
fix/close-session-classification-refresh
fix/capture-summarywriter
v0.24.0
v0.23.1
v0.23.0
v0.22.0
v0.21.1
v0.21.0
v0.20.1
v0.20.0
v0.19.1
v0.19.0
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.0
v0.16.1
v0.16.0
v0.15.0
v0.14.0
v0.13.2
v0.13.1
v0.13.0
v0.12.1
v0.12.0
v0.11.2
icebox/cmd-routing-2026-07-01
v0.11.1
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.0
v0.1.0
Labels
Clear labels
agent/ready
blocked/client
blocked/supplier
blocked/upstream
risk/high
risk/low
risk/medium
size/l
size/m
size/s
size/xs
status:dispatch
status:dispatched
status:review
status:reviewing
type/chore
type/decision
type/docs
type/feat
type/fix
type/ops
type/research
type/test
Meets the agent-ready contract; authorizes unattended execution
Waiting on the client
Waiting on a supplier
Waiting on an upstream project or vendor
Irreversible, security-relevant, or control plane
Reversible, local, test-covered
Touches shared state, deploys or data
Too big - split it
Under two days
Under half a day
Under an hour
Maintenance, no behaviour change
Human decision required; never agent/ready
Documentation only
New capability
Corrects broken behaviour
Infrastructure, deploy, runtime
Investigate; output is a finding, not code
Test coverage only
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mathias/hyperguild#23
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Context
vectorstore.Synccurrently only embeds files it has never seen — once a path appears inbrain_embeddings, edits to the underlying.mdare invisible to the vector store. The code has a TODO marker for this:Result: any note revised after its first sync silently drifts from its embedding.
Proposed change
Storeto exposeKnownPathsWithMtime() map[string]time.Time— returns each path'supdated_atfrombrain_embeddings. (OrKnownPathsreturns a richer struct; small API choice.)Sync, compare each file'smtimeagainst the store'supdated_at. If newer → re-embed + upsert.Acceptance criteria
Syncre-embeds files whosemtime > updated_atOut of scope
Content-hash invalidation (mtime is enough for the brain's edit pattern — Syncthing preserves it).
Shipped in commit
8157397.Approach
Store interface evolved from
KnownPaths() map[string]struct{}→KnownPathsWithTime() map[string]time.Time. PGStore:SELECT path, updated_at FROM brain_embeddings. Sync groups chunks by parent and tracks the earliest updated_at per parent — if a file's mtime is after that, at least one chunk is stale, so the file is re-embedded.Re-embed path deletes every old chunk for the parent first, then re-chunks + re-embeds + re-upserts. Handles shrunk files cleanly (no orphan
#NNNNrows at higher indexes).Tests
Existing 15 tests updated for the new stub signature (
stubStore.knownis nowmap[string]time.Time; zero values default to a far-future sentinel so "skip if already known" tests keep passing without per-test setup).Backward compatibility
brain_embeddingsrows pre-dating this change carry validupdated_atvalues — the column was always populated viaDEFAULT now()+ON CONFLICT ... updated_at = now()on every upsert. No schema migration. Live pod will start re-embedding any file whose source has been edited since its chunks were originally written.Acceptance
mtime > updated_atSELECT path, updated_atper cycle replaces singleSELECT path)Closes.