Changes

1,376 commits from through .
SaaS: 764; Desktop: 299; Node: 244; Proto: 69
This generated snapshot covers saas, desktop, node, and proto.

— 4 commits

  • SaaS 3d6df7e saas: cache node workspace activity
  • Desktop 0680322 ui: sort workspaces by activity
  • Node 8315c31 node: maintain workspace activity timestamps
  • Proto 350e6a4 proto: add workspace activity timestamp

— 6 commits

  • Desktop 4a0dc1e fix: keep session answers in view
  • Desktop 686e2ac ui: label observation directives
  • SaaS a8385ea extraction: support visual PDF data
  • Desktop cc905c3 ui: add on-demand extracted data viewer
  • Node 3c1fd99 node: expose file event ID
  • Proto 5fde3c9 proto: expose file event ID

— 12 commits

  • Desktop 78d95e9 fix: refine session export print flow
  • Desktop d06e3b1 fix: preserve decomposed turns in export
  • SaaS 9264165 extraction: remove macOS-specific examples
  • Desktop d2beac0 ui: remove macOS node option
  • Proto 5f6bc85 proto: carry first-turn session name
  • SaaS 7850e54 feat: add first-turn workspace naming
  • Node 09de2a0 feat: add first-turn workspace naming
  • Desktop 52fad65 docs: update node commands
  • Desktop 505a82f feat: show account plan details
  • SaaS 33e8052 feat: expose account plan details
  • Desktop 5af3507 fix: scroll sessions to latest turn
  • Desktop 78f3d41 ui: add session text context menu

— 3 commits

  • Desktop 2902ed0 ui: add WinBox window controls
  • SaaS de78c66 docs: keep default responses concise
  • Desktop 2bb4fd2 fix: initialize sessions and avoid duplicate workspace fetch

— 18 commits

  • Desktop 54867ae fix: display workspace name citation label
  • Node 1398750 fix: label workspace name citations
  • Desktop 627ac43 ui: color workspace settings headings by type
  • Desktop e2b0c69 desktop: restore window and session state
  • SaaS b9576a2 saas: route session view state
  • Node 2339676 node: persist session view state
  • Proto e56712c proto: persist session view state
  • SaaS 189f1be api: expose profile fact sources
  • Desktop 1411eca fix: separate profile and learned facts
  • Node 73c4850 fix: preserve learned profile facts
  • Proto 7902588 proto: add profile fact source metadata
  • Desktop 45fa0d3 ui: update settings and workspace resource panels
  • Proto 7369296 proto: align answerer observation records
  • SaaS 8fbdf42 refactor: align observation inspector role
  • Node 96485e2 refactor: align observation inspector relay
  • SaaS 5fb8c4c Restore comprehensive opencode configuration with project context and working guidance
  • SaaS e4907ee Fix opencode.json configuration with proper schema
  • SaaS 94ecdaf Add project overview and opencode configuration

— 1 commit

  • SaaS cf6ee6e docs: handover H200 — feed failure diagnosis and process hardening

— 35 commits

  • SaaS e80998b docs: handover H199 — disable feed workspace creation, C481 parked
  • Desktop c03fdc9 fix: disable Feed option in new workspace modal
  • Desktop 733e9bd fix: allow external images in CSP and throttle feed API calls
  • Desktop e7af151 fix: bump service worker cache key to force new bundle install
  • Desktop 009f0d7 fix: feed card shows excerpt, image fallback, dedup discuss sessions
  • Node 2eb0cf8 fix: strip markdown fences from feed story generation response
  • Node 96df6f8 fix: stronger C481 prompt requiring 2-3 paragraph excerpts
  • Desktop bc5f9e0 fix: feed card click, favicon fallback, back-to-feed button
  • Desktop 32a9f90 fix: feed index is a dedicated news portal page
  • Desktop 0187b78 feat: C481 story card rendering + source attribution + discuss seed
  • SaaS d2cc70f feat: C481 pass source_urls through feed index JSON handler
  • Node 0d9b6ef feat: C481 LLM story generation in feed agent
  • Node 54477a7 gen: regenerate for C481 FeedItem.source_urls
  • SaaS 7c2b224 gen: regenerate for C481 FeedItem.source_urls
  • Proto 357a8f2 proto: C481 add source_urls to FeedItem
  • SaaS cc72774 docs: H198 feed fixes + C481 contract; archive H197
  • Desktop 890b1a6 fix: deploy script copies sw.js (C481)
  • Node bed878f feat: LLM curation pass in feed agent — relevance check + cross-domain story grouping via varen/classifier
  • Desktop 37a332c fix: remove vestigial content_type filter — was dropping all feed items
  • Desktop 37bb947 fix: accept web content_type in feed index, bump sw cache to dated version
  • Desktop 4c6e162 fix: feed workspace always opens on index page — no session auto-loaded ever, conversations only via discuss button
  • Desktop 6348e38 fix: feed blue dot and index view — show unseen for feed ws, defer clear until feed loads, skip auto-resume for feed ws
  • SaaS 3f76712 docs: archive H196, promote H197 (C480 phase 2 executed)
  • SaaS 1a6dd39 saas: C480 phase 2 — observer, dynamic cache, onConnect sync, universal injection union
  • Node 3018851 node: C480 observation relay handlers + payload scope/model_id/directive
  • SaaS b499d8a saas: regen proto for C480 observation RPCs
  • Node eb964db node: regen proto for C480 observation RPCs
  • Proto e0e6b60 proto: C480 add ListObservationPrompts + RecordObservations RPCs and ObservationEntry message
  • SaaS 4576774 docs: archive H195, promote H196 (C480 phase 1 executed)
  • SaaS 1de6549 feat: C480 phase 1 — model catalog + universal observation guidance injection
  • SaaS 4483290 docs: archive H194, promote H195 (C480 conversation observations design)
  • SaaS a70836a docs: archive H193, promote H194 to current handover, update pointer
  • Desktop 1cf6be8 feat: C479 desktop feed index rendering + retention preset
  • Node ce7c125 feat: C479 node-side GetFeedIndex gRPC handler
  • SaaS f61d038 feat: C479 feed index proxy + reload-check auto-detect outdated nodes

— 8 commits

  • SaaS a70cfbd gen: C479 regenerated services.pb.go — GetFeedIndex RPC
  • Node 127410d gen: C479 regenerated services.pb.go — GetFeedIndex RPC
  • Proto 1418a58 proto: C479 add GetFeedIndex RPC + FeedHeading message
  • Node 0839734 feed: C479 align search client with SaaS /api/search response shape
  • Node 3ce8ab1 feed: C479 node-owned ambient index — real search, grouping, retention
  • SaaS 831ac64 gen: C479 regenerated workspace.pb.go — feed config fields
  • Proto 8bf0048 proto: C479 feed config — retain_items + expunge_cycles, drop vestigial fields
  • SaaS a446d23 docs: H193 — feed workspace broken, needs redesign; archive H192

— 16 commits

  • Desktop 90122f2 refactor: feed workspaces use WorkspaceWindow, card grid replaces empty thread; FeedWindow deleted
  • Desktop d14b49f fix: add current date to feed query for recency, remove misleading discovered_at timestamp
  • Desktop ff0a790 fix: load persisted web_results on mount, pass SessionID for feed inference
  • SaaS 71c5bfe fix: force Nature=web for feed, feed-specific prompt, raised search caps
  • Desktop 00fb9ea fix: suppress answer text in feed index, cards only from webResults
  • Desktop 7fc1df1 fix: use Query not question in inference POST, move header buttons to header strip
  • Node 506bd21 feat: FeedConfig lifetime_seconds in workspace manifest
  • SaaS 8b413ee gen: regenerate from proto — FeedConfig lifetime_seconds
  • Desktop 2c82ef0 feat: FeedWindow rewrite — inference prompt via SSE, card grid, discuss panel, session drawer
  • Proto 0194dbd feat(proto): add lifetime_seconds to FeedConfig
  • Desktop 13e7ed8 fix: remove dangling references to removed sessions state in FeedWindow
  • SaaS 5da4d8e fix: use plain struct for feed_config JSON deserialization, proto3 camelCase vs snake_case mismatch
  • Desktop 2a72a5d fix: FeedWindow uses refresh response items directly, removes broken session-loading path
  • SaaS 682071e fix: return feed items in refresh response for direct desktop rendering
  • Node a04503d fix: pass feed items through RefreshFeedResponse to desktop; populate items in FeedAgent
  • Proto 3988354 fix(proto): add items field to RefreshFeedResponse for direct desktop rendering

— 9 commits

  • SaaS f1b0cc8 docs: H192 — feed workspace type + card-based rendering (C478)
  • Node c791bf8 feat: feed agent, supervisor, RefreshFeed gRPC handler, workspace FeedConfig plumbing
  • SaaS 9249ae0 feat: feed workspace SaaS plumbing — creation, listing, refresh proxy, dispatcher
  • Desktop e9f38be feat: FeedWindow component, feed creation UI, space-type routing to FeedWindow
  • Desktop 5e78997 feat: feed card components, remove dead renderers, back-port cards to conversation rendering
  • Node df86eb0 gen: regenerate from proto — FeedConfig, FeedItem, RefreshFeed
  • SaaS cc90619 gen: regenerate from proto — FeedConfig, FeedItem, RefreshFeed
  • Proto 7b60c5a feat(proto): add feed workspace type — FeedConfig, FeedItem, RefreshFeed RPC
  • SaaS 265105b docs: H191 — mobile conversation interface discussion, deferred; D001 design doc

— 7 commits

  • SaaS 128b24d docs: H190 — web results persistence + hub buffer + tenant compose fix
  • Node df3480e fix: add pull_policy:always to tenant compose so varen-upgrade recreates containers on image digest change
  • SaaS a6976d3 fix: increase hub send buffer 64→256 to reduce understanding event drops
  • Desktop 566cddc feat: reload web results from session and collapse non-current turns
  • Node 8ae5691 feat: persist web results in .web_results JSONL and return via GetSession
  • SaaS 58b7297 feat: persist web results through proto, dispatch, node store and GetSession
  • Proto 3208913 feat(proto): add WebResult message and web_results fields to AnswerRecord and SessionMessage

— 1 commit

  • SaaS 55a5c38 feat: ephemeral web RAG with BM25 ranking (C477)

— 2 commits

  • SaaS 75a6397 docs: H189 — note deploy-robustness fix and JWT rotation follow-up
  • SaaS a916b81 fix: make deploy no longer overwrites saas.env with example template

— 23 commits

  • SaaS 19d615d docs: H189 handover — advisor expansion + classifier cache_control; archive H188
  • SaaS ec4e38d feat: add software_engineer, data_analyst, academic, translator advisors + cache_control on classifier path
  • SaaS 9a84468 docs: H188 handover — workspace header merge + gRPC msgsize fix; archive H187
  • Node bd4e031 fix(node): raise relay client gRPC max message size to 32MB
  • SaaS 4dde4e0 fix(saas): raise gRPC max message size to 32MB on NodeService server
  • Desktop a3c71b4 fix(desktop): merge live workspace status into workspace headers
  • Desktop 21f0631 fix(desktop): add session delete to in-workspace session drawer
  • SaaS a006c03 docs: H187 handover — regressions + nav + analysis-session fixes; archive H186
  • Desktop 4b42461 fix(desktop): filter realtime annotation events by session
  • Node ce5549f fix(node): init ambient insight clock on first observation
  • Desktop 173fa5e feat(desktop): clickable node rows; consolidate workspace info on Workspaces tab
  • SaaS 2667b9b fix(saas): unblock new-node registration + workspace creation
  • SaaS 13895e9 docs: H186 analysis pipeline live + first-person/TZ/LiteLLM fixes; archive H185
  • SaaS 59be29f feat(saas): auto-detect TZ in node installers (linux + windows)
  • Node fd101cf fix(node): add zoneinfo to distroless image + TZ env var in tenant compose for local-time display
  • Node 7218ebd fix(node): first-person voice for ambient analysis outputs
  • SaaS caada84 docs: H185 C476 desktop analyse UI deployed-unverified; archive H184
  • Desktop 970909b feat(desktop): Analyse button, facet-grouped panel, unseen-content indicator (C476)
  • SaaS 6f6ca9a docs: H184 C475 saas analysis proxy + unseen flag; archive H183
  • SaaS 606754f feat(saas): analysis proxy handler + has_unseen_content flag (C475)
  • SaaS 9e7d2f8 docs: H183 C474 analysis pipeline refactor; archive H182
  • Node 86e9982 feat(node): refactor analysis pipeline — new session per run, source-count gate, drop insight chunk (C474)
  • Proto 3e26514 feat(proto): add RunAnalysis RPC for manual analysis trigger (C474)

— 43 commits

  • Desktop 2c87c8b feat(desktop): rename fast/deep check to 3-state Reflection cycle toggle
  • SaaS 7c3ea4f docs: H182 C472 ephemeral removal; archive H181
  • Desktop 432c099 feat(desktop): remove ephemeral badge, Keep button, and keepWorkspace API (C472)
  • SaaS 492b223 feat(saas): remove ephemeral concept + KeepWorkspace + SweepEphemeral (C472)
  • Node 5374c3d feat(node): remove ephemeral concept + KeepWorkspace RPC (C472)
  • Proto 5d61b42 feat(proto): remove ephemeral fields + KeepWorkspace RPC (C472)
  • SaaS 5cd0038 docs: H181 C471 git vestigial removal; archive H180
  • SaaS 6b69c84 feat(saas): remove vestigial git subsystem (C471)
  • Node 194313a feat(node): remove vestigial git subsystem (C471)
  • SaaS 25fbcb6 gen: regenerate after git subsystem removal (C471)
  • Node e9cb276 gen: regenerate after git subsystem removal (C471)
  • Proto 3a3bbe5 feat(proto): remove vestigial git subsystem (C471)
  • SaaS a46523c docs: H180 validator history threading; archive H179
  • SaaS 0e1e5df feat(validator): thread conversation history into judge/reflect so anaphoric turns resolve against prior context
  • SaaS 8b14980 docs: H179 workspace title gate + session-name feeds placeholder; archive H178
  • Node b07e2de feat(intelligence): gate workspace/session titles on word count; feed session title into workspace name placeholder
  • SaaS 7248b6a docs: H178 C470/C473 bookkeeping closeout; archive H177
  • Node 6cff825 feat: regenerate proto (drop UpdateFileSidecarRequest)
  • SaaS 9a24e52 feat: regenerate proto (drop UpdateFileSidecarRequest)
  • Proto 8c36bad feat: remove UpdateFileSidecarRequest proto message (C473 verified stable)
  • SaaS 7dd0cc5 docs: H177 record live HTML stripper verification (3 chunks, <1m)
  • SaaS f0525e6 docs: H177 HTML stripper before extraction batching; archive H176
  • SaaS d4a16de feat: strip HTML to readable text before extraction batching
  • SaaS e2c4516 docs: H176 citation labels and popout links fixed; archive H175
  • Desktop f5890fc feat: add download link for file sources in source popout
  • Node f3d5445 fix: set BaseSourceID on extraction events so FetchSource matches; carry file_name in Qdrant payload
  • SaaS 8694d0d feat: pass file_name through source-content endpoint for popout download link
  • Proto 14b2961 feat: add file_name field to FetchSourceResponse for source popout download link
  • Node 7dd5c4a fix(file-agent): decouple source label from on-disk path; use URL as original_name for fetches
  • Desktop 1f094a6 feat(C470): desktop assets consolidation — single Assets tab, drop ephemeral/extraction_json, add original_name/source_kind
  • Desktop 9eb3569 fix(sourcePopout): render plain text for non-URL sources instead of dead href placeholder
  • Node cb2cea3 fix(file-agent): emit original_name as source label instead of content-addressed hash path
  • SaaS f4e004a docs: H175 C473 verified live; archive H174
  • SaaS dbb4b27 docs: H174 C473 shipped; archive H173
  • Node 5cff659 feat: C473 — file-agent uniform IsBinary emit; supervisor extractAndEmbed via SaaS ExtractContent proxy; delete sidecarHasEventID gate and UpdateFileSidecar Go method
  • SaaS f85087d feat: C473 — add ExtractContent gRPC handler; delete triggerAssetExtraction/AssetExtractor/UseAssetExtractor; delete UpdateFileSidecar from dispatcher
  • Proto 62ea7d5 feat: add ExtractContent RPC to NodeService; remove UpdateFileSidecar from TaskService (C473)
  • SaaS 3380229 docs: H173 C473 unified extraction contract; archive H172
  • SaaS 8aad4b7 docs: H172 orchestrator prompt hardening; archive H171
  • SaaS 49ad046 docs: H171 asset storage consolidation design and contracts; archive H170
  • SaaS db1af04 docs: H170 intent diversion restyle, streaming race, file deletion removal, source_id fix; archive H169
  • Node c53ef42 fix: FetchURL and CheckURL return EventID as SourceID, not filename — matches Qdrant source_id
  • Desktop 0f65c1e refactor: source popout reads chunks from qdrant only; drop sidecar extraction lookup

— 68 commits

  • Node 61435ab fix: show indexed status for text files with IndexedAt set but no extraction record
  • Desktop 9bcbe67 refactor: remove file delete, bulk delete, and tidy UI
  • SaaS a3c6ad1 refactor: remove DeleteFile and TidyEphemeral routes, handlers, dispatcher methods, mocks
  • Node 97482d4 refactor: remove file deletion and tidy-ephemeral paths; remove file agent deletion detection
  • Proto 1049be3 refactor: remove DeleteFile and TidyEphemeral RPCs and request messages
  • Node 367ec8b fix: log supervisor emit dedup/ok/fail so ingest pipeline is observable
  • SaaS 51887fa feat: add tech_support advisor for consumer electronics troubleshooting
  • Desktop 5715979 fix: guard streamingOidRef clear so aborted turn cleanup does not clobber a newer turn
  • Node 64ef8aa fix: exclude .meta.json sidecars from file agent scan; log watch_paths on start
  • SaaS ac1f130 fix: log validator verdicts on every fast-check run
  • Desktop 16d4304 fix: restyle intent divergence warning as ws-info-panel under thread
  • SaaS c64e14a docs: H169 validator prompts, research tab, source popout, watch_paths; archive H168
  • Node 1f45d9c fix: inject default watch_paths for file agents at start time
  • Desktop 44ea1f9 fix: add Research tab to workspace toolbar; resilient source-viewer popout
  • SaaS 001b8fe fix: validator prompts judge answer coverage, not user message quality
  • SaaS fe855f2 docs: H168 export ux, unified info panels, popouts as tabs; archive H167
  • Desktop 471f71f fix: open popout windows as new browser tabs without sizing features
  • Desktop 8dbeac2 feat: unified info panels for understanding, reflection, and web results — colored left bar, full-title toggle, icons (lightbulb/leaf/globe)
  • Desktop bc7d9f5 fix: drop export info message from printed copy
  • Desktop 17d3f4a fix: export button no longer auto-triggers print dialog
  • Desktop 2c45c9c feat: rename Print toolbar button to Export
  • Desktop 4d39fa8 feat: print session — notebook-pen marker instead of Q on user messages
  • Desktop 6b638a8 feat: print session — Q marker with vertical bar on questions
  • Desktop 0552c07 fix: print session — use varen font, UL for sources, div turns to avoid page breaks
  • SaaS c547a08 docs: H167 web search redesign, print session, textarea auto-grow; archive H166
  • Desktop 6d02710 fix: drop flex:1 from textarea — was overriding auto-grow height
  • Desktop 1aecece fix: textarea auto-grow via onInput handler — direct DOM mutation
  • Desktop bd960c4 fix: textarea auto-grow — useLayoutEffect instead of useEffect+rAF
  • Desktop d506bdf fix: textarea auto-grow — defer height set to rAF for accurate scrollHeight
  • Node 7db62fa fix: resolve session names in seed-chunk path (H165 gap)
  • SaaS f577efe fix: resolve session names in seed-chunk path; restrict fetch_url to user-named URLs
  • Desktop a7f73e2 fix: card click opens page directly — no separate link needed
  • SaaS f3622c4 chore: drop HEAD-check count from understanding message
  • Desktop 84aab9b style: portrait web cards, card is click target, drop HEAD from msg
  • SaaS e5f12e7 feat: HEAD-check web results before surfacing; enforce model silence on searches
  • SaaS 12567d9 fix: carry web results through HandleBrowserRequestStream
  • Desktop aa80bec feat: web card layout — snippet, url, ingest; opened highlight
  • SaaS e53e825 feat: web_search becomes async query-suggestion tool
  • Node 60a1f16 refactor: drop dead node-side web search scaffolding (AC427)
  • SaaS ed35692 refactor: drop dead node-side web search scaffolding (AC427)
  • Desktop 5336f12 feat: web results panel with add-to-research cards
  • SaaS 76bf588 feat: surface web-search hits as user-reviewable candidates, not model context
  • Desktop 1f75413 fix: textarea auto-grow via useEffect, render markdown in print output
  • Desktop 76d832e feat: auto-grow chat textarea, add print-session toolbar button
  • SaaS 6e130b7 docs: H166 retire edit-question, trash→collapse, turn bar height; archive H165
  • Desktop 085b51c feat: retire edit-question pencil, repurpose trash as UI-only fold/collapse, reduce turn bar height
  • SaaS 9894f18 docs: H165 add badge work, confirm (2) live, drop false node-reload alarm (1h timer not broken)
  • Desktop 30c0cd5 fix: corpus citation links use accent color and no underline, matching web links
  • Desktop 68f5bb8 feat: colored pill citation badges per source type, number-only for unknown types
  • Desktop 752fd23 feat: compact 3-letter citation source badges (doc/eml/web/mem/ses/src) folding number + type
  • SaaS 4aa0975 docs: H165 fix source_id parser bug for ws_ prefixed workspace IDs
  • Node 5557547 fix: parse session source_id with regex so ws_ prefix workspace IDs resolve to session titles
  • SaaS 2d398d9 docs: H165 resolve session citation labels at read time, retro-fits existing turns
  • Node 80db886 feat: resolve session citation labels at read time so renamed sessions stay current
  • SaaS deafdad docs: H165 note H164 node reload mechanism failed, requires investigation
  • SaaS f4c53ba docs: H165 citation format, session name, reload rail
  • Desktop 3568ffc fix: truncate citation labels to single line; restore citation rail on reload for multi-question turns
  • Node 2ba7579 feat: surface session title instead of UUID in session-chunk citations
  • SaaS e35941e docs: update H164 with follow-up commits and decisions
  • SaaS 4fde580 fix: fall back to cron when systemd is unavailable
  • Desktop 6b6b8ae fix: atomic desktop deploy with no asset gap
  • Desktop 23f5b62 fix: clean stale ui assets on deploy
  • SaaS 70435c3 fix: watcher timer to 1h default, clean stale ui assets on deploy, warn on missing systemd
  • SaaS 137425b docs: handover H164 — external node reload + desktop force reload
  • Desktop 22d2cbf feat: poll desktop version + force reload on upgrade; clickable node reload button
  • SaaS 7b6c0de feat: external docker node reload + forced desktop browser reload on upgrade
  • SaaS bac3333 docs: handover H163 — close C319 typecheck seam
  • Desktop 5550109 fix: align TurnNode.validatorResult typing as nullable (C319)

— 27 commits

  • SaaS 94a5b3e docs: drop tracked H160 after archival to AH160
  • SaaS de74128 docs: handover H162 for C467 complete
  • Desktop 81c086a feat: add Research tab and folder-aware sidecar paths for C467
  • SaaS 63e98c4 feat: add fetch_url retrieval tool and CheckURL-first flow for C467
  • Node 5f68eb4 feat: add CheckURL and passthrough FetchURL with async ingest for C467
  • Proto 8af5376 feat: add CheckURL RPC and FetchURLResponse for C467 URL ingest
  • SaaS 0b66ac8 docs: handover H161 for C467 URL ingest and Research tab
  • SaaS 3730c73 docs(h160): note reflection title toggle
  • Desktop 3b2745c fix(desktop): make reflection title the toggle instead of the leaf icon
  • SaaS f2cc4c9 docs(h160): note tri-state validation indicator in understanding
  • SaaS bbb90ca feat(router): tri-state validation indicator in understanding panel
  • SaaS aff249a docs(h160): note followup phrase fix and open indicators
  • SaaS 35f3183 fix(validator): phrase reflection followups as user-typed turns
  • SaaS d49ce8d docs(h160): quick-check reflection panel with session toggles
  • Desktop fa1d5c6 feat: add reflection panel, fast/deep toggles and sage palette
  • SaaS b492061 feat: add fast/deep validation toggles and quick-check-only output
  • SaaS 0f298ce docs(h159): note desktop streaming scroll threshold hotfix
  • Desktop 472da4a fix: use relative auto-scroll threshold to avoid chrome defeating the 32px gate
  • SaaS 15c0a67 docs: handover h159 - reasoning effort, validator gate, truth prompt; archive h158
  • SaaS 1e15149 feat: classifier-driven reasoning effort, Haiku validator gate, truth-advocate prompt
  • SaaS 8337303 docs: handover h158 - desktop streaming scroll fix and h157 archive
  • Desktop 18503a3 fix: respect manual scroll-up during streaming by checking live distance
  • SaaS 2b809c4 docs: update h157 with retrieval-loop citation fix
  • SaaS 60e4faa fix: preserve conversation citation prompt when retrieval loop is enabled
  • SaaS ab04439 docs: update h157 with revised recency and citation fixes
  • Desktop e448b44 fix: remove desktop touch on workspace open; rely on saas-side updates
  • SaaS d61e04e fix: bump workspace last_active_at on inference and keep; stronger conversation citations

— 6 commits

  • SaaS d638426 docs: archive h156, write h157 desktop-saas polish bundle
  • Desktop c68a7f8 feat: workspace recency sort, streaming scroll controls, sticky home node
  • SaaS afcb0b3 feat: workspace last_active_at tracking, touch endpoint, stronger conversation citation prompt
  • SaaS 499073a docs: record h155 saas commit ace4fda in archived handover
  • SaaS 75ed3cc docs: close h155, archive h154/h155, write h156 planning handover
  • SaaS ace4fda fix: tune grpc keepalive, log jwt and sse errors for login-boot diagnostics

— 1 commit

  • SaaS 463a78d fix: citation [n] references in conversations, ledger →, navigator session sort

— 14 commits

  • SaaS dc4b654 docs: H153 updated with live verification results, hybrid is now default-on
  • Node 4c74110 feat: enable hybrid search default, wire into intent deriver
  • Node 9cf1c4a feat: eval-harness hard corpus targeting dense's exact-term weakness
  • Node 37d625b fix: eval-harness dense search uses named-vector struct form (C466)
  • SaaS e01c46b docs: H153 handover for C466 hybrid retrieval fix, archive H152
  • Node d5da5fe fix: hybrid retrieval via named dense+sparse vectors with RRF (C466)
  • SaaS fda04b2 docs: update H152 with dense baseline result and C465 hybrid bug
  • SaaS 3619dd7 docs: add H152 handover for eval harness in node image; archive H151
  • Node 6923bca feat(node): ship standalone eval harness inside docker image
  • SaaS e6a9976 docs: H151 — citations and hybrid retrieval; archive H150
  • Node 0e1e23e feat: hybrid retrieval with Qdrant full-text index and RRF fusion (C465)
  • Node 274257e feat: retrieval eval harness with labelled corpus (C464)
  • SaaS 946cdce feat: enable citation registry for conversation mode (C463)
  • SaaS 39e9089 docs: H150 — retrieval enhancement planning; archive H149

— 3 commits

  • SaaS 89fcabc docs: H149 — node dispatch timeout diagnostics; archive H148
  • Node dbe89cc fix: add dispatch channel guards and panic recovery in task loop
  • SaaS dec37ed fix: add gRPC keepalive and dispatch diagnostics for node timeout investigation

— 13 commits

  • SaaS 3c7834d docs: H148 — navigator text wrap fix; archive H147
  • Desktop cebad94 fix: nest badge and node indicator inside name span in navigator
  • Desktop 9fdc6d8 fix: revert single-line text truncation, restore multiline wrapping in navigator
  • SaaS 580c9cd docs: H147 — navigator fluid width and recency grouping; archive H146
  • Desktop 878f60e feat: fluid navigator width, recency grouping, single-line workspace rows
  • SaaS 557116d docs: H146 — node understanding entries and version sync; archive H145
  • Desktop e3e25f9 fix(desktop): disambiguate node version labels (Registered/Running)
  • Node 3075cc0 feat: stream context assembly timing to SaaS as understanding entry
  • SaaS 9c9e8d6 feat: forward node thinking updates as understanding entries; persist version on re-registration and heartbeat
  • Desktop cb87cd1 fix(desktop): null-safe chunk iteration in sourcePopout (H145)
  • SaaS ce1b2fb fix(saas): nil-safe chunks in source content response (H145)
  • SaaS 6131ee5 docs: H144 — TLS/mTLS fixes; archive H143
  • SaaS 3b63131 fix(tls): add WG IP SAN and ClientAuth to server cert; persist CA via files

— 27 commits

  • SaaS 0c9cc86 fix: add VPN IP SAN to node certificates for mTLS verification
  • SaaS f68ca92 docs: H143 — audit §4 anomaly cleanup; archive H142
  • SaaS ec68676 fix(db): add IF NOT EXISTS to 026_audit_log migration indexes
  • SaaS 017e9a7 fix(search): clarify error messages when both search backends fail
  • SaaS 18e36fc docs: H142 — C458-C461 dispatch; archive H141
  • Desktop 97f8250 fix(desktop): sanitize HTML in writePopout with DOMPurify (C461)
  • SaaS 5bbc446 feat(saas): admin JWT auth for payment endpoint with audit_log (C460); regenerate proto stubs (C458, C459)
  • Node 8fc72a5 chore(node): regenerate proto stubs with auth and sensitivity options (C458, C459)
  • Proto baa7361 feat(proto): add auth annotations to all RPCs and sensitivity marking to RegistrationAck (C458, C459)
  • SaaS 49d205e docs: H141 deployed state
  • SaaS e95fe93 docs: H141 handover, archive H140 (C454–C457)
  • Node 693c34e fix(node): C455 propagate sidecar write errors, C456 cancel restart goroutines on shutdown, C457 return error instead of log.Fatalf in run()
  • SaaS 21d1784 fix(saas): remove deprecated ?token= WebSocket auth fallback (C454)
  • Desktop 429f592 fix(desktop): remove deprecated JWT query-string WebSocket fallback (C454)
  • SaaS ee32fe1 docs: H140 handover, archive H139 (C449–C453)
  • SaaS 0fd9485 fix: propagate ensureSubscription errors, switch billing to decimal arithmetic (C452, C453)
  • SaaS 43729b8 fix: UNIQUE constraints on vpn_ip + node_index, retry on race (C451)
  • Node 3126ec9 feat: TLS_CA_CERT env var for secure registration verification (C450)
  • Node 27a95cf feat: gRPC mTLS client+server, CA cert chain read from RegistrationAck (C449)
  • SaaS 0e074f7 feat: gRPC mTLS — CA-backed cert signing, TLS on NodeService and dispatcher (C449)
  • Proto 748222b proto: add ca_cert_pem field to RegistrationAck (C449)
  • Desktop 1112949 fix(desktop): add Content-Security-Policy meta tag (C446)
  • SaaS eaadbc9 docs: H139 handover — fresh-eyes audit and hardening sprint
  • Desktop 312b6ea fix(desktop): escape workspace name in WinBox title (C445)
  • Node f9c1cd0 fix(node): restrict session and upload file permissions to 0600/0700 (C445)
  • SaaS f7058b2 fix(saas): suspended license gate and per-user WebSocket limit (C445)
  • SaaS 75a3f40 fix(saas): fail-safe credit check with advisory lock serialization (C444)

— 30 commits

  • Node 1b6690f feat(node): dual-key JWT validation for secret rotation (C443)
  • SaaS 592742f fix(saas): dual-key JWT validation, env split, rotate secrets (C443)
  • SaaS f61aa3a fix(saas): split secrets from config, add saas.env.example (C443)
  • SaaS f1cf2f6 docs: H138 handover — dispatch C441 and C442
  • SaaS e8c2d45 fix(saas): clarify search gateway SearXNG best-effort handling (C442)
  • SaaS 4d7a824 docs(saas): correct deriveKey IKM comment in display cache crypto (C441)
  • SaaS bddc352 docs: H137 handover — audit reconciliation + deploy discipline
  • SaaS dd4481e chore: archive H136 handover
  • SaaS 245409c style(saas): fix indentation after removing content key (C438)
  • SaaS 953ed83 fix(saas): drop redundant content key from web_search tool result (C438)
  • SaaS 7f3c98e docs(saas): reconcile 2026-06-17 audit findings with current source (C437)
  • Desktop fe98967 docs(desktop): remove dead Websearch help text (C437)
  • SaaS 7844c0c docs: H136 handover — C436 deploy catch-up + archive H135
  • SaaS 15b4e6e docs: H135 handover — C435 deployed, deploy step to be included in contracts
  • SaaS 1ba6c73 chore(proto): regenerate Go bindings and fix stale router test after C435 dead-surface cleanup
  • Node b2343f5 chore(proto): regenerate Go bindings after C435 dead-surface cleanup
  • Proto 75cfc57 chore(proto): remove dead web-search, workspace-stats, PushReplies and TriggerIntentDerive surface (C435)
  • SaaS afa1287 docs: H134 handover; archive H132 and H133; update pointer
  • Node 775f664 fix(node): eliminate lock-copy vet warning and guard nil supervisor (C434)
  • SaaS 76fb94a fix(tests): repair router refCorpus calls and integration mock drift (C434)
  • Desktop e74b701 fix(desktop): C433 security sweep
  • Desktop cc7361f feat(desktop): send /updates token via Sec-WebSocket-Protocol (C432)
  • SaaS c91a171 feat(saas): harden /updates WebSocket — token-in-protocol, origin validation, timeouts (C432)
  • Desktop 2e4a6c6 fix(desktop): add auth to image thumbnails and remove stale Websearch UI (C431)
  • Node 1ae584c feat(node): restore minimal FetchURL pipeline with rate limits and tests (C431)
  • Node 24816a1 fix(node): C430 harden file paths and websocket server
  • SaaS f840230 feat(saas): C429 authenticate NodeService and attach JWT in dispatcher
  • Node e2fad78 feat(node): C429 authenticate TaskService and attach JWT in lifecycle
  • Proto 96a246d feat(proto): C429 add metadata_node_id and jwt_secret to internal gRPC planes
  • SaaS 8f63de8 docs: H133 full-source audit; C429-C431 authored; update handover pointer

— 16 commits

  • SaaS 37933f1 docs: H132 — web search cleanup (C427 remove ambient+passive, C428 in-loop web_search rebuild); archive H131
  • SaaS 042b9e2 C428: rebuild web search as synchronous in-loop retrieval tool
  • Node 65af024 C427: remove orphaned internal/research package and stale webfetch comment
  • SaaS 68d2106 WIP: auto-checkpoint on session end 20260616-232513
  • Node e8a8583 WIP: auto-checkpoint on session end 20260616-232513
  • SaaS 575d617 docs: remove DESIGN-ambient-web (retracted)
  • SaaS 311517e docs: DESIGN-ambient-web — corpus growth, in-answer web, idle gate
  • SaaS ef11991 docs: H131 — citation reload persistence (C424), raw-over-derived grounding (C425), cite-only-referenced (C426); archive H130
  • SaaS b2ee72b C426: cite only referenced sources
  • SaaS e28abdc C425: carry chunk kind into context, group by nature RAW→DERIVED→WEB, and add citation precedence guidance
  • Node 8997ba7 C425: carry chunk kind through RAGChunk, taskloop wire, relay hit, and pb mapping
  • Proto 933c22c C425: add kind field to ScopedSearchResult
  • Node 518a1e3 C424: persist citation quotes across session reload (node disk)
  • SaaS 1bf4270 C424: persist citation quotes across session reload (saas JSON + cleanup)
  • SaaS 6373224 docs: H130 — popout full_text body (C421/C422/C423); canonical-over-derived grounding + web-search gate root causes; archive H129
  • Desktop 406b256 C423: fix popout sidecar fetch to the files-list route (C422 follow-up)

— 19 commits

  • Desktop 2498b1d C422: source popout shows file_summary + emitted quote + full_text body (from sidecar)
  • SaaS c5e13ac C421: privacy-safe quote-pipeline diagnostics in resolveQuotes
  • SaaS 48aff9d docs: H129 — citation popout original-file link + location line + quote spans; archive H128
  • Desktop 6edc1be C420: model-grounded quote spans in Lens source-viewer popout
  • Node c301b13 C420: model-grounded quote spans in Lens source-viewer popout
  • SaaS 5ccc5d2 C420: model-grounded quote spans in Lens source-viewer popout
  • Proto 42d9dff C420 — add CitationQuote message to proto
  • Desktop 7db911e C419: add source-location line to popout (source.ts + sourcePopout.ts)
  • SaaS 7dd743c C419: forward part_id and content_type in source-content JSON API
  • Node ee005af C419: surface part_id and content_type from Qdrant in FetchSource
  • Proto e1e7173 C419: add part_id and content_type to FetchSourceResponse
  • Desktop bb48ca2 C418: source popout clickable original-file link; drop chunk count
  • SaaS a083092 docs: H128 — sales-site three-modes reframe + waitlist page; archive H127
  • SaaS 36d7d1b docs: H127 — citation popout browser-window rework; stale-SaaS root cause; archive H126
  • Desktop a4ba874 C414: source viewer as browser window with generic Save/Print/Copy toolbar
  • Desktop ba1816c WIP: auto-checkpoint on session end 20260615-080709
  • Node 52658cc fix: pass positive scroll limit in FetchSource (C413)
  • Desktop da624a2 C412: Restore clobbered desktop app stylesheet (C410 regression)
  • SaaS 73f16ff docs: H126 — clickable Lens citations arc (C409/C410/C411); archive H125

— 10 commits

  • Desktop b62291b fix(desktop): move openSourceViewer declaration before handleSelectWorkspace to resolve TDZ error
  • Desktop 35af473 C410 — clickable corpus citations → source-viewer popout
  • SaaS 78041f4 C410 — clickable corpus citations → source-viewer popout
  • Node 2238720 C409 — node: propagate chunk indices through RAG chunks, wire, relay, and persistence
  • SaaS 6f28244 C409 — add unit tests for citation registry chunk accumulation
  • Desktop f893b51 C409 — desktop: add chunks field to Citation type (data model only, no UI)
  • SaaS 7fd3c2c C409 — saas: citation chunk provenance framework (refCorpus, wire, dispatcher, JSON)
  • SaaS 6a1a965 C409 — node: propagate chunk indices through RAG chunks, wire, relay, and persistence
  • Proto 5615fa7 C409 — add chunks field to Citation message
  • SaaS 0a1c661 docs: H125 — C408 cosmetic (profile Update button + citation gutter); archive H124

— 19 commits

  • Desktop eecb442 C408: profile Update button under textarea; reserve citation gutter only when rail present
  • SaaS fbf1d93 docs: H124 — profile-consolidation arc executed + verified (C406, C407); archive H123
  • SaaS 570300a C407: Regen proto to remove PersonalSettings*; fix stale GetPersonalSettings doc-comments
  • Node 1b69fb8 C407: Remove deprecated PersonalProfile fields and dead PersonalSettings RPC
  • Proto 81a9c74 C407: Remove PersonalSettings messages and orphaned GetPersonalSettings/SetPersonalSettings RPCs
  • Node 5cba68d C406 fix: remove stale WithPersonalStore chain call (build fix)
  • SaaS c60fb77 C406: drop orphaned PersonalNotes wire field, update stale comments
  • Node 982ed83 C406: tear down dead ContextNotes store, repoint node-scoped remember to origin=profile, collapse C404 dup
  • Desktop 58cb3eb C405: send browser tz/locale hints, render dismissible profile suggestions
  • SaaS b54876a C405: thread tz/locale hints + return suggestions through ProcessProfileStatement
  • Node c5ca851 C405: structured {facts,suggestions} output + tz/locale hints in ProcessProfileStatement
  • Proto 7586ea4 C405: ProcessProfileStatement gains tz/locale hints + suggestions
  • Desktop 520a13e C404: send browser client_timezone on inference requests
  • SaaS cee5f08 C404: thread client_timezone, render always-inject profile+environment block, exempt from Lens gate
  • Node aa2df46 C404: load origin=profile facts + stamp live datetime into context package
  • Proto 5143cb4 C404: add InferenceTask.client_timezone
  • Node ed0e097 WIP: auto-checkpoint on session end 20260613-013807
  • SaaS 61b66fe docs: H123 — profile consolidation decisions A–E + DESIGN facts-only revision; archive H122
  • SaaS 3aa808e docs: H122 — conversational link/claim verification (discussion); archive H121

— 7 commits

  • SaaS a2affa4 docs: DESIGN — user profile consolidation (open decisions)
  • SaaS f391afd docs: H121 — Document Lens domain research; archive H120
  • SaaS dfc25f0 docs: H120 — navigator + citation UI fixes (C400 dedup+scroll, C401 wide-screen widths, C402 Lens badge); archive H119
  • Desktop 5df3060 C402: recolor Lens badge to #528ae3 with 30% tinted background
  • Desktop 25c37b8 C401: widen navigator + citation rail on wide screens
  • Node 14310ea C400: group corpus index by source, not source_id
  • Desktop cb89943 C400: cap Indexed sources list at ~10 rows with scrollbar

— 21 commits

  • SaaS 49ba22c docs: H119 — citation source-type label (C398 wire+rail, C399 reload+container fix); archive H118
  • Desktop 2270ca1 C399: move container-type to .ws-turn so answer-row container queries apply
  • SaaS caf5c30 C399: carry source_type through the session-reload citation path
  • Desktop a3253d6 C398: citation rail \u2014 source-type label, basename, height-capped scroll
  • Node 3b3e411 C398: persist + relay Citation.source_type
  • SaaS 1fa4306 C398: thread Citation.source_type through router + dispatch
  • Proto 3e50352 C398: add source_type to Citation
  • SaaS 345ed7f docs: H118 — citation UI tidy (C396 dot-rail removed, C397 per-turn rail + Sources tab dropped); archive H117
  • Desktop 6a0300a C397: per-turn citation rail beside the answer; remove Sources tab
  • Desktop aaf84cb C396: remove FlowChartPanel dot-rail (precursor to per-turn citation rail)
  • SaaS acbd8e1 docs: H117 — node persistent-data root-ownership investigation (parked); archive H116
  • SaaS 4599e21 docs: H116 — Lens workspace-clobber fix (C394 space_type + C395 ephemeral, node-sourced); archive H115
  • SaaS b5bc57d C395: ephemeral node-sourced + keep-flip propagation — node image 6.260611.135414
  • Node b53343a C395: ephemeral node-sourced + keep-flip propagation
  • Proto 275d434 C395: add ephemeral field to workspace proto + KeepWorkspace RPC
  • Node a560480 C394: workspace space_type becomes node-sourced
  • SaaS c2066a1 C394: workspace space_type becomes node-sourced
  • Proto 399f411 C394: add space_type to WorkspaceProvisionRequest and WorkspaceInfo
  • SaaS e99a56f docs: H115 — Tier-1 Lens verification close-out (C390/C391 verified, C392 fixed via C393); archive H114
  • Node 3bf6b83 C393 — remove duplicate citation-write block in RecordAnswer
  • SaaS 31a1e69 C393 — send Citations on main enriched-completion path (C392 omission)

— 13 commits

  • SaaS 60e78be C392: wire citation persistence through saas read/write paths
  • Node f862d34 C392: add citation persistence plumbing (mirror understanding pattern)
  • Node 989435f WIP: auto-checkpoint on session end 20260610-171546
  • Proto 6984a76 WIP: auto-checkpoint on session end 20260610-165351
  • Desktop c0184d9 C391: Desktop Lens Sources panel — consume done-event citations
  • Desktop 2cae4c8 WIP: auto-checkpoint on session end 20260610-163853
  • SaaS 8dca02c C390: space-type-aware retrieval-loop MaxRounds for Lens
  • SaaS 56e94f8 docs: H114 — Lens live-verify (C387/C388) + refusal hardening (C389); archive H113
  • SaaS 37b158c C389: harden Lens grounding refusal — forbid general-knowledge asides after off-corpus refusal
  • SaaS e8e8292 docs: H113 — Lens Foundation (C387) + Core attribution (C388); archive H112
  • SaaS 313910d C388: Lens corpus-first core — source labels, anchoring grounding prompt, structured citations
  • SaaS 5c08f66 C387: plumb authoritative space_type to InferenceTask (Lens foundation)
  • SaaS fa64138 docs: H112 — Lens made live (C386) + corpus-first/attributed Lens design; archive H111

— 8 commits

  • Desktop 9a63674 C386: enable Lens workspace type in New Workspace modal
  • SaaS 7c532f0 docs: H111 — Uploads tab DnD/paste/multi-select (C385); archive H110
  • Desktop 1250b52 C385 — Uploads tab: drag-drop, paste, multi-select (shared upload helper)
  • SaaS 3fa4b51 docs: H110 — park cards renderer (C384); C383 gemini revert closed; archive H109
  • Desktop 8e0c8ec C384: park cards renderer — disable cards branch in renderAnswer
  • SaaS bd72e99 C384: park cards renderer — disable quiz/procedural content-signal mappings
  • SaaS ca39d17 docs: H109 — advisor-keyed model routing + classifier resync (C381); archive H108
  • SaaS bcb5f76 C381: advisor-keyed model routing + classifier prompt resync

— 28 commits

  • SaaS fe3a7e5 docs: H108 — ambient question-card accept splices Q+A into the turn (C380); archive H107
  • Desktop 038d2d5 C380: question card accept — splice Q+A into user turn
  • SaaS e7d8513 docs: H107 — observation system built end-to-end (C377/C378/C379); archive H106
  • Desktop 3e2f5c4 C379: surface inferred observations in node Profile tab
  • Node 6753353 C378: store observations in _node and surface via ListFacts
  • Node 7e0c1fc C377: regenerate gen/ for ObservationRecord proto addition
  • SaaS 99670b4 C377: observe tool produce path — add observeTool, parseObservationToolCalls, wire TaskResult/Observations through router/dispatcher to AnswerRecord
  • Proto 076c9af C377: add ObservationRecord message and AnswerRecord.observations field
  • SaaS 57e2791 docs: H106 — C375 verified complete + C376 (badge repalette + understanding card restyle); archive H105
  • Desktop cab88da C376 fix: conversation badge background = font color at 30% opacity
  • Desktop fa1d307 C376: Navigator conversation badge repalette + understanding block restyle to match annotation cards
  • Desktop d8bf6e1 C375 — desktop: corpus API client, Knowledge tab source list + points gate, remove dead warmth
  • SaaS e6083a7 C375 — saas: add corpus HTTP endpoint, remove dead warmth
  • Node 34dc977 C375 — node: write URL into web-page source payload for corpus index
  • Node 90660ef WIP: auto-checkpoint on session end 20260608-174917
  • SaaS 1a50dc3 docs: H105 — Knowledge-tab tidy (C375 dispatched: corpus source list + points gate, warmth removed); archive H104
  • SaaS 76473a7 docs: H104 — Websearch/Uploads alignment (C373 web-as-file ingest, C374 Get-URL); archive H103
  • Desktop f855772 C374 — manual web-page ingest: add URL grab UI to Websearch tab
  • SaaS 53f8843 C374 — manual web-page ingest: add FetchURL dispatcher, HTTP handler and route
  • Node dc39746 C374 — manual web-page ingest: wire FetchSink to coordinator, implement FetchURL handler
  • Proto 595c490 C374 — add FetchURL RPC to TaskService for manual web-page ingest
  • Node 289ae7c C373: web pages ingested as files
  • Desktop d83e268 C373: web pages ingested as files
  • SaaS efd76f1 docs: H103 — workspace-modes Conversation milestone (C370/C371/C372); archive H102
  • Desktop a80aa95 C372-fix — Fix nav workspace name wrapping + bump SW cache
  • Desktop d5fcd6c C372-fix — increase .nav-item-name specificity for multi-line wrap
  • Desktop 9441491 C372 — Desktop: workspace-modes UI polish (nav row, header strip, badge palette, button)
  • Desktop 1ff54d9 C371: workspace-modes UI — flat nav, creation modal, in-window sessions + space-type

— 16 commits

  • SaaS 381e9d7 C370: add space_type column, validate/derive in create, return in list, live push on keep
  • SaaS 0f9e84f docs: workspace-modes §12 — Conversation milestone locked decisions (C370/C371)
  • SaaS ffa0fc1 docs: H102 — retrieval-loop timeout + extraction-starvation fix; loop live; archive H101
  • SaaS 3cf76d0 fix(litellm): bound extraction fan-out (C369)
  • SaaS 6a7b46c fix(router): per-round + MaxRounds-derived ceiling for retrieval loop (C368)
  • SaaS 6188686 C366: close contract as Blocked — extraction starvation blocker
  • SaaS 580714e C366: raise extraction timeout to 300s floor / 60×sizeMB
  • SaaS fa6710a C366: raise extraction timeout — 90s→120s min, 6×→15× sizeMB
  • SaaS cced24e C366: fix extraction timeout — use transport-only client in extractCall
  • SaaS 5b03a90 docs: correct H101 — C366 landed via auto-checkpoint during session, not left uncommitted
  • SaaS 359f518 docs: H101 — workspace-modes design spine (Conversation/Lens/Outcomes)
  • SaaS 3b273dd WIP: auto-checkpoint on session end 20260607-090239
  • SaaS d00df93 WIP: auto-checkpoint on session end 20260607-081129
  • SaaS 5e9c6b6 WIP: auto-checkpoint on session end 20260607-075858
  • SaaS 4a05460 WIP: auto-checkpoint on session end 20260607-073520
  • SaaS d298e9b WIP: auto-checkpoint on session end 20260607-072242

— 5 commits

  • SaaS fe11c53 C367: unify retrieval loop — single call when no retrieval needed
  • SaaS f65b917 docs: handover H100 — C363 verified; C366+C367 written; archive H099
  • Node 7be3f42 feat(node): CorpusIndex corpus-enumeration RPC (C363)
  • Node b1ecbec WIP: auto-checkpoint on session end 20260606-101610
  • Proto e57f65c feat(proto): CorpusIndex RPC (C363)

— 4 commits

  • SaaS 46e22e0 docs(saas): split retrieval-loop §8 — C363 node CorpusIndex, C366 saas flip
  • SaaS 45d46cb docs: handover H099 — C362 bounded retrieval loop verified; archive H098
  • SaaS 6653d7f feat(saas): C362 bounded retrieval loop — tool-result plumbing, flag default off
  • SaaS c823987 WIP: auto-checkpoint on session end 20260604-074411

— 1 commit

  • SaaS 22fb23c docs: handover H098 — git binary cleanup (C364/C365); archive H097

— 12 commits

  • SaaS bc1ee58 chore(saas): stop tracking compiled varen-saas binary (C364)
  • Node d471587 feat(node): ScopedSearch + FetchSource retrieval RPCs (C361)
  • Proto f034e4f feat(proto): ScopedSearch + FetchSource RPCs (C361)
  • SaaS ec120f3 docs: handover H097 — agentic retrieval loop design + C361 (Pending); archive H096
  • SaaS 68088b2 docs: Active design — agentic retrieval loop (seed+expand), staging C361→C363
  • SaaS 36c9b23 docs: H096 — C360 live-verified (txt ingest fixed on fresh node)
  • SaaS 32805e5 docs: update H096 — C360 executed (chunk token-budget fix, Deployed-Unverified)
  • Node 7c852b6 feat(node): bound embedding chunks to model input window (C360)
  • SaaS f832734 docs: handover H096 — C359 executed + live-verified (embedding prefixes + retrieval floor)
  • Node f6a7a7b feat(node): nomic embed task prefixes + retrieval-gate recalibration (C359)
  • SaaS 5732222 docs: handover H095 — embedding retrieval root cause + C359 nomic-prefix fix (Pending)
  • SaaS c5ec9a5 chore: archive prior handover + completed contracts

— 23 commits

  • SaaS 7d7e403 docs: handover H094 — C358 ambient card surface complete (arc Deployed-Unverified)
  • Desktop 7ec4b0c feat(desktop): four-category selectable ambient card surface (C358)
  • SaaS dd47dc8 feat(saas): AppendTurn endpoint (C357)
  • Node 3d2f50b feat(node): AppendTurn splice RPC (C357)
  • Proto 3c7bb3e feat(proto): AppendTurn RPC (C357)
  • Node 4cbb154 feat(node): unified four-category ambient pass (C356)
  • SaaS 56d0c2b chore: archive prior handover + completed contracts
  • SaaS 9a8371b docs: handover H093 — ambient four-category redesign (C356/C357 authored Pending)
  • SaaS 61b3afb chore: archive prior handover + completed contracts
  • SaaS 6b6bac1 docs: handover H092 — C355 cross-desktop sync close-out (C355 Complete; C354 verified)
  • SaaS 2c86a40 chore: archive prior handover (re-apply; dropped by C355 reset)
  • SaaS 148a096 feat(saas): push node_refresh on workspace create/delete (C355)
  • SaaS eac5503 docs: handover H091 — cross-desktop session/workspace sync (C354 Complete; C355 Pending)
  • Desktop ba8d73b WIP: auto-checkpoint on session end 20260601-160429
  • Node 99e1ad0 WIP: auto-checkpoint on session end 20260601-160429
  • SaaS db49551 chore: archive prior handover + completed contracts
  • SaaS a62dc4d docs: handover H090 — observability trio verified (C351 Complete; C350/C352/C353 verified live)
  • SaaS 9cd5614 docs: handover H089 — node observability trio (C351–C353); archive H088
  • Node e3c6fca feat(node): expose Qdrant dashboard on 127.0.0.1:6333 (C353)
  • Desktop 1018495 feat(desktop): live node status in Debug tab + Knowledge vector count (C352)
  • SaaS 161e9c9 feat(saas): /api/nodes/{node}/status via GetNodeStatus dispatch (C351)
  • Node 54a21c6 feat(node): GetNodeStatus RPC handler + Qdrant Health; remove dead statusapi (C351)
  • Proto 8fe3bff feat(proto): GetNodeStatus RPC + NodeStatusResponse (C351)

— 9 commits

  • SaaS 180cdde docs: handover H088 — workspace names fixed (C349, C350); archive H087
  • Node 2588bdd fix(node): persist derived workspace name to manifest so reconnect sync keeps it (C350)
  • Node 0e3c144 fix(node): accept UUID session files in ambient resolveSessionID (C349)
  • SaaS b7dbe36 docs: handover H087 — node dispatch timeout investigation (C347, C348); archive H086
  • Node b229dd8 fix(node): bound context assembly to dispatch deadline — fast error instead of hang (C348)
  • Node ffce30b fix(node): route dispatch results/thinking by task ID — kill activeStream cross-delivery race (C347)
  • SaaS 5a159aa docs: handover H086 — /updates WebSocket liveness (C346); archive H085
  • Desktop 1a92e63 feat(desktop): /updates watchdog reconnect + token-decoupled socket; saas: label (C346)
  • SaaS 823fb45 feat(saas): WebSocket keepalive + dead-conn reaping on /updates hub (C346)

— 18 commits

  • SaaS ec5a72c docs: handover H085 — remove legacy desktop rename UI (C345); archive H084
  • Desktop cb03dc3 feat(desktop): remove legacy workspace-rename UI — ambient cycle owns the name (C345)
  • SaaS 1d67c00 docs: handover H084 — per-turn intent-derive cut (C344); archive H083
  • Node 319afef feat(node): remove per-turn intent push + dead relay deriver plumbing (C344)
  • SaaS 4c89032 feat(saas): remove per-turn TriggerIntentDerive — ambient owns intent now (C344)
  • SaaS cc830ab docs: handover H083 — Stage 2 ambient intent design + C343 (node); archive H082
  • Node 19a19f7 feat(node): ambient intent rederive + observed-flag scheduler (C343)
  • SaaS e9c077a docs: handover H082 — chat window event-channel singleton fix (C342); archive H081
  • Desktop b98906f fix(desktop): event channel as module singleton — chat window crashed across WinBox roots (C342)
  • Desktop a13feef feat(desktop): live workspace_rename — update navigator + open window title (C341)
  • Node 8a13d7c feat(node): bootstrap intent on every turn while placeholder (drop first-turn gate) (C341)
  • SaaS 30f4a60 feat(saas): placeholder-gated intent update + live workspace_rename push; drop raw-query seed (C341)
  • SaaS faddf2e docs: handover H081 — Stage 3 event channel built+live (C339/C340); C341 written; archive H080
  • Desktop 0140c4a feat(desktop): single shared /updates event channel; consumers ride envelope (C339)
  • Node 685d032 feat(node): general EventPusher → /api/node/events; annotation rides envelope (C339)
  • SaaS c7d8dea feat(saas): typed event envelope + /api/node/events; migrate node_refresh/understanding/annotation (C339)
  • SaaS 6f9dd15 docs: handover H080 — workspace naming architecture + staged design; archive H079
  • SaaS a94cdb4 docs: handover H079 — C330 verified, C319 held, archive sweep

— 14 commits

  • SaaS c8905dc docs: handover H078 — C337 extracted-text chunking fix deployed
  • SaaS 8aa5f4f fix: strengthen image prompt full_text requirement (C337)
  • Node 8d7f868 fix: route extracted body events through slidingWindow (C337)
  • SaaS e6adfde chore: handover H077 — C336 mime-image fix shipped
  • Node 23e6f12 fix: pass source MIME to extraction ingest events (C336)
  • SaaS 64293b8 docs: H076 handover — C333+C334+C335 shipped; archive H075
  • Desktop f703fb6 fix: remove unsupported Office extensions from desktop upload allowlist (C335)
  • SaaS 8cfa73c fix: prepend analyst results to history so reasoner sees attachments (C334)
  • Node c5cd10d fix: deterministic eventID from file mtime+size prevents Qdrant duplication on re-extract/re-tag (C333)
  • SaaS ef792f8 docs: H075 handover — C331+C332 shipped; archive H074
  • Node 769ff58 fix: C332 per-dispatch result channel + Qdrant cleanup on file delete
  • Node d4fcc80 fix: C332 per-dispatch result channel + Qdrant cleanup on file delete
  • SaaS 56ab11a Fix relay task cross-delivery and Qdrant orphans on file deletion
  • SaaS d86be14 fix: C331 reject empty answer when node stream ends without complete

— 33 commits

  • SaaS 4b08568 fix: C329 remove old concurrent reaper + dispatcher cache health-check
  • SaaS 1b5af5a docs: H074 handover — C328 shipped; archive H073
  • SaaS 00390e4 fix: C328 heartbeat NotFound propagation + empty workspace guard
  • Node da482c9 fix: C328 relay disconnect cleanup (nil conn even on Close error)
  • SaaS c7543b1 docs: H073 handover — C326+C327 shipped, search-storm direct-fix, interaction-surface audit; archive H072
  • Node 0b267b3 fix: search agent no longer auto-fires on Start (direct fix, no contract)
  • Node 8e416d8 feat: node heartbeat self-heal on 10 consecutive failures (C326)
  • SaaS 44bb521 fix: nodepoller onConnect re-arms when ListWorkspaces fails (C327)
  • SaaS a8c61a8 docs: H072 handover — C322 + C320 shipped, C325 migration-023 hotfix; archive H071
  • SaaS f3cf447 fix: make migration 023 idempotent (C325, saas down → restored)
  • Node db03382 feat: log filter plumbing + ingest path (C320)
  • SaaS 2c84635 feat: log classifier filter plumbing (C320)
  • Node 7ae5bb9 fix: clean Qdrant on workspace delete + surface file origin in Knowledge tab (C322)
  • SaaS 59b9d03 docs: H071 handover — saas-is-cache redo shipped (C324); archive H070
  • Desktop f3ea913 revert: orphan workspace UI block (C324, supersedes C323)
  • Node 3079052 feat: remove WorkspaceClaimer + claimWorkspaces (C324)
  • SaaS 1c947fa feat: saas-is-cache node lifecycle (C324)
  • SaaS 20c7f6c docs: H070 handover — foundation attempts + saas-is-cache pivot; archive H069
  • Desktop 381701d feat: surface orphan workspaces in navigator with delete-only affordance (C323)
  • SaaS 9c4da29 fix: scope nodes prune to empty rows + log silent re-registration fall-through (C321)
  • SaaS 5b22de1 docs: H069 handover — hybrid-search design + foundation issues; archive H068
  • Node 8c1835e feat: merge classifier filters into Qdrant must clauses (C318)
  • SaaS 5ce4914 feat: classifier filter intent + dispatch plumbing (C318)
  • Proto bb40274 feat: FilterClause + InferenceTask.filters (C318)
  • SaaS b85c633 docs: H068 handover — ingest bug fixes (C315/C316/C317); archive H067
  • SaaS fdb1b60 fix: route text uploads through extraction path (C317)
  • Desktop 53e6a78 fix: surface upload error detail + trim Office formats from picker (C316)
  • SaaS a744d8a fix: pdfcpu nil-conf panic + clearer 415 message (C316)
  • SaaS 32b0712 fix: pdfcpu config-dir disable + drop Office upload support (C315)
  • SaaS dc8f9b6 docs: H067 handover — multi-part ingest redesign (C312/C313/C314); archive H066
  • Desktop ac9785f feat: per-part extraction rendering and schema rename (C314)
  • Node 42f8999 feat: multi-part sidecar + identity + body Qdrant ingest (C313)
  • SaaS 33daaf4 feat: batched multi-part extraction with full_text and renamed schema (C312)

— 3 commits

  • SaaS e60d8ba docs: H066 handover — C308 deploy + UI tidy + image-prompt split; archive H065
  • SaaS b3e4dab feat: image-specific extractor prompt with MIME routing (C311)
  • Desktop 5ba4bab feat: extracted-data as single inline list (C310)

— 42 commits

  • SaaS 7b8cbe0 docs: H065 handover — extraction shape redesign (C306/C307/C308); archive H064
  • Desktop 115cb74 feat: collapse fields + facts into unified extracted-data table (C308)
  • Node aa4eb94 feat: extraction record mirrors new flat attribute shape (C308)
  • SaaS e7c9beb feat: flat document_attributes + line_items extraction shape (C308)
  • SaaS 408797e feat: reorder extractor prompt + log finish_reason + parse-error diagnostics (C307)
  • Desktop 945504e feat: render extraction_notes + always-show fields block (C306)
  • SaaS ecf525c feat: extraction_notes diagnostic + drop response_format + empty-result handling (C306)
  • SaaS 584c68a docs: H064 handover — file ingest dispatch (C302/C303/C305); archive H063
  • SaaS 9e0efe1 fix: force JSON response_format + defensive fence-strip in Extract (C305)
  • Desktop 91876df feat: render content_type, extraction_status, fields in file detail (C303)
  • SaaS 1a4c07a feat: content_type catalogue + extraction record reshape + 32 MB cap + scaled timeout (C303)
  • Node e4bb700 feat: accept extraction.Record shape with status + fields (C303)
  • SaaS f742163 fix: plumb userID through multimodal Extract + Analyse (C302)
  • SaaS 0eed02b docs: H063 handover — file ingest content_type design; archive H062
  • SaaS dfe2bd6 docs: H062 handover — flatten workspace toolbar (C300 + C301); archive H061
  • Desktop 14ff6e2 fix: hide Resources heading in flattened workspace toolbar (C301)
  • Desktop b95e689 feat: flatten workspace toolbar — hoist Knowledge/Downloads/Uploads/Websearch (C300)
  • SaaS 782f0d0 docs: H061 handover — verify C297-C299; surface extraction defect + C300
  • SaaS 37ef055 docs: H060 handover — dead-mechanism cleanup; archive H059
  • Desktop d62e4de feat: delete orphan proto/varen bindings + FilesPanel + bufbuild dep (C299)
  • Node d0a8f25 feat: remove SendArtifact client + handler + tests (C298)
  • SaaS b68659a feat: remove SendArtifact handler and S6 ArtifactCache subsystem (C298)
  • Proto df253d1 feat: delete SendArtifact RPC and Artifact message (C298)
  • SaaS 72cd5a2 feat: remove note_topic_signal tool and TopicSignal plumbing (C297)
  • SaaS 231c5b9 docs: H059 handover — remove Templates from desktop UI; archive H058
  • Desktop 473cdad feat: remove Templates tab from desktop UI (C296)
  • SaaS cbf1be5 docs: H058 handover — per-node Settings window; archive H057 + H056-era contracts
  • Desktop b3aa08f feat: tinted workspace cards + clickable sessions in node settings
  • Desktop bb31ac8 feat: Workspaces / Sessions tab in node settings; drop in-workspace Sessions tab
  • SaaS e8a1eab feat: saas POST /api/workspaces/{workspace}/keep — flip ephemeral T→F
  • Desktop 9f40f90 feat: add Workspaces / Sessions tab to node settings (placeholder)
  • Desktop 8045b0d feat: per-node Profile tab no longer requires a workspace
  • SaaS be1d383 feat: saas /api/facts + /api/profile/process accept node_id routing
  • Desktop b493ad3 feat: move 'Search engine' nav entry into node settings Search Engine tab
  • Desktop 02f20aa feat: node settings window — Profile/Templates/Search Engine/Debug tabs
  • Desktop f1ffb2a feat: per-node settings cog button on expanded node row
  • SaaS 2a9954e docs: H057 handover — deploy H056 + navigator UX refresh; archive H056
  • Desktop d8944fe feat: rename navigator "Settings" button to "About / Help"
  • Desktop 54c1af3 feat: navigator — actions at top of each section, with consistent-width icons
  • Desktop f5c458f feat: move "Upgrade available" inside expanded node, above "+ New workspace"
  • Desktop e7fcf08 feat: replace node "↑" upgrade badge with "Upgrade available" text below row
  • Desktop 717b509 feat: navigator — visible "+ New workspace" / "+ New session" actions

— 53 commits

  • SaaS a9abadf docs: H056 handover — trainwreck recovery; archive H055; skeletonize 00_HANDOVER
  • SaaS 34f8411 chore: delete dead HandleFileRequest / FetchFile chain (C295)
  • Node 4e63beb chore: delete dead RequestArtifact client + handler (C295)
  • Proto d19c437 feat: delete RequestArtifact RPC + Artifact{Request,Response} (C295)
  • Node bf681ec chore: delete search.NewAgent + noopProvider dead code (C294)
  • Desktop e54932d chore: untrack desktop/dist_old/ and gitignore it (C293)
  • Node ebaaa30 test: restore green test suite — testConfig WG creds, NewContextAssembler signature, stub VPNIP, delete dead tests
  • SaaS 6e351e6 test: restore green test suite — Classify framingBias, Completer mock, NewContextAssembler signature, delete dead tests
  • Node f595188 fix: webfetch.Fetcher reads bgClient via getter (F5 Option B)
  • Node 4385d60 fix: loud-fail nil handlers and unknown origins in relay TaskService (F2)
  • Desktop 47c87e5 feat: remove transfer-approval scaffolding (F1 Option A)
  • Node fe16ccb feat: remove transfer-approval scaffolding + proto regen (F1 Option A)
  • SaaS 834d553 feat: remove transfer-approval handler + proto regen (F1 Option A)
  • Proto 37f22a0 feat: delete transfer-approval scaffolding (Option A)
  • SaaS ab16948 chore: also remove DOC-50.txt (companion to the deleted DOC-* corpus)
  • SaaS e9ffc3d chore: prune saas/docs/ to current handover only
  • SaaS 8c59d3d chore: archive prior handover + completed contracts
  • SaaS b546630 docs: 00_HANDOVER pointer → H055
  • SaaS 888a993 docs: H055 handover — C288 manifest.yaml deprecation drafted (unvalidated); session drifted from UI ask to data-model cleanup
  • SaaS 7b6d1a1 chore: archive prior handover + completed contracts
  • SaaS 890637e docs: H054 handover — C287 Settings window with About + Add Node tabs
  • Desktop 5e7a518 feat: Settings window with About + Add Node tabs; collapse bottom-actions row to Settings | Sign out (C287)
  • SaaS 37a27af chore: archive prior handover + completed contracts
  • SaaS ce8b65e docs: H053 handover — C285 typecheck fix, C286 empty-thread copy, C284 favicon
  • SaaS 1b64d1e docs: BRANDING.md — record favicon spec (C284)
  • Desktop 54aeb67 feat: add amber-V favicon to desktop SPA (C284)
  • Desktop 2a9f0a7 fix: generic empty-thread placeholder, drop workspace.intent interpolation (C286)
  • Desktop 2ff91c7 fix: WorkspaceWindow workspace.name → workspace.intent (C285)
  • SaaS a5451d1 chore: archive prior handover + completed contracts (delete half)
  • SaaS dbd049b chore: archive prior handover + completed contracts
  • SaaS 799cd9a docs: H052 handover — branding SVG removal + wordmark adoption (C283); C284/C285 drafted
  • SaaS 1736192 docs: add BRANDING.md — canonical wordmark + per-site palette audit (C283)
  • Desktop 26be195 fix: replace SVG logo with VAREN wordmark; drop varen-logo.svg (C283)
  • SaaS b291052 chore: archive prior handover + completed contracts
  • SaaS a2e78ac docs: H051 session handover — install hardening + ephemeral PATCH fix
  • SaaS 810ea67 fix: stop clearing workspace.ephemeral on intent PATCH (C279)
  • SaaS 389c2b9 fix: always rewrite .env on install; tolerant .env source in varen-upgrade (C282)
  • Desktop e9e5fa7 fix: quote nasEnv template literal (C281, C278 follow-up)
  • Desktop b363585 fix: quote NAS .env block and limit node-name input to 24 chars (C278)
  • SaaS d79be16 fix: quote .env values and clamp NODE_NAME to 24 chars (C278)
  • SaaS be643b7 docs: H050 — C276/C277 slug URL end-to-end + ephemeral-flag regression
  • Desktop c14c027 fix: wait for nodes to load before resolving pendingSearch (C277)
  • Desktop ea280bf fix: search engine install URL uses node slug, not raw id (C276)
  • SaaS 239f4f9 docs: H049 — append late-session workspace-orphan diagnosis and recovery plan
  • SaaS 018771e chore: archive 38 handover files as AH* (C275)
  • SaaS e53a144 docs: H049 — C274 complete, node slug stable external identifier
  • Desktop 6c143bb feat: resolve URL ?node= against node slug (C274)
  • SaaS 0ea38ca feat: per-user node slug for stable external identifiers (C274)
  • SaaS 3de8cc1 WIP: auto-checkpoint on session end 20260525-080120
  • SaaS a3eec43 docs: H048 — workspace sync cascade; C270-C273 executed, C274 pending
  • SaaS e1105c4 fix: nodepoller workspace upsert (name→intent) + aggressive timeout reaper (C273)
  • Node e574433 feat: claim workspaces from offline predecessor nodes on startup (C272)
  • SaaS 41ee833 feat: workspace claim endpoint + offline node reaper (C272)

— 19 commits

  • Desktop 4c76d03 feat: profile tab cleanup, knowledge tab display fields, ephemeral sweep fix (C271)
  • Node 1bb3d06 feat: propagate first session title to workspace label (C270)
  • SaaS fe08b84 docs: H047 — workspace naming redesign, C270+C271 pending
  • SaaS d340cad docs: H046 — C269 complete, migration hotfix, next: migration state tracking + C270
  • SaaS 32e5f4f fix: idempotent migration 021, fix Makefile env owner — hotfix post-C269
  • SaaS 5d671a6 WIP: auto-checkpoint on session end 20260524-130844
  • Desktop 8cc4056 feat: navigator cosmetic UX — dot red when stale, workspace naming, modal search/sweep (C269)
  • SaaS 219986a feat: drop 'New' from workspace default intent (C269)
  • SaaS 3369b45 docs: H045 — C268 complete, C269 pending
  • Desktop 1057faf feat: navigator [+] button, shift+click configure, search engine install, URL entrypoint (C268)
  • SaaS 85f5313 docs: H044 — C267 complete, C268 pending
  • Desktop ecf82c1 feat: workspace name → intent, auto-placeholder on create, ResourcesPanel sync (C267)
  • SaaS 60b8027 feat: rename workspace name → intent, auto-seed from first query (C267)
  • SaaS 4cc468f docs: H043 — C266 complete, C267–C268 pending
  • Desktop 6d94825 feat: ephemeral workspace flag + sweep UI (C266)
  • SaaS 32fdc15 feat: ephemeral workspaces — DB column, creation default, sweep API (C266)
  • SaaS a792aa5 docs: H042 — C265 executed with bug, C266–C268 pending
  • Desktop 393791c feat: swap RendererStub to CardsRenderer + ArticleRenderer (C265)
  • SaaS a80f45e docs: H041 — quick chat + workspace intent designed, C265–C268 written

— 14 commits

  • SaaS 64555b9 docs: H040 — renderer pipeline verified, C264 complete
  • Desktop be558a6 feat: renderer stubs for C262/C263 pipeline verification (C264)
  • SaaS 4131e5b docs: H039 — C263 complete, renderer pipeline deployed
  • Desktop d226381 feat: Cards + Article renderers, sticky toggle, remove framing/mode selectors (C263)
  • SaaS 180d7a3 docs: H038 — C262 complete, C263 pending
  • SaaS 86fe65b feat: classifier content_signal → AnswerFormat + DesktopRenderer pipeline (C262)
  • SaaS 6e6583c docs: H037 — classifier-driven rendering; C262+C263 written
  • SaaS 44ebbbf docs: H036 — framing architecture fix; C261 complete
  • SaaS f8ad729 feat: framing four-field architecture — ClassifierBias, AnswerBias, AnswerFormat, DesktopRenderer (C261)
  • SaaS 792fd31 docs: H035 — framing OutputFormat fix; C258/C259 complete
  • SaaS 9d2c0aa fix: framing OutputFormat replaces advisor format contract (C258)
  • SaaS 972b326 docs: H034 — note framing pipeline investigation needed
  • SaaS 34287bb docs: handover — H034 complete; deploy all (C257)
  • SaaS 7d512e2 docs: handover — H033 complete; C256 framing system execution

— 40 commits

  • Desktop 33c5eee feat: replace pinnedAdvisors with Framing selector; delete modes.ts (C256)
  • SaaS bd1f4bd feat: introduce FramingDef; replace pin/tools with 7-framing system (C256)
  • SaaS 6766006 docs: handover — H032 complete; C256 framing system design
  • SaaS 810c5af docs: handover — H031 complete; docs factual claim checking
  • SaaS fa18558 docs: handover — H030 complete; C255 desktop Docs/Help nav
  • Desktop 1f3c9d9 feat: replace Help button with Docs link; Help placeholder for C256 (C255)
  • SaaS 12fa40e docs: handover — H029 complete; C254 docs.varen.au live
  • SaaS fe826b2 docs: handover — H028 complete; C254 docs site + C255 desktop nav written
  • SaaS 1fad151 docs: handover — H027 complete; C252 LiteLLM deploy + C253 text-native ingest
  • Node 8b8756d feat: embed text-native files on upload (C253)
  • SaaS 7879704 docs: handover — H026 complete; ambient research + insight status review
  • SaaS 5c3a0c9 docs: handover — H025 complete; C251 profile routing fix
  • Desktop 4b48482 fix: pass workspace_id in profile API calls (C251)
  • SaaS 444e921 fix: route profile API calls via workspace node (C251)
  • SaaS b3fecf7 docs: handover — H024 complete; C249 profile tab + C250 intent derivation
  • Desktop 876be4e feat: profile tab reorder + single save (C249)
  • Node d9608f8 feat: workspace intent from session summaries + recent Qdrant (C250)
  • SaaS 4dd22ad docs: handover — H023 complete; C246-C248 verified
  • SaaS eb735e4 docs: handover — H022 complete; C246-C248 title sync
  • Desktop b455148 feat: sync navigator session preview via custom event (C248)
  • SaaS 78f13e8 docs: handover — H021 complete; C246 rename + C247 title fix
  • Desktop d49755b fix: WinBox title includes session description; rename updates title correctly (C247)
  • SaaS d09d232 docs: handover — H020 complete; C246 workspace rename and dynamic title
  • Desktop babed28 feat: workspace rename in navigator and dynamic document.title (C246)
  • SaaS a58e652 docs: handover — H019 complete; C245 Add Node side-by-side layout
  • Desktop f957e54 feat: side-by-side script/manual layout on Add Node management sections (C245)
  • SaaS 89d8c1c docs: handover — H018 complete; C244 publish version+sha256 files
  • Node 2fb3641 feat: write version and sha256 files on docker-publish (C244)
  • SaaS 27c3160 docs: handover — H017 complete; C243 node outdated indicator
  • Desktop 69d6a67 feat: show update badge on node rows when version behind latest (C243)
  • SaaS e7fe95e docs: handover — H016 complete; C242 varen-upgrade self-sufficient
  • SaaS 2222a13 feat: varen-upgrade re-runs full installer from .env (C242)
  • SaaS d1e0dd5 docs: handover — H015 complete; C241 idempotent node installer
  • SaaS d7ce3e3 feat: idempotent node installer — re-run updates helpers in-place (C241)
  • SaaS 2ccbfe5 docs: handover — H014 complete; C240 node-disconnect fix
  • SaaS 04d8913 fix: mark node offline on WG disconnect instead of deleting (C240)
  • SaaS dd85f69 docs: handover — H013 complete; C239 Add Node management UI expansion
  • Desktop 2272f8a feat: expand Add Node management sections with per-operation scripts (C239)
  • SaaS 7e2f7e6 feat: add varen-uninstall helper to node installer scripts (C239)
  • SaaS 232936a feat: REINSTALL_HELPERS mode for node installer scripts (C238)

— 16 commits

  • SaaS 3f2452f docs: handover — H012 complete; C237 shopping link fix
  • SaaS dd56b25 fix: include URL in search result context sent to model (C237)
  • SaaS 02237fb fix: pass full query to inference task for single-question turns (C236)
  • SaaS c8b8ed3 C234: create H011 handover; restructure 00_HANDOVER to pointer + archive
  • SaaS a25ccf7 C235: add Status lines to all DOC files — stale/active/implemented classifications
  • SaaS cced0cc docs: handover — session 10 complete; C226-C232 table added, stale watchdog refs cleaned
  • SaaS 2754c3c docs: handover — C232 complete; watchdog fully deprecated, /downloads/ cleaned
  • Node 3cfeb36 chore: remove watchdog source and Makefile targets; repurpose deploy as build-linux (C232)
  • Node a2a89b9 WIP: auto-checkpoint on session end 20260521-072910
  • SaaS 5c1e96d docs: handover — clean up stale setup.sh reference; update install procedure for Docker
  • SaaS d20473b docs: handover — C231 complete; webfetch OLLAMA_URL wired, Knowledge facts now populate
  • Node b39fc0c fix: wire OLLAMA_URL into webfetch embedder via SetOllamaURL (C231)
  • SaaS 4b09cca docs: handover — C229+C230 complete; nodes deleted from DB on disconnect
  • SaaS 64c28df fix: delete node record on disconnect instead of marking offline (C230)
  • SaaS 09f1561 fix: filter disconnected nodes from /api/nodes — offline nodes disappear from Navigator (C229)
  • SaaS 57b2403 docs: handover — C228 complete; caddy cache-control, warnings cleared, fmt applied

— 51 commits

  • SaaS 0446cf7 docs: handover — C227 complete; node_id persist fix, dead-node reaping, startup log clarity
  • SaaS 060ef4b fix: nodeState respects online=false — nodes deregister immediately in Navigator (C227)
  • Node 88dd4a2 fix: persist node_id from RegistrationAck into cfg; add name to startup log (C227)
  • SaaS 9970e53 docs: handover — C226 complete; docker-stack merged to master across node, saas, desktop
  • Desktop feac304 Merge docker-stack: Docker stack initiative (C219–C225) (C226)
  • SaaS 9f17fca Merge docker-stack: Docker stack initiative (C206–C225) + legacy script removal (C226)
  • SaaS 43156f1 chore: remove legacy watchdog installer scripts (C226)
  • Node f79cb07 Merge docker-stack: Docker stack initiative (C206–C225) + gitignore fix (C226)
  • Node a3c1981 chore: untrack varen-node build artifact; add to .gitignore (C226)
  • SaaS afcd609 docs: handover — docker-stack initiative complete; remaining work scoped
  • SaaS d677437 docs: handover — C225 popout window replaces @media print
  • Desktop c3dedc4 feat: Add Node uses popout window for print (replaces @media print) (C225)
  • SaaS 0cad654 docs: handover — C224 fixes print offset + per-platform uninstall
  • Desktop d69ad32 fix: print uses full page width; add Uninstall per platform (C224)
  • SaaS fd16e14 docs: handover — C223 fixes print + button styling
  • Desktop e31f173 fix: Add Node primary buttons + correct print scope (C223)
  • SaaS c6428a4 docs: handover — C222 fixes openAddNode scope bug
  • Desktop 94631f5 fix: pass openAddNode to Navigator as onOpenAddNode prop (C222)
  • SaaS 223a8c5 docs: handover — C221 complete; docker-stack initiative ready for final validation
  • Desktop 2a3dd90 feat: Add Node page (WinBox window, three platforms, printable) (C221)
  • SaaS 13234fb docs: handover — C220 complete; env-var install + helpers live
  • Desktop 6a0a03a feat: AddNodeModal produces env-var install commands (C220)
  • SaaS 2961ac6 feat: env-var install pattern + helper scripts (C220)
  • SaaS a491574 docs: handover — C219 complete; docker-stack initiative ready for testing
  • Desktop 8ecb8e3 feat: Add Node modal — collects license + node name, generates install command (C219)
  • SaaS 4e0ae0e docs: handover — C218 complete; both OS install scripts live
  • SaaS 7ffd0ff feat: Windows PowerShell Docker-stack install script (C218)
  • SaaS d218f8a docs: handover — C217 complete; Linux install path testable
  • SaaS 0238dc3 feat: Linux Docker-stack install script (C217)
  • SaaS 803c359 docs: handover — log empty node_id + name-in-startup-log follow-ups
  • SaaS 572ed3f docs: handover — log Caddy /downloads cache follow-up
  • SaaS 7ec1333 docs: handover — C216 complete; NODE_NAME now reaches container
  • Node 671f83d fix: compose passes NODE_NAME through to varen-node (C216)
  • SaaS dacd49e docs: handover — C215 complete; NODE_NAME env supported
  • Node 7011095 feat: separate node display name from profile name; NODE_NAME env (C215)
  • SaaS 0537bea docs: handover — C214 complete; multi-arch fix for amd64 tenants
  • Node 8abda4b feat: multi-arch image build (linux/amd64+arm64) via buildx (C214)
  • SaaS 794822d docs: handover — C213 complete; tenant compose live-served
  • Node c56e0bb feat: tenant compose template — registry image + model pre-pull init (C213)
  • SaaS 4fe41bf docs: handover — C212 complete; self-hosted registry live
  • Node 45935b9 feat: add docker-publish target for self-hosted registry (C212)
  • SaaS 64c2c7c docs: handover — C211 complete; caddy now a managed component
  • SaaS aabc15d docs: handover — session 9 (node positioning); C210 complete; three deployment tiers established
  • Node 29037f4 refactor: remove Qdrant Docker management — QDRANT_URL now required (C207)
  • SaaS 578b189 docs: handover — session 9 (node positioning); C210 complete; three deployment tiers established
  • SaaS 09507fe docs: handover — C206 complete; Opus review notes captured
  • Node b011976 feat: add Docker Compose stack — Dockerfile, compose, .env.example (C206)
  • Node 36019a8 WIP: auto-checkpoint on session end 20260520-084419
  • SaaS e02fae4 docs: handover — session 9 continued; Docker stack initiative, C206-C207 written
  • SaaS 7095492 docs: handover — session 9 end; C204 dispatched and complete
  • SaaS aa9e192 feat: expand advisor library — 18 advisors + weather tool (C204)

— 62 commits

  • SaaS 2c0b785 docs: handover — session 8 end; advisor expansion contracted (C204 pending), varen.au marketing site live (C205)
  • SaaS 0d97fea docs: handover — session 7 end; installer operational, domain renamed to varen.tech
  • Node 6800f6d chore: rename domain varen.maltby.id.au → varen.tech (C203)
  • SaaS 9fbd185 chore: rename domain varen.maltby.id.au → varen.tech (C203)
  • SaaS df44c78 docs: handover — session 6 end; installer operational, known issues deferred
  • SaaS b674150 fix: start Docker and Ollama before watchdog in WSL (C202)
  • SaaS 63e5fc9 feat: Windows autostart + background launch; skip blocking prompts in WSL (C201)
  • SaaS 1aaccac fix: silent dep auto-install, Docker WSL via apt, Ollama zstd (C200)
  • SaaS 9f05bee fix: skip Ubuntu user setup, run installer as root (C199)
  • SaaS b0b66d6 fix: ps1 end-to-end novice flow — no dead-end, plain language (C198)
  • SaaS 9129c95 fix: ASCII art (pure ASCII), ps1 window-close fix (C197)
  • SaaS 9b1c8a8 fix: installer banner (new Varen art) and WSL crash fix (C196)
  • SaaS 59e6dc3 docs: handover — session 5 end; installer still broken, flagged for next session
  • SaaS b0badd8 docs: handover — C195 complete; WSL bootstrap + full dep auto-install
  • SaaS f76ec67 feat: PS1 WSL bootstrapper; install.sh auto-installs all deps (C195)
  • SaaS 391391b docs: handover — C194 complete; all installers fixed and deployed
  • SaaS 0771085 fix: installer tty prompts, banner, deps check, install/uninstall menu (C194)
  • SaaS 9302f17 fix: reopen stdin from /dev/tty so prompts work under curl | sh (C191)
  • SaaS 17d2382 fix: uninstall removes bin/ only — preserve workspace data (C191)
  • SaaS 1ead698 docs: handover — C191 complete; all three contracts deployed
  • SaaS b147b90 feat: add end-user install.sh and install.ps1 installers (C191)
  • SaaS 8f21b90 docs: handover — C192 + C193 complete and deployed
  • Desktop 3f36265 feat: toolbar tabs left; remove Understanding tab (C192)
  • SaaS 5958643 docs: handover — C192 reverted; C193 deployed
  • Desktop d3f424f Revert "feat: nav tabs left + FlowChart left; remove Understanding (C192)"
  • SaaS bf28472 docs: handover — C192+C193 deployed; C191 pending
  • Desktop c0e0852 feat: nav tabs left + FlowChart left; remove Understanding (C192)
  • Node 6e3a059 fix: session summary prompt → short title phrase (C193)
  • SaaS cff72e4 docs: handover — session end; C186–C190 deployed; open follow-ups recorded
  • Node ade357a refactor(node): thread context.Context through QdrantClient interface (C190)
  • SaaS 1f67d5e security: remove legacy /api/files/ handler — dead code, auth gap (C189)
  • Desktop 5982d77 feat(desktop): source URL + referrer links in file properties panel (C188)
  • Node 9ecc4e4 feat(node): write facts to research sidecar after extraction (C188)
  • Desktop c7dac6e fix(desktop): resources panel tab-row scrollbar + reorder tabs (C187)
  • Desktop c860529 fix(desktop): sanitise marked output with DOMPurify (C186 — XSS [High])
  • SaaS 9fab61f docs: handover — session end; C178–C185 deployed; open follow-ups recorded
  • SaaS 4766d88 docs: update handover — C178–C185 complete; DOC-52 nav tree design session
  • SaaS 06bfd07 docs: add DOC-52 navigation tree design brief
  • Desktop c8c82f2 feat: send attachment names with turn for inline vision analysis (C185)
  • Node 4d754d3 feat: UpdateAnalystSidecar handler (C185)
  • Node 50d98eb chore: regenerate proto gen for C185
  • SaaS 8e6e29c feat: analyst call in inference handler; UpdateAnalystSidecar dispatcher (C185)
  • SaaS f033492 chore: regenerate proto gen for C185
  • Proto 688a287 feat: attachment_names on turn; UpdateAnalystSidecar RPC (C185)
  • SaaS 294c31e feat: ephemeral query param on file upload endpoint (C184)
  • Desktop 6270eb1 feat: paste and drag-and-drop ephemeral file upload in chat input (C184)
  • Desktop 2d91fee feat: resources panel two-column redesign with properties panel, tags, multiselect (C183)
  • SaaS de98e39 feat: PatchFileSidecar + TidyEphemeral endpoints; extended FileEntry via dispatcher (C182)
  • Node 78d794c feat: extend ListFiles with full sidecar data; add PatchFileSidecar + TidyEphemeral handlers (C182)
  • SaaS b64f584 chore: regenerate proto gen for C182
  • Node 08e4046 chore: regenerate proto gen for C182
  • Proto 9388753 feat: extend FileEntry; add PatchFileSidecar + TidyEphemeral RPCs (C182)
  • SaaS 1b35772 fix: Extract method endpoint path /chat/completions → /v1/chat/completions (C181)
  • SaaS 169d14d feat: multimodal Extract on litellm.Client; async extraction pipeline on upload (C181)
  • SaaS 9f8278d chore: regenerate proto gen for C181
  • Node 12ff203 feat: UpdateFileSidecar handler + ephemeral flag in UploadFile (C181)
  • Node f74707b chore: regenerate proto gen for C181
  • Proto 10d119c feat: UpdateFileSidecar RPC; ephemeral field on UploadFileRequest (C181)
  • Node 9a68985 feat: extend sidecar schema; fix MIME-based binary detection; generate ref_id on upload (C180)
  • Desktop b76aeeb feat: restrict file input to accepted upload formats (C179)
  • SaaS d9c1489 feat: file upload format allowlist — reject unknown extensions (C179)
  • SaaS 3bcaeb0 docs: handover — session end; C178–C185 file handling contracts written (design session)

— 30 commits

  • SaaS edb021b docs: handover — session end; C166/C167/C176/C177 executed
  • Desktop 9e92d73 fix: remove obsolete Settings section from help panel (C177)
  • Desktop a446199 fix: help panel style — ws-tab-btn TOC, strip bespoke typography CSS (C176)
  • SaaS dd742f8 docs: security review report (C166)
  • SaaS 366657a fix: security review findings (C166)
  • Desktop 0c8cd16 feat: Help panel — comprehensive user guide in navigator (C167)
  • SaaS 0efcad5 docs: handover — session end; C160–C175 executed, C166/C167 pending
  • SaaS 5ca9195 feat: inference markup 4% + track saas.env in source tree + deploy copy (C175)
  • Desktop e8fb86a fix: knowledge tab jump links styled as origin badges
  • Desktop 313a1aa fix: resources drawer — tab scrollbar, one-line facts, jump link contrast
  • SaaS 5629d51 feat: always trigger intent derivation after every successful inference turn (C173)
  • Desktop c4fc661 fix: use apiFetch for workspace intent fetch in WorkspaceWindow (C171)
  • SaaS 3064082 feat: GET /api/workspaces/{workspace}/intent — derived intent endpoint (C171)
  • SaaS 386003b feat: intent divergence check in classifier + divergence_warning SSE event
  • Desktop 54d1f39 feat: intent divergence warning panel integrated into classification
  • Node b2628b6 feat: session summary — LLM description replaces last-message preview
  • Node e9ab887 feat: dedup memory (stated) facts — newer replaces semantically similar older
  • Desktop 7bdd45e fix: knowledge tab scrollbar — ws-facts-list flex+overflow, ws-drawer-generic flex in resources
  • Desktop 803a0a2 feat: knowledge tab grouped by origin with jump links
  • Node 47f8c10 feat: profile reprocess clears and replaces existing facts, broadens extraction
  • Desktop ded85f6 feat: immediate 401 logout via apiFetch + visibilitychange ping on tab resume
  • Desktop 01fa674 feat: mute billing nav block + auto-refresh account balance on turn and poll
  • SaaS 0c3b916 docs: handover — session end; C160–C169 contracts written
  • SaaS 274baa3 docs: handover — session end; C160–C164, C166–C169 contracts written
  • SaaS 02f81da docs: handover — session end; C160–C164, C166–C167 contracts written
  • SaaS c7d81cf docs: handover — session end; C152–C159 complete (billing infrastructure)
  • SaaS f8fd371 feat: store remote_model in usage_events (migration 019)
  • SaaS a228c09 fix: carry UserID into enriched InferenceTask for billing attribution
  • SaaS 6deaaf3 refactor: route all LiteLLM calls through shared client — remove classifier raw HTTP client
  • SaaS 8244dd1 fix: pass userID through classifier to LiteLLM user field for billing attribution

— 33 commits

  • SaaS 6f53b9d fix: litellm callback uses end_user and top-level token fields (StandardLoggingPayload)
  • SaaS a4b86e2 feat: varen-admin billing commands, version, saas.env config (C158)
  • Desktop dafa81e feat: live account balance and ledger data in nav and account window (C157)
  • SaaS ef6adfe feat: account balance, ledger, and payment recording endpoints (C156)
  • SaaS f420b52 feat: subscription auto-charge and credit access gate (C155)
  • SaaS a047fd6 feat: daily FX rate pull from Frankfurter API (C154)
  • Desktop 5426bb9 fix: account window sizes to canvas, responds to nav resize
  • Desktop 908fca7 fix: account window uses ws-window chrome; nav-account uses design tokens
  • SaaS 67dabf7 feat: billing infrastructure — migrations, LiteLLM user field, usage callback (C153)
  • Desktop e48fd15 feat: account nav block and static ledger window (C152)
  • SaaS 88c95b2 docs: handover — session end; C142-C151 complete; session map noted for future
  • SaaS e89255b docs: handover — C151 complete (profile statement Qdrant-backed, localStorage removed)
  • Desktop 0064c66 feat(desktop): load profile statement from _node Qdrant; remove localStorage (C151)
  • Node 3d996d2 feat(node): store profile statement as slot=profile_statement in _node Qdrant (C151)
  • SaaS c91743a docs: handover — session end; C142-C150 complete (profile system functional)
  • Desktop cc944ef fix(desktop): persist profile statement in localStorage (C150)
  • SaaS dc4a064 docs: handover — C149 complete (fix profile origin in listNodeFacts)
  • Node 23be1d1 fix(node): add origin=profile to node-level ListFacts/UpdateFact/DeleteFact (C149)
  • SaaS 1538035 docs: handover — session end; C142-C148 complete
  • Desktop 6f752fa fix(desktop): Profile tab layout/CSS + workspace rename propagation (C148)
  • SaaS 8b059d7 feat(saas): PATCH /api/workspaces/{ws}/name — update name in DB (C148)
  • SaaS 797ee70 docs: handover — session end; C146+C147 complete (profile statement API + Profile tab redesign)
  • Desktop 8e8b2b9 feat(desktop): Profile tab redesign + workspace creation flow — C147
  • SaaS c2e8058 feat(saas): add /api/profile/process endpoint (C146)
  • Node c30dcdc feat(node): remove NodeAboutMeSlots; add ProcessProfileStatement (C146)
  • Node d5e9613 chore(node): regen proto for ProcessProfileStatement (C146)
  • SaaS b5fa071 chore(saas): regen proto for ProcessProfileStatement (C146)
  • Proto 80b00a5 feat(proto): add ProcessProfileStatement RPC (C146)
  • SaaS ce2d8db docs: handover — session end; C142-C145 complete (Resources/Knowledge/Profile restructure)
  • Desktop 2e989fc feat(desktop): Resources/Knowledge/Profile restructure — C145
  • Desktop de4c8b6 feat(desktop): remove Research drawer + JSONL endpoint dependency (C144)
  • SaaS 929cabb feat(saas): remove /research endpoint and ListResearchArtifacts (C144)
  • Node c921660 feat(node): enrich sidecar title/excerpt/query; remove research JSONL (C144)

— 35 commits

  • SaaS 647c561 docs: handover — session end; DOC-24 Phase 3 complete (C142+C143), Files drawer deployed-unverified
  • Desktop 161333a feat(desktop): Files drawer — folder tabs, list, delete, upload (DOC-24 Phase 3 — C143)
  • SaaS eb06c7c feat(saas): Files API — NodeDispatcher + HTTP endpoints (DOC-24 Phase 3 — C142)
  • Node a3cbca3 feat(node): Files API handlers — list, delete, upload, serve (DOC-24 Phase 3 — C142)
  • Node 7262350 chore(node): regen proto for DOC-24 Phase 3 Files API (C142)
  • SaaS e6bcd04 chore(saas): regen proto for DOC-24 Phase 3 Files API (C142)
  • Proto ac8eb46 feat(proto): add Files API messages + RPCs (DOC-24 Phase 3 — C142)
  • SaaS 0f3b0bb docs: handover — session end; ambient search confirmed working, C141 complete
  • Node 34d0dbc fix(node): lower T1 search warmth gate to 0.2 (C141)
  • SaaS 0ce2c4d docs: handover — session end; DOC-24 pipeline unblocked, next: Phase 3 files drawer
  • SaaS 43d8acb docs: handover — C138+C139+C140 complete (DOC-24 unblock + ambient search redesign)
  • Node 8dfdc8b feat(node): ambient search per-pass query generation (C140)
  • Node 3ebb604 refactor(node): Qdrant-only intent — remove intent.yaml (C139)
  • Node d0a5c2d fix(node): default saasSearchEndpoint to saasHTTPEndpoint (C138)
  • SaaS 2594e81 docs: handover — session end; two DOC-24 blockers recorded (search endpoint + intent)
  • SaaS 757e8e1 docs: handover — C136+C137 complete (diagnostic logging + search agent in Daily template)
  • Node 9ebb9ce feat(node): add search agent to Daily template + boot migration (C137)
  • SaaS 6078dd8 docs: handover — C135+C136 complete (supervisor wiring + diagnostic logging)
  • Node 42f6c25 chore(node): diagnostic logging for search→fetch pipeline (C136)
  • SaaS 0878ea8 docs: handover — C134+C135 complete (defaultOrigins fix + supervisor→FetchSink wiring)
  • Node 17aa239 fix(node): wire supervisor.Emit → researchSink for search agent events (C135)
  • Node c8252d8 fix(node): add research to defaultOrigins so Facts tab surfaces extracted facts (C134)
  • SaaS 4ab0bee docs: handover — C133 complete (DOC-24 Phase 2 — extraction pipeline)
  • Node 533e149 feat(node): DOC-24 Phase 2 — LLM extraction pipeline for webfetch (C133)
  • SaaS 133366b docs: handover — C132 complete (DOC-24 Phase 1b — webfetch disk persistence)
  • Node e1ae035 feat(node): DOC-24 Phase 1b — webfetch disk persistence to files/Research/ (C132)
  • SaaS a91236e docs: handover — C131 complete (fix node deploy sidecar ownership)
  • Node abcb75b chore(node): chmod a+rw deploy sidecars so non-root deploys can overwrite (C131)
  • SaaS 491031b docs: handover — C130 complete (DOC-24 Phase 1a — workspace files/ layout)
  • Node 886c9db feat(node): DOC-24 Phase 1a — workspace files/ folder layout (C130)
  • SaaS 9fe704b docs: handover — C128 + C129 complete (C124 deployed; C122/C123/C124 verified)
  • SaaS 9180e9d fix(saas): handleDeleteFact — add ErrFactReadOnly → 403 (C122 omission, C129)
  • SaaS b298dbb docs: handover — C125 + C126 + C127 complete (saas WIP cleanup + root cause fix)
  • Node 81e94fc chore(node): gitignore bin/; stop tracking bin/varen-node and bin/varen-watchdog-linux-amd64
  • SaaS 0845eaa chore(saas): gitignore bin/; stop tracking bin/varen-saas

— 31 commits

  • SaaS 89ad70f feat(saas): GET/PATCH/DELETE /api/facts (node-level) — DOC-23 Phase E (C124)
  • Node b66e01c feat(node): _node collection + about_me + context_note (read/write + dual-write) — DOC-23 Phase E (C124)
  • SaaS 9f59806 docs: handover — C121/C121a/C122/C123 Complete; C124 Pending
  • Desktop d54ec48 feat(desktop): render profile + derived facts in panel — DOC-23 Phase C+D (C123)
  • Node e0c7651 feat(node): workspace profile+derived seeded into Qdrant; dual-write on rename/intent — DOC-23 Phase C+D (C123)
  • SaaS 3676001 feat(saas): pass slot through ListFacts; correct DOC-23 §4 for derived-intent slot — Phase C+D (C123)
  • Proto 5293c53 feat(proto): add slot + scope on Fact, slot filter on ListFacts — DOC-23 Phase C+D (C123)
  • Desktop 2b88571 feat(desktop): inline edit + delete on Facts panel — DOC-23 Phase B (C122)
  • SaaS 564ee67 feat(saas): PATCH/DELETE /api/workspaces/{ws}/facts — DOC-23 Phase B (C122)
  • Node b585ce5 feat(node): UpdateFact + DeleteFact + per-origin policy — DOC-23 Phase B (C122)
  • Proto 8a0d506 feat(proto): add UpdateFact + DeleteFact RPCs — DOC-23 Phase B (C122)
  • Node 53bc4e0 fix(node): persist chunk text in payload["content"] — C121a remediation
  • Desktop dfa5682 feat(desktop): minimal Facts panel — DOC-23 Phase A (C121)
  • Node 711f3a5 feat(node): ListFacts RPC + Qdrant scroll — DOC-23 Phase A (C121)
  • SaaS bb003da feat(saas): GET /api/workspaces/{ws}/facts — DOC-23 Phase A read (C121)
  • Proto 91c6d6e feat(proto): add ListFacts RPC for DOC-23 Phase A (C121)
  • SaaS e5ebf04 docs: handover — C119 + C120 complete; DOC-23 v2 locked, DOC-24 created
  • SaaS 975ed84 docs: add DOC-24 — files architecture (proposed)
  • SaaS 327bf95 docs: rewrite DOC-23 v2 — unified facts architecture (locked)
  • SaaS 65dba1c docs: handover — DOC-23 review complete; C119 + C120 pending
  • SaaS b14adf8 docs: handover — 2026-05-15 late evening (C115 verified, webfetch design gap + DOC-23 captures)
  • SaaS 2eaae48 docs: handover — 2026-05-15 evening session (C114–C118 all complete)
  • SaaS c914c37 docs: add DOC-23 — unified facts architecture (proposed)
  • Node 4e24a2d feat(node): persist remember tags in Qdrant payload (C116)
  • SaaS 6de0f67 feat(saas): force_web_search tool + remember tags (C116)
  • Proto b9beefe feat(proto): add tags field to MemoryRecord (C116)
  • Desktop 3acd6ba fix(research): hide date for records with non-positive fetched_at (C115)
  • Node 3a977d5 fix(research): set OccurredAt/IngestedAt on SaaS-relayed search hits (C115)
  • Desktop 877e5ca feat(desktop): handle 200/token response from auth/ping (C114)
  • SaaS 847b350 feat(saas): refresh-on-ping sliding access-token expiry (C114)
  • SaaS d12df7c docs: handover — 2026-05-15 contracting session (C114, C115, C116, C117)

— 6 commits

  • SaaS 8edf0b5 docs: handover — C112 + C113 complete (2026-05-14 morning)
  • Desktop 34591d4 feat(desktop): auth keepalive bounces to login on failure (C113)
  • SaaS 59f30e8 feat(saas): /api/auth/ping endpoint for desktop keepalive (C113)
  • Desktop 3f93084 fix(desktop): align version string with C96 single-token format (C112)
  • SaaS 1b55bee docs: handover — refresh contracts repo HEAD reference (f44d848)
  • SaaS 55b2720 docs: handover — C112 + C113 pending; document C114 + C115 for future

— 30 commits

  • SaaS 3b63afd docs: handover update — C106 complete, C105 on hold (2026-05-13 evening)
  • Node c7caf7e refactor(node): delete clipboard/syslog/telegram agent packages (C106)
  • Node 5268ee3 WIP: auto-checkpoint on session end 20260513-212549
  • SaaS 05c368c docs: handover update — C104 complete (2026-05-13 evening)
  • Node 189a45f feat(node): analytical agent + meta-prompt + insights.yaml (C104)
  • SaaS 7610552 docs: handover update — C100-C103, C108-C111 complete (2026-05-13 evening)
  • SaaS cb4172f fix(saas): /api/version reads node sidecars per request (C111)
  • Node 32fcf73 feat(node): TriggerIntentDerive handler + search agent warmth gate (C103)
  • SaaS 887fce3 feat(saas): note_topic_signal tool + intent-derive dispatch + provisioning template (C103)
  • Proto 53e27e1 feat(proto): add TriggerIntentDerive RPC to TaskService (C103)
  • Node 4da1c81 feat(node): StorePersonalNote handler + ContextNotes context injection (C102)
  • SaaS 192f0d3 feat(saas): remember tool scope field + node-fact routing (C102)
  • Proto 2936974 feat(proto): add StorePersonalNote RPC to TaskService (C102)
  • Proto f0be89e feat(proto): AnnotationRecord + GetAnnotations/UpdateAnnotation RPCs (C101)
  • Desktop 437ca20 feat(desktop): AnnotationBreak component + session annotation rendering (C101)
  • SaaS da6516e feat(saas): annotation push/get/update endpoints + hub delivery (C101)
  • Node 40cd276 feat(node): AnnotationRecord type + JSONL helpers (C101)
  • SaaS 6784885 fix(saas): lift http.Server WriteTimeout 60s → 300s for SSE inference (C110)
  • Desktop a8de849 fix(desktop): trunk-level edit produces a revision sibling, not a new turn (C109)
  • SaaS f695019 fix(litellm): ctx-aware Stream + diagnostic logging (C108)
  • SaaS d140ea1 docs: edit-resend bug investigation handover (pre-C108/C109)
  • Node 3785667 feat(node): BackgroundInferenceClient + IntentDeriver relay wiring (C100)
  • SaaS 4713ba2 feat(saas): POST /api/inference/background endpoint for node ambient inference (C100)
  • SaaS 9451841 docs: handover — C107 complete + verified; edit-resend bug logged
  • Desktop 9eb042a C107: drop json+summarise pickers; rename skill→pinnedAdvisor
  • SaaS d565dc8 C107: collapse skills into advisors; pinned-primary routing
  • SaaS 58ef989 docs: handover — C100-C106 contracts written; update next actions
  • SaaS 7830096 docs: handover — C99 complete; C100 is next
  • SaaS 7f64f2a docs: design consolidation — warming stages, annotations, file agent, N19, single-manifest principle (C99)
  • SaaS da23ad0 docs: handover — design session 2026-05-13; C99 pending

— 23 commits

  • SaaS bfbd1a8 docs: handover — C98 complete; setup.sh one-liner installer
  • SaaS 1b78dca feat(saas): add setup.sh one-liner installer for varen-watchdog (C98)
  • SaaS 6b7037c docs: handover — C95+C96+C14+C97 complete; watchdog supervisor + version scheme + prod hostname; session close
  • SaaS 180838b feat(saas): PUBLIC_HOSTNAME env var threads through CreateRemote; drop dev hostname (C97)
  • Node 413b52f fix(node): watchdog falls back to Caddy-fronted base URL (no :9000); add publish-watchdog target (C97)
  • Node f3e4bb0 feat(node): varen-watchdog supervisor — download, run, monitor, SHA-verified update via SIGTERM (C14)
  • Desktop 15d7a8c feat(desktop): About modal renders single-token node version (C96)
  • SaaS 0761f79 feat(saas): publish node_sha256 in /api/version; single-token version scheme (C96)
  • Node fd1d659 build(node): version 6.YYMMDD.HHMMSS; deploy writes .version + .sha256 sidecars (C96)
  • Node 5310aed fix(node): fail-fast on Qdrant readiness timeout; pin qdrant:v1.17.1 (C95)
  • SaaS 1882680 docs: handover — C94 complete; session close
  • Desktop 4947ea8 feat(desktop): workspace click opens window; nav sessions are direct links (C94)
  • SaaS 28e7057 docs: handover — C91/C92/C93 complete; session close
  • Node 74088ec fix(webfetch): reduce chunk target to 200 words; cap embed input at 1500 chars (C93)
  • SaaS 4658e92 docs: handover — C92 complete and deployed; C91 confirmed working
  • SaaS 60e597c fix(router): use classifier SearchContext as SearXNG query; fall back to q.Text (C92)
  • SaaS 1302eb5 docs: handover — C91 deployed; functional verification pending
  • Node b94a18e WIP: auto-checkpoint on session end 20260512-004826
  • SaaS 4714952 docs: handover — C91 complete; on-demand web search pipeline live; C14 only pending
  • Node 5c17e6f feat(node): receive forwarded SaaS search results via RecordAnswer, store via FetchSink; remove LowConfidence on-demand search gate (C91)
  • SaaS bfddec5 feat(router): on-demand web search pipeline — concurrent SearXNG, merge into ContextPackage, forward via RecordAnswer (C91)
  • Proto 3e8c10c feat(proto): add WebSearchResult message and AnswerRecord.web_search_results (C91)
  • SaaS ef24d70 docs: handover — C91 contract written; on-demand web search pipeline design confirmed

— 34 commits

  • SaaS 1c9775f docs: handover — C90 reverted; correct web search design documented; next actions updated
  • SaaS 6c50aa1 Revert "feat(router): wire web search into inference path for nature=web questions (C90)"
  • SaaS d438608 docs: handover — C90 complete; switching focus to memory creation gap
  • SaaS 6a988e2 feat(router): wire web search into inference path for nature=web questions (C90)
  • SaaS 981b7eb docs: handover — session complete; web search wiring flagged as next priority
  • SaaS a44dc71 docs: handover — C89 complete; remember tool sequencing fix deployed
  • SaaS d1101cd fix(saas): instruct remember tool to fire after full response, not mid-stream (C89)
  • SaaS 4b89c2d docs: handover — note skill-selection-not-persisted gap surfaced in C88 testing
  • SaaS 431bc22 docs: handover — C88 complete; node-retrieval gap documented as follow-on
  • SaaS 1179f24 feat(saas): wire original input + prior sub-answers into multi-question context (C88)
  • SaaS a1cb807 docs: handover — C87 complete; shopping and wordcraft skills deployed
  • Desktop daf43cf feat(desktop): expose shopping and wordcraft in skill selector (C87)
  • SaaS 5eea123 feat(saas): add shopping and wordcraft skills to daily mode (C87)
  • SaaS 2550784 docs: update handover — C86 complete (saas:8bff023, desktop:529d873)
  • Desktop 529d873 refactor(desktop): rename C76 layer Tool→Skill, Persona→Mode (C86)
  • SaaS 8bff023 refactor(saas): rename C76 layer Persona→Mode, Tool→Skill (C86)
  • SaaS f7880b6 docs: handover — C86/C87 contracts written; Mode/Skill rename + roadmap
  • SaaS 199e994 docs: handover — C83/C84/C85 complete; node re-downloaded; decomposed reload verified
  • Desktop d8413cc fix(desktop): dedupe aggregated understanding on decomposed-turn reload (C85)
  • Desktop fb46e72 fix(desktop): decomposed-turn reload — group sub-questions by OID structure (C84)
  • Desktop fa9c6ca fix(desktop): correct WinBox class name in updateBounds 'wb-max' → 'max' (C83)
  • SaaS 74a863f docs: handover — C82 complete; all contracts verified; node re-download is #1 next action
  • Desktop 4dbbd16 fix(desktop): window resize on nav/browser change; answer bubble full-width (C82)
  • SaaS 7cc03db docs: handover — C81 verified; regression 1 resolved; node re-download is #1 next action
  • SaaS 8ed89e4 docs: handover — C81 complete; understanding GetSession chain fixed; node re-download is #1 action
  • SaaS ffd3773 fix(saas): wire understanding through GetSession chain (C81)
  • SaaS 18b0d21 docs: handover — C80 complete; regression 2 deployed-unverified; node re-download is #1 next action
  • Desktop 3151e8c feat(desktop): send op=continue|edit on RecordInput; trunk no longer forks (C80)
  • SaaS 531ba0d feat(saas): forward InputOp on RecordInput; sub-questions use OP_EDIT (C80)
  • Node 0e8115f feat(node): (turn,rev) pair OID allocator with continue/edit op (C80)
  • Proto 4815bc0 proto: add InputOp enum and InputRecord.op field (C80)
  • SaaS a2c6185 docs: handover — C79 landed; C80 written and pending; regression 2 root cause confirmed
  • SaaS 720c2bb docs(saas): DOC-22 — formalise (turn,rev) pair OID model and attribute arc (C79)
  • SaaS ab78eda docs: backup infrastructure fix — git safe.directory for root cron

— 35 commits

  • SaaS d08a9b8 docs: handover — C68-C78 batch landed; two regressions noted for next session
  • Desktop 7065ebe feat(desktop): send persona='daily' and tool from selector; align tool list with saas registry (C76)
  • SaaS de14a94 feat(saas): add persona+tool resolution; daily persona with default/summarise/json tools (C76)
  • Desktop f92b34d feat(desktop): FlowChart viewport indicator + click-to-scroll navigation (C77)
  • Desktop e4c81a8 feat(desktop): render sub-OID children as segments of their parent turn (C75)
  • SaaS c4e801f feat(saas): allocate sub-OIDs per sub-question; record answers per sub-OID (C74)
  • Node 66ed7e7 feat(node): plumb turn_type through RecordInput; persist on .input JSONL (C78)
  • Proto 6711f61 proto: add turn_type field to InputRecord (C78 precursor for C74)
  • SaaS 45a1b9e fix(saas): drop unused insufficientContextWire type and field; rely on JSON unmarshal tolerance for transitional node payloads (C73)
  • Desktop 9f620d1 refactor(desktop): remove dead InsufficientContext UI branch; rely on understanding panel for empty/error signals (C73)
  • SaaS d90e433 feat(saas): emit informational empty-result and error-result understanding entries; remove dead InsufficientContext field (C73)
  • Node 1030152 feat(node): emit ContextResultStatus on context-package response (C73)
  • Proto bf41487 proto: add ContextResultStatus to distinguish empty vs error retrieval outcomes (C73)
  • SaaS 79e4c6b refactor(saas): drop "### question" headings from finalAnswer composition (C72)
  • Desktop f716550 feat(desktop): restore persisted understanding entries on session reload (C71)
  • SaaS 39b7759 feat(saas): buffer understanding entries per request and forward in RecordAnswer (C70)
  • Node 9c8ca6f feat(node): persist understanding entries per session; return in GetSession (C70)
  • Proto 83130f3 proto: add UnderstandingEntry; carry on AnswerRecord and SessionMessage (C70)
  • SaaS d10dc7c fix(saas): make RecordAnswer synchronous; log failures; add history-count diagnostic (C69)
  • Desktop eaf427e refactor(desktop): remove dead understanding_status listener branch and subQuestions stream field (C68)
  • SaaS 2573c6c refactor(saas): remove dead OfferMode field and done.sub_questions; rename understanding_status doc references (C68)
  • SaaS 41e1d2e docs: handover — tool-only retry restored, node ID churn and history gap documented
  • SaaS cf61617 fix(saas): restore tool-only retry in litellm Stream (C62 assumption was wrong)
  • SaaS 4d8564e docs: handover — saas and desktop deployed (C62–C66 active)
  • SaaS dab1d73 docs: handover — C62–C66 complete, pipeline audit queue cleared
  • Desktop dd609dd refactor(desktop): remove unused assignedOid from StreamResult (C66)
  • SaaS eb1cd33 refactor(saas): remove unused AssignedOID from BrowserResponse and done event (C66)
  • Desktop f44a564 feat(desktop): render decomposed question bubbles for multi-question turns (C64)
  • SaaS 6767bf1 feat(saas): emit sub_question SSE events for multi-question turns (C64)
  • SaaS 63380c5 refactor(saas): remove ConversationHistory from contextPackageWire and buildEnrichedQuery (C63)
  • Node abf886e refactor(node): remove decomposer interface, ConversationHistory wire field, taskloop recordUserTurn (C63)
  • SaaS f542be5 refactor(saas): remove dead UserID fallback in HandleBrowserRequestStream (C65)
  • SaaS 7ebfbd2 refactor(saas): remove tool-only retry dead code from litellm Stream (C62)
  • SaaS 6133e3f docs: handover — add C65, C66 (F2, F7 contracted)
  • SaaS d2d6785 docs: handover — pipeline audit complete, C62–C64 written

— 8 commits

  • SaaS 05a930f docs: handover — session close (C61 verified, streaming fixed)
  • SaaS aec63bd docs: handover — C61 verified in production (streaming fixed)
  • SaaS 1b866f0 docs: handover — C61 complete (remember tool prompt fix)
  • SaaS 78bc3af fix(saas): tighten remember tool description to require text reply (C61)
  • SaaS 3714279 docs: handover — C59 + C60 complete (node re-registration fix, delete logging)
  • SaaS e13364c fix(saas): prune stale offline node duplicates on new registration (C60)
  • Node 63c970f fix(node): send persisted NodeId in Register call to enable re-registration (C60)
  • Node f1ba47f fix(node): log DeleteWorkspace outcome (C59)

— 32 commits

  • SaaS c208bc6 docs: handover — C58 complete (workspace delete calls node)
  • SaaS ad1004d fix(saas): DeleteWorkspace calls node to remove workspace directory (C58)
  • SaaS 0cde279 docs: handover — C57 + node static binary fix (session close)
  • SaaS 548729c docs: handover — node static binary fix (2d6c0a4)
  • Node ff23fa1 fix(node): CGO_ENABLED=0 for portable static binary
  • SaaS 0eb64ed docs: handover — C57 complete (deployed-unverified)
  • Desktop 724cd5c feat(desktop): node_refresh hub event drives navigator updates (C57)
  • SaaS 926c05e refactor(saas): WG poller drives node state transitions (C57)
  • SaaS bbca949 docs: handover — workspace/VPN state machine designed (C57 pending)
  • SaaS 9bbf026 docs: handover — C54/C55/C56 complete; OID audit follow-ups fully landed
  • SaaS f931208 docs: DOC-22 — OIDs may appear in node-content admin endpoints (C56-5)
  • SaaS 394862f feat(saas): SSE token frames carry oid when assigned (C56-4)
  • SaaS 1fb1dd4 refactor(saas): remove dead InsufficientContext early return (C56-3)
  • Desktop cb3843d fix(desktop): clear varen-active-path-<sid> on session delete (C56-2)
  • Node e093919 fix(node): DeleteSession removes .tree and drops session counters (C56-1)
  • Node d25545a fix(node): NextBranch keyed by parent OID; prime from on-disk branches (C55)
  • SaaS cfbfa60 feat(saas): forward assigned OID through RecordAnswer (C54)
  • Node 3cf2434 feat(node): RecordAnswer accepts oid; legacy fallback retained (C54)
  • Proto 22115c0 feat(proto): add oid field to AnswerRecord (C54)
  • SaaS bcfc252 docs: handover — C54/C55/C56 drafted, added to Pending list
  • SaaS befde57 docs: handover — OID cross-component audit; refresh session persistence section
  • SaaS a7a0b54 docs: split handover into Current State + HISTORY to reduce session startup cost
  • SaaS eebd4ff docs: handover — C53 complete (session pipeline root causes)
  • Desktop 2c23ada fix(desktop): session delete throws on 404; mount retries fetchSessions; auto-resume on session arrival (C53)
  • Node c9898a4 fix(node): remove additional models log at startup (C53)
  • SaaS c644169 fix(saas): Deregister marks node offline instead of deleting row (C53)
  • SaaS c5ff305 docs: handover — C50/C51/C52 complete (Qdrant Q&A embed, loadSession errors, OID branch fix)
  • Node 2ceed12 fix(node): branch OID resolves sibling of edited turn not child of its parent (C52)
  • Desktop f51a5e5 fix(desktop): send editingOid as parent_oid for branch inference (C52)
  • Desktop 64614ed fix(desktop): catch loadSession fetch errors so UI stays usable on node failure (C51)
  • Node 7608fbb WIP: auto-checkpoint on session end 20260508-083427
  • SaaS ddb4449 docs: handover — C50/C51/C52 contracted (expansion_exhausted root cause, loadSession error handling, OID edit-branch fix)

— 33 commits

  • SaaS 8f2a976 docs: handover — C45–C49 complete (bug fix run, FlowChart, Understanding collapse)
  • Desktop ff758e1 fix(desktop): horizontal variant rows in FlowChart; Understanding auto-collapses on completion (C49)
  • SaaS 3b70603 fix(saas): classifier preserves user phrasing; InsufficientContext falls back to direct inference (C48)
  • SaaS 36789fb fix(saas): add JSON tags to InsufficientContextInfo (C47)
  • Desktop 0f09049 fix(desktop): remove workspaces from useEffect deps to stop polling loop (C46)
  • Desktop 2d49c79 fix(desktop): pass parentOid in handleSend inference body (C45)
  • SaaS 3d99199 docs: handover — C40–C44 complete (OID tree model, branch creation, SSE OID routing)
  • Desktop b058c91 feat(desktop): branch creation on edit, SSE OID routing, flow chart navigation (C44)
  • SaaS 8df7b7d feat(saas): turn_start SSE, RecordInput before inference, active-path + delete-turn endpoints (C44)
  • Node a40c0d0 feat(node): branch OID assignment in RecordInput, SetActivePath, DeleteTurn (C44)
  • Proto fe4d1c2 feat(proto): parent_oid on InputRecord; InputRecordResponse; SetActivePath + DeleteTurn RPCs (C44)
  • Desktop 44c52c9 feat(desktop): OID-based turn tree model + flow chart panel; remove variant nav (C43)
  • SaaS 7d3b8c1 feat(saas): surface turn OIDs in session JSON response (C42)
  • Node e57e119 feat(node): surface turn OIDs through TaskService.GetSession (C42)
  • Proto 3390d97 feat(proto): add oid/parent_oid/turn_type to SessionMessage (C42)
  • Node 047dd11 feat(node): OID storage in session files; counters + tree sidecar; subtree delete (C41)
  • SaaS 9caaf69 docs: add DOC-22 — Node MIB / OID addressing scheme (C40)
  • SaaS b34f93a docs: handover — backup infrastructure fixed (2026-05-07)
  • SaaS cf81ef0 docs: handover — C40–C44 contracted, conversation tree (OID model) design captured
  • SaaS 4f9ee0e docs: handover — session close 2026-05-07 (C37, C38, C39; search pipeline complete)
  • SaaS 5280f4d docs: update handover — C37–C39 complete; search pipeline fully wired
  • Node 5ed4b04 feat(node): web fetcher — event-driven URL fetch, extract, embed, Qdrant research index (C39)
  • SaaS 1aca1fc docs: update handover — C38 complete (node search providers wired)
  • Node d11970b feat(node): WebSearcher + N8 provider — call SaaS search gateway over VPN (C38)
  • SaaS 2631011 docs: update handover — C37 complete (search gateway, SearXNG, 0.0.0.0 bind)
  • SaaS 2f323cb feat(saas): search gateway — SearXNG + Brave API endpoint for node queries (C37)
  • SaaS 0d12cdc docs: update handover — contracts repo commit for C37/C38/C39 resolved
  • SaaS a037d75 docs: handover — session close 2026-05-07 (C37, C38, C39 contracts; search architecture)
  • SaaS 22f8db6 docs: handover — session close 2026-05-07 (C35, C36; flag turn variant model)
  • Desktop 86675e6 feat(desktop): delete turn/session/workspace; pencil/trash icons; consolidate turn controls into understanding bar (C36)
  • SaaS fb2e970 feat(saas): add DELETE /api/workspaces/{workspace}/sessions/{session} endpoint (C36)
  • SaaS cdaa5fa docs: handover — session close 2026-05-07 (C35)
  • SaaS 3124871 feat(saas): wire memories through AnswerRecord to node Qdrant storage (C35)

— 33 commits

  • SaaS f86c49c docs: handover — session close 2026-05-06 evening (C32/C33/C34)
  • SaaS 97cbcad feat(saas): push memory extraction events to understanding strip (C34)
  • SaaS 769f1b0 docs: handover — C33 streaming inference
  • Desktop b92055c feat(desktop): consume SSE inference stream, render tokens incrementally (C33)
  • SaaS 9d0a8f1 feat(saas): SSE streaming inference end-to-end (C33)
  • SaaS 27a0b94 docs: handover — C32 Qdrant per-workspace collection invariant
  • Node 15ba875 fix(node): Qdrant per-workspace collection invariant — list-based existence check + startup migration (C32)
  • SaaS bbdbed4 docs: update handover — session close 2026-05-06 afternoon
  • Node 98d1a9d fix(node): check collection exists before searching — avoid Qdrant TCP crash
  • Node 82a3731 fix(node): Qdrant readiness wait + graceful 404 on empty collections
  • SaaS aac01aa feat(saas): detailed understanding events with elapsed timing
  • SaaS 9784438 fix(saas): replace undefined 'compound question rule' with explicit instructions
  • SaaS 0e41e93 docs: update handover — C26 complete; node dispatch gRPC channel fixed
  • SaaS 43c440f fix(saas): revert dispatchTimeout to 30s — node dispatch channel fixed
  • Node c58b1a0 fix(node): wire SendTaskResult through DispatchTask stream — not NodeService
  • SaaS ec3a981 docs: update handover — C28 complete
  • SaaS f60c33f fix(saas): add general advisor to classifier — catch-all for out-of-domain questions
  • SaaS cae3172 docs: update handover — C25 complete; Bugs B/C/D resolved
  • Desktop 99a43bc feat(desktop): session history in inference POST; markdown rendering; memories display
  • SaaS c9e1e78 feat(saas): propagate Memories through BrowserResponse to desktop
  • SaaS ddb1a05 docs: update handover — C27 complete; understanding events wired from SaaS fallback path
  • Desktop f7134e6 fix(desktop): add auth token to /updates WebSocket; keep understanding strip open if entries arrived
  • SaaS 138b91d feat(saas): wire hub to /updates endpoint and push understanding events from classifier
  • SaaS 5aa76dd docs: update handover — C23/C24 complete; four post-C24 inference UX bugs documented; C25/C26/C27 queued
  • SaaS a7b9e6b fix: handle tool-only LiteLLM responses; fix classifier backtick parsing; reduce dispatch timeout
  • SaaS b991a57 feat: wire orchestrator, classifier, and advisor routing into SaaS inference path
  • SaaS bf504c2 docs: update handover — session close, C22 complete, C23 pending, batch passthrough confirmed
  • Desktop 1fd7d7b fix: WinBox resize on viewport change and nav toggle; close workspace windows on node disconnect
  • SaaS 1bff5ee docs: update handover — LiteLLM batch passthrough confirmed, proxy_config requirement noted
  • SaaS d4229f3 docs: correct batch pipeline — LiteLLM mandatory for billing and content isolation
  • SaaS 787b574 docs: update handover — batch processing architecture boundary
  • SaaS 87758b3 docs: update handover — content mode system design concept expanded
  • SaaS d822ee5 docs: update handover — C22 session notes, two desktop bugs, instructional popout concept

— 6 commits

  • SaaS ca414be docs: update handover — C21 complete, node redeployed 260505.142801
  • Desktop 1d4c431 fix: variant persistence via localStorage; fix stale closure in handleEditSend
  • SaaS 4213c16 docs: update handover — C20 complete, inline chat edit and variant navigation
  • Desktop a3d2109 fix: restore fixed input, edit-to-bottom-bar, lucide icons, stop button
  • SaaS 37c3301 docs: update handover — C20 complete, node local inference vestigial, node redeployed 260505.142801
  • Node 35a0ed1 fix: remove local model startup requirement — only nomic-embed-text is required

— 54 commits

  • SaaS 7372fab docs: update handover — C18 complete, inline chat edit and variant navigation
  • Desktop 472377a feat: inline chat input, edit-last-turn, variant navigation, per-turn understanding
  • SaaS 5c141ed docs: update handover — session close, C15-C17 complete, workspace sync fixed
  • SaaS 11fb93f fix: replace 15s sleep with retry-backoff in workspace sync; adopt WorkspaceSyncer interface
  • SaaS 747507e fix: wire Provisioner so node workspaces sync to DB; show workspaces regardless of node state
  • Desktop d36e635 fix: use varen-logo.svg on login page; remove About and Sign out icons
  • SaaS 41988b2 docs: update handover — session close, C11-C13 complete, C14 ready
  • SaaS 6e5ee29 docs: update handover — C13 complete, C14 pending
  • Desktop 36c8353 feat: About modal shows available-for-download node version from API
  • SaaS 98a5b89 feat: read node version file, expose via /api/version
  • Node 5f05e50 feat: write version file to downloads dir on deploy
  • SaaS 9ed4d9e docs: update handover — C12 complete, node version fix and arch in About
  • Desktop 3c842c9 fix: parse arch from node version string in About modal
  • Node f41d243 fix: correct nodeVersion ldflags target, add arch to version string
  • SaaS 533d86c fix: quote ldflags -X value to handle spaces in version string
  • SaaS 96f6ef5 fix: move saasVersion declaration after import block
  • SaaS 4d6e056 docs: update handover — C11 complete, version display and About modal
  • Desktop 61810b7 feat: version under brand, About modal with component versions
  • Node 8b24427 fix: remove v prefix from version string, use 2-digit year
  • SaaS 3498db3 feat: add saasVersion variable, /api/version endpoint, fix version format
  • SaaS 0f85b10 docs: update handover — C10 complete, workspace window UX fixes
  • Desktop 22c544b fix: remove minimize button, open windows maximized, fix focus stealing on text selection
  • SaaS 8e918b7 docs: update handover — session close, process deviation noted
  • SaaS 5c92dae docs: update handover — daily ops session, LiteLLM config corrected
  • SaaS cfa24c1 docs: update handover — C09 complete, section model and derived-fields rule
  • Desktop a21b7ef feat: mutually exclusive workspace sections — Chat, Sessions, Files, Research, Profile, Understanding
  • SaaS 5e7e0c3 docs: update handover — C08 complete, desktop deploy permission added
  • Desktop 77dde3b feat: redesign workspace toolbar — tool selector, context panel, understanding panel
  • SaaS fa59081 docs: update handover — C08 written, tool/adviser architecture clarified, understanding drawer deferred
  • SaaS bc9c06c docs: update handover — session close, desktop UX gaps noted
  • SaaS d227a0e docs: update handover — C07 complete, navigator restructured to node-centric tree
  • Desktop b7e19b6 fix: restructure navigator to node-centric tree
  • SaaS 0245ec2 docs: update handover — C06 complete, navigator logo and CSS fixed
  • Desktop 957faa9 fix: navigator logo deploy and CSS class mismatches
  • SaaS e7e9962 docs: update handover — node binary redeployed, session close
  • SaaS 5cef52d docs: update handover — C05 complete, node relay and WebSocket restored
  • Node ca9bbce feat: restore N17 relay and N18 WebSocket implementations
  • SaaS f6ab153 docs: update handover — C04 complete, system audit confirmed working
  • Node 72115f0 fix: update proto target to delegate to central repo
  • SaaS 0a94279 fix: update proto target to delegate to central repo; update stale deploy docs
  • SaaS 309b52a docs: update handover — C03 complete, all foundation contracts done
  • SaaS a909ed2 docs: update handover — new repo structure complete, C02a deployed, C03 partial
  • Node 8664274 fix: add deploy target to node Makefile (restored from recovery-era Makefile)
  • SaaS 2c23880 fix: restore missing cmd/ directory from C01 migration (rsync omission)
  • Node a14c054 feat: regenerate proto bindings from central proto repo
  • SaaS cc4fd3c feat: regenerate proto bindings from central proto repo
  • Proto 91c4c01 feat: add NodeService and TaskService definitions to services.proto; add missing message types
  • SaaS f37e52a fix: add MemoryRecord/HistoryEntry types to router, add nhooyr.io/websocket dependency
  • Node 8dfc261 fix: complete mid-refactor WIP — remove duplicate types files, add missing constructors and mock stub
  • SaaS 0f713d0 fix: remove broken proto symlink from monorepo migration
  • Desktop 6413cd8 init: desktop source from varen-desktop-src 99f5394
  • Node 1784349 init: node source from varen-desktop-src 99f5394
  • SaaS 9c029aa init: saas source from varen-desktop-src 99f5394
  • Proto 758147a init: proto definitions from varen-desktop-src 99f5394 (task.proto removed)