Repository navigation
Releases
v1.6.0
Recall no longer stalls on a hung server, more secrets are redacted, memories say where they came from, and a session's later parts cost the server far less to extract. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from v1.5.0 or any earlier release with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code (and Codex), so they read the new memory instructions. New install: see below.
- The server is unchanged on the Docker runtime (Hindsight 1.2.0, the same image): no server upgrade. The memory bank's template is unchanged. On the native runtime (always the case on Windows) the Python packages changed (filelock 4.2.1 and soupsieve 4.1, for published advisories; on Windows also winloop 0.8.3), so the update builds a new virtual environment beside the running one and restarts the server on it. Hindsight stays 1.2.0, so backsight cannot tell which of the two pins is newer and refuses: type
backsight update apply --allow-unordered(--plan --allow-unorderedto preview). Without the flag the update stops at the server step and rolls back to the release you had, nothing changed. If you already updated the binary,backsight server upgrade --allow-unordereddoes the same step; doctor'snative-venvcheck names it. Withupdate.auto_applyon, the daily automatic update fails the same way and rolls back each day until you run it by hand. - The instruction set is v22 (v21 before): the source words of a memory's tag, and the briefing as reference notes.
- The plugins and the metrics index are unchanged.
- No new setting. One default changed:
feedback.cross_project_retireisfalse(it wastrue). No earlier release wrote it toconfig.toml, so an install without the key now getsfalse; atrueyou set yourself is kept. An older backsight reads this version'sconfig.tomlas is. - Each project's briefing page is rewritten at its next refresh (6 h by default) from a request that now asks for reference notes: no extra rewrite.
What changed
- A server that takes the call and never answers no longer stalls every prompt. Before, each prompt waited the full 17 s, three times, before recall paused (a reranker saturated by a large extraction does this). Now one prompt recall that runs out of its 17 s pauses recall at once, even when another project's search answered (its memories are still shown that time). Other failures (an error status, a refused connection, the 3 s connect limit, a tool-failure lookup that timed out in 6 s, a session start's briefing that timed out in 5 s) count one each toward the 3 in a row (
network.breaker_failures); the briefing's failures recorded nothing before. After the pause, each recall gets 8 s instead of 17 s until one answers, so a server still stuck costs one prompt 8 s every 5 minutes at most. The 17 s budget itself stays: successful slow recalls would be lost (an install measured p95 2.3 s and a worst of 5.1 s on a CPU) (#340). - Three
statsnumbers that read as wrong.- Memories that proved useful: the leading weeks before the first one that made a memory are no longer listed or used as the headline (no more "0 of 0, 20 more needed"); a week not yet judgeable says its date (its last day plus 28 days).
- "Prompts where Claude searched memory" no longer counts
memory_store, sostats qualityandstats' Searches line give the same number. Any trend spanning the upgrade has a step down: on one install it went from 68 % to 33 % with no change in what Claude does. doctor'ssearcheswarning is worded as "injections followed by a search", whatstats' Injections line measures. - Often shown, never used: the count was right;
statsnow prints its threshold (feedback.stale_shows, 10 shows over all time, not the window's) under it, and the definition no longer claims a weighting it does not do (#340).
- Secrets are redacted before text is cut. The recall query, the topic-shift words, the end of the last reply and a failed command were cut to their limit, then redacted: a key across the cut fell under its pattern's length and its first characters left as a query. They are now redacted first (a window up to 4,096 characters past the cut, doubled when redaction shrinks it, at most 65,536 and masked whole beyond) (#338).
- 45 more kinds of secrets are masked, and four rules are wider. New: SendGrid, Tailscale, Hugging Face, Groq, xAI, Replicate, Perplexity, PyPI, Vault, Mailgun, Doppler, Dynatrace, Linear, Notion, Databricks, Pulumi, Postman, RubyGems, Sentry, PlanetScale, Prefect, Grafana, Heroku, Brevo, Square, Artifactory, Fly.io, OpenShift, 1Password, New Relic, Alibaba, Atlassian, Azure AD client secrets, Bedrock, Supabase, Sourcegraph, Cloudflare origin CA, Typeform, EasyPost, Shippo, Clojars, Facebook page tokens, Teams webhooks, NuGet
ClearTextPassword, and a bare AWS secret access key (40 random base64 characters holding/or+, alone between separators: Git SHAs, paths and URLs stay). Telegram bot tokens are masked whole (the bot id was left in clear). Wider: Stripe, Slack, AWS and GitLab prefixes. Redaction applies to what is sent from now on;memory scanfinds the new formats in what is already stored (#338). - A private key header with no
ENDline no longer swallows the text after it. Agrepfor-----BEGIN RSA PRIVATE KEY-----, a sentence or a Go string stays as written. A real key pasted without itsENDline is still masked whole, up to the first line of prose, quoted, commented, escaped and wrapped lines included (#338). - A memory says where it came from. Every memory line Claude reads carries a source word from the
source:tags its facts already had:session(a past conversation, which may quote what Claude read on a page or in a repository),note(a fact an agent stored),subagent,import,other, ormixed(several, or facts the server cut from its answer):[billing · note · 1a2b3c4d]in prompt recall, failure recall, briefings, subagent items and the compaction replay,from noteinmemory_searchandmemory_read, and the Sources answer. The short guide tells Claude to treat note, import, other and mixed as claims to verify. Project names in these lines keep a safe character set (others show as_);memory_credittakes each memory's project from the server, never from the shown name. The hook recalls ask the server for source facts, within 2,048 tokens a scope (#339). - The briefing is reference, not orders. Its request asks the server for each "In force" item as a statement about the project, never an instruction to Claude, ending with the source its facts show (
(session),(note),(subagent),(import),(mixed); no "user" label, which a note could forge). Its header says the notes are to verify, that the labels are the server model's unverified reading, and that your words in the session and the project'sCLAUDE.mdorAGENTS.mdcome first (#339). - Claude retires memories only in the session's projects by default.
feedback.cross_project_retireisfalsenow: a session that read a hostile page cannot retire another project's memories. The refusal says so and gives the way out for you,backsight forget <id>, without naming the setting. Set it totrueinconfig.tomlto restore the wider reach (#339). - Native runtime: two more Python packages newer than the image's, for published advisories. filelock 4.2.1 (GHSA-69hj-f68j-2879, GHSA-8mx5-7m5m-r77g; forced past litellm's
filelock<4cap, which only its own proxy command meets, with the model downloads' calls unchanged in 4.x) and soupsieve 4.1 (from 2.9.2; GHSA-mmhr-3c5m-f64f, high, and GHSA-4j63-6c4x-wfg4, medium), beside pyasn1 0.6.5 since earlier releases. The lock is now resolved for the image's exact Python, 3.11.18, as soupsieve 4 needs a patch release. The Docker runtime keeps the image's versions. Upgrade: see the update paragraph (#339, #342). - A session's later segments are sent as parts, not appends: 20 to 30 % less server LLM cost expected. Hindsight re-extracted facts of chunks an append did not change: on one install 56 % of the facts appends added replaced facts they had just deleted, and consolidation is about 75 % of the server's LLM spend. Segment 2 onwards now goes out as a document of its own (
conversation:<session>#part2,#part3…), so the server extracts only the new turns. A session appended to by an earlier release is not rewritten: it goes on in parts after its last segment, and cursors are unchanged. Position, resync,verify --live, replace checks andforget --purge(every part of a session's document, and a part still queued when you purge) read the whole chain. A part replaced by another PC's, or lost by the server, is found at a laterjobs tickand its turns sent again.retain.append_min_charsandretain.append_max_waitstay: they now limit how many parts a session makes. New doctor checkqueue-age: the oldest retain on the server is 6 h old or more and none completed in the last hour.verify --livefails on a part missing between stored ones (#341).
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/mai...v1.5.0
Choose at setup how often briefings are rewritten, and a project's own rule now wins over a user-wide one. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from v1.4.0 or any earlier release with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code (and Codex), so they read the new memory instructions. New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade. The memory bank's template is unchanged.
- The instruction set is v21 (v20 before): the precedence rule below.
- The plugins and the metrics index are unchanged.
- No new setting:
recall.briefing_refresh_intervalexists since v0.1.32-m7, and an existing install keeps its value. An older backsight reads this version'sconfig.tomlas is.
What changed
- How often briefings are rewritten, asked at setup. The briefing each session starts with is a page the server's LLM rewrites from the project's memories, at most once per
recall.briefing_refresh_interval. Setup now asks it (briefing_refresh):1h(close to your latest work),6h(the default, balanced) or24h(the cheapest; a session can start on a briefing up to a day behind), or any duration. Each option shows what it costs a month per active project with the model you picked, from what one install measured: about 105,000 input tokens a rewrite, and about 5, 2 and 1 rewrites a day per project worked on daily. With DeepSeek's peak prices that is about 5.36, 2.14 and 1.07 USD; with Claude Haiku 5.5 about 2.24, 0.89 and 0.45 USD; on a Claude subscription, no money but your plan's usage. Setup writes the answer toconfig.tomlonly when it is not6h; an installed PC changes it there, and the nextjobs tickgives every page the new floor. Setup asks it on the PC it sets up, not on a server-only host; a PC joined withbacksight connectkeeps6huntil you set the same value in itsconfig.toml(#325). - Refreshing a briefing when a session opens it: measured, not built. A rewrite takes about 22 s, more than a session start can wait, so the session that triggered it would still see the old page: the first session after a break, the one that needs a fresh page most. At today's freshness it would save about 1 USD a month. Since v0.1.32-m7's floor, briefings are about 7 % of the server's LLM cost, not 31 % (#325).
- A project's own rule wins over a user-wide one there. The memory instructions said "User-wide rules override conflicting project facts", which let a general rule beat a project's deliberate exception ("this repository uses merge commits" against "squash-merge"). Now a project's own standing convention, decision or correction wins in that project; a project memory that records a past event never overrides a user-wide rule (#336).
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
For Codex, install Codex 0.167.0 or newer first (npm install -g @openai/codex@latest): setup then asks which tools to wire. Claude Code is not needed for Codex alone (Codex).
Known limits
- Briefing refresh:
- The monthly costs setup shows come from one install's usage over four days: a project with more new memories a day gets more rewrites, up to 24, 4 and 1 a day at
1h,6hand24h. DeepSeek bills half price off-peak, so its figures can be up to twice the real cost. - Each PC sets its own floor on every page: PCs sharing one memory with different values undo each other's every day (doctor's
bankcheck names it).backsight connectdoes not carry the host's value, andserver install --sshdoes not take it: set the same value in every PC'sconfig.toml. - Setup does not ask it again on an installed PC: change
recall.briefing_refresh_intervalinconfig.toml.
- The monthly costs setup shows come from one install's usage over four days: a project with more new memories a day gets more rewrites, up to 24, 4 and 1 a day at
- Codex:
- No test with a real model yet: the automated checks run a real Codex 0.167.0 against a fake model. How a real model follows the guide with Codex's tool names (when it searches and credits), the skills' texts and the sandbox line, and its tokens per session are not measured yet.
- On Windows, the hooks'
cmd /Cform (paths with spaces in particular) and the skills'backsightcommands in PowerShell, Codex's shell there, have not been run on a real PC. Check that backsight's first line appears at your first prompt once you trust the hooks. - The memory tools' new declarations are served to Claude Code too; that they change nothing in its permission prompts is not checked with a real session yet.
- A coding-tool filter (
--client, the dashboard's Coding tool) counts this PC's data only: the other PCs send no tool, the PC switch is not offered under it, and the server's figures stay whole (not_filtered). - A setup rerun that picks only
codex, on a PC where Claude Code is wired, does not offer Claude Code's past sessions: its backfill covers the tools picked (backsight retain backfill --tools claude-codesends them). - A headless Codex session is queued only for the facts stored explicitly in it (
memory_store), as a Claude Code Agent SDK session is. - A Codex with no record of the Claude Code shell it was started from (its hooks not trusted yet, or started before this update):
pause,store,whyandfeedback loginside it fall back to that Claude Code session. Pause by id there:backsight pause --session <id>, with the value of$CODEX_SESSION_ID. - Codex reports no failed tool call to its hooks, so
recall.failure_pitfallsdoes nothing there. backsight does not manage how long Codex keeps its history. After/clear, Codex sends no end: the old session is sent by the background job, 30 minutes after its last turn. - A forked Codex session may be sent with some turns twice, never fewer (not checked yet). A turn that works in several folders is filed under the project of the first one, sorted.
- Codex runs each hook through your login shell (
$SHELL -lc): a slow profile slows every prompt.
backsight memory states:- GitHub only, and only memories saying a pull request or issue is still open: a memory saying a fix is merged but in no release yet is not checked.
- It reads the memory's words, not its meaning: a stale memory worded in a way it does not recognise is not listed (skipped or not counted), and a memory listed is worth a glance before
--retire. The wordings are English. - GitHub answers "not found" both for a missing repository and for one your login cannot see: with several owners, a repository hidden under one owner leaves a same-named one under another to decide.
- It runs only when you run it; no background job checks these memories.
- The new extraction rules apply to what is extracted from now on: a memory already wrong stays until Claude reports it or you retire it (
backsight memory stale,backsight memory states,backsight forget <id>). Whether the server's model follows them is checked on live extractions, not in tests. - Whether 5 memories and 1,500 characters on a prompt help more than they cost in context is measured on live use (the
Per recallline), not in tests. - A fact Claude stores as a correction, then reports outdated with
memory_credit, is stored as two correction notes. - Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- The Projects page reads the date of each project's latest memory from the server, one small read per project, four at a time (cached by the dashboard): with many projects, the page's first load takes longer.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails it...
v1.4.0
Check memories of pull requests and issues against GitHub, and retire the stale ones. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from v1.3.0 or any earlier release with backsight update apply: it takes a verified backup first and rolls back if a step fails. No restart is needed: the change is a new command. New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade. The memory bank's template is unchanged.
- The instruction set (v20), the plugins and the metrics index are unchanged.
- No new setting: an older backsight reads this version's
config.tomlas is.
What changed
-
backsight memory states. A memory saying "PR #12 is open, not merged" is true the day it is written and wrong once the pull request is merged, and nothing in the memory notices: on one install, every one of 7 sampled was already merged. The new command reads the delivered-state memories that name a GitHub pull request or issue and say it is still open (open, not merged, waiting for a review or a merge, in the sentence that names it or the next one about it), asks GitHub through theghCLI and its login, and lists those GitHub says were merged or closed since, each with the item, its date andbacksight forget <id>.--retireretires them all, with GitHub's answer as the reason;backsight forget --restore <id>undoes one.--project <name>checks one project's memories;--json(#331, #332, #334). -
It retires nothing it is not sure of. A link or
owner/repo#Nis checked as written; a barePR #12is looked up under your own repository owners (projects.own_ownersand the owners learnt from your sessions), in the project named just before it, else the memory's own project. Skipped and counted, never listed:- a memory that also says the item was merged or closed since;
- one about a pull request closed without a merge;
- one that is also a decision, convention, pitfall, lesson or correction (retiring it would lose that part);
- one older than the item GitHub now has under that number (a repository recreated since, reusing the numbers);
- a bare ref it cannot place in exactly one of your repositories, and any item GitHub does not answer for.
A memory naming an item still open is counted as still open. On one install, it read 4,612 delivered-state memories and listed 22 to retire, each confirmed by hand against GitHub.
-
It needs
gh. Install the GitHub CLI and rungh auth login; without it, or not logged in, the command stops and says so. Nothing runs on its own: the memory changes only with--retire.
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
For Codex, install Codex 0.167.0 or newer first (npm install -g @openai/codex@latest): setup then asks which tools to wire. Claude Code is not needed for Codex alone (Codex).
Known limits
- Codex:
- No test with a real model yet: the automated checks run a real Codex 0.167.0 against a fake model. How a real model follows the guide with Codex's tool names (when it searches and credits), the skills' texts and the sandbox line, and its tokens per session are not measured yet.
- On Windows, the hooks'
cmd /Cform (paths with spaces in particular) and the skills'backsightcommands in PowerShell, Codex's shell there, have not been run on a real PC. Check that backsight's first line appears at your first prompt once you trust the hooks. - The memory tools' new declarations are served to Claude Code too; that they change nothing in its permission prompts is not checked with a real session yet.
- A coding-tool filter (
--client, the dashboard's Coding tool) counts this PC's data only: the other PCs send no tool, the PC switch is not offered under it, and the server's figures stay whole (not_filtered). - A setup rerun that picks only
codex, on a PC where Claude Code is wired, does not offer Claude Code's past sessions: its backfill covers the tools picked (backsight retain backfill --tools claude-codesends them). - A headless Codex session is queued only for the facts stored explicitly in it (
memory_store), as a Claude Code Agent SDK session is. - A Codex with no record of the Claude Code shell it was started from (its hooks not trusted yet, or started before this update):
pause,store,whyandfeedback loginside it fall back to that Claude Code session. Pause by id there:backsight pause --session <id>, with the value of$CODEX_SESSION_ID. - Codex reports no failed tool call to its hooks, so
recall.failure_pitfallsdoes nothing there. backsight does not manage how long Codex keeps its history. After/clear, Codex sends no end: the old session is sent by the background job, 30 minutes after its last turn. - A forked Codex session may be sent with some turns twice, never fewer (not checked yet). A turn that works in several folders is filed under the project of the first one, sorted.
- Codex runs each hook through your login shell (
$SHELL -lc): a slow profile slows every prompt.
backsight memory states:- GitHub only, and only memories saying a pull request or issue is still open: a memory saying a fix is merged but in no release yet is not checked.
- It reads the memory's words, not its meaning: a stale memory worded in a way it does not recognise is not listed (skipped or not counted), and a memory listed is worth a glance before
--retire. The wordings are English. - GitHub answers "not found" both for a missing repository and for one your login cannot see: with several owners, a repository hidden under one owner leaves a same-named one under another to decide.
- It runs only when you run it; no background job checks these memories.
- The new extraction rules apply to what is extracted from now on: a memory already wrong stays until Claude reports it or you retire it (
backsight memory stale,backsight memory states,backsight forget <id>). Whether the server's model follows them is checked on live extractions, not in tests. - Whether 5 memories and 1,500 characters on a prompt help more than they cost in context is measured on live use (the
Per recallline), not in tests. - A fact Claude stores as a correction, then reports outdated with
memory_credit, is stored as two correction notes. - Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- The Projects page reads the date of each project's latest memory from the server, one small read per project, four at a time (cached by the dashboard): with many projects, the page's first load takes longer.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails its writes until the state directory is back on a local disk.
stats daysreads a year of prompts with no index for it (about 0.1 s locally). - Import: a file the server keeps rejecting holds that folder's next files until it passes. The last tick before a cap can overshoot it by what was already in flight. A file deleted from the folder stays in the memory until
import purge. - Windows:
- WSL is not tested, and Windows on Arm has no binary.
- The native runtime is the only runtime there (
server runtime switchis refused). It serves this PC only, has no web UI, and starts with your logon, not at boot. backsight server statuskeeps showing the server's last refusal while it is stopped, until a start passes the check.- backsight's
.exefiles are not code-signed: SmartScreen or Smart App Control may warn about them. The install script checks the release signature before it runs anything.
- Th...
v1.3.0
Per-prompt recall that says what it leaves out, and a Projects page with every project. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from v1.2.0 or any earlier release with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code (and Codex), so they read the new recall header, and a running dashboard (Ctrl+C, then backsight dashboard). New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade. The memory bank's template is unchanged.
- The instruction set is v20 (v19 before): the recall header says a line ending in
…is shortened andmemory_readhas the rest. - The plugins and the metrics index are unchanged.
- Before installing an older backsight by hand: an older version refuses a
config.tomlwith a key it does not know. Removerecall.prompt_hits_maxandrecall.prompt_confident_scoreif you set them. A failedupdate applyputs back yourconfig.tomlitself.
What changed
- More memory on a prompt when it is clearly relevant. A prompt still gets up to 3 memories (
recall.prompt_hits), and now up to 5 (recall.prompt_hits_max) when each one past the third scores at least 0.8 (recall.prompt_confident_score). The room for them goes from 800 to 1,500 characters (recall.prompt_chars). A value you set inconfig.tomlis kept. The memories shown after a failed tool call keep their own limits, 2 memories and 800 characters. A prompt's memories stay within what the session's budget has left (#328, #330). - Shortened, not clipped. A memory that does not fit whole is shown as a headline of up to 160 characters ending with
…, and the recall header tells Claude thatmemory_readhas the rest. When not even the headline fits, the next memory is tried instead of stopping there. - What the limits left out, counted. Each prompt records how many memories above the floor were left out by the count, how many by the size, and how many were shortened.
backsight statsprints them on a newPer recallline, with the recalls by number of memories added.feedback replaycompares every memory a prompt may now add, not only the first 3. - The Projects page lists every project holding memories. The dashboard's Projects page and
backsight stats projectslisted only the projects with a session on this PC in the window. A project you worked on from another folder (its memories came from subagent reports or notes stored for it), or one quiet lately, had no row: on one install, 4 rows against the 12 projects the Bank page counts. The rows are now every project the server holds memories for, plus any project active in the window that holds none yet. A quiet project shows no activity. A new Last memory column (last_memoryin--json) says when each project's latest memory happened, read from the server. The pooled row's lowest and highest values count the active projects only. Instats projects, a date not known reads—rather thannever(#326, #329). - New settings,
recall.prompt_hits_max = 5andrecall.prompt_confident_score = 0.8, and a new default,recall.prompt_chars = 1500. backsight writes none of them inconfig.toml(configuration).
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
For Codex, install Codex 0.167.0 or newer first (npm install -g @openai/codex@latest): setup then asks which tools to wire. Claude Code is not needed for Codex alone (Codex).
Known limits
- Codex:
- No test with a real model yet: the automated checks run a real Codex 0.167.0 against a fake model. How a real model follows the guide with Codex's tool names (when it searches and credits), the skills' texts and the sandbox line, and its tokens per session are not measured yet.
- On Windows, the hooks'
cmd /Cform (paths with spaces in particular) and the skills'backsightcommands in PowerShell, Codex's shell there, have not been run on a real PC. Check that backsight's first line appears at your first prompt once you trust the hooks. - The memory tools' new declarations are served to Claude Code too; that they change nothing in its permission prompts is not checked with a real session yet.
- A coding-tool filter (
--client, the dashboard's Coding tool) counts this PC's data only: the other PCs send no tool, the PC switch is not offered under it, and the server's figures stay whole (not_filtered). - A setup rerun that picks only
codex, on a PC where Claude Code is wired, does not offer Claude Code's past sessions: its backfill covers the tools picked (backsight retain backfill --tools claude-codesends them). - A headless Codex session is queued only for the facts stored explicitly in it (
memory_store), as a Claude Code Agent SDK session is. - A Codex with no record of the Claude Code shell it was started from (its hooks not trusted yet, or started before this update):
pause,store,whyandfeedback loginside it fall back to that Claude Code session. Pause by id there:backsight pause --session <id>, with the value of$CODEX_SESSION_ID. - Codex reports no failed tool call to its hooks, so
recall.failure_pitfallsdoes nothing there. backsight does not manage how long Codex keeps its history. After/clear, Codex sends no end: the old session is sent by the background job, 30 minutes after its last turn. - A forked Codex session may be sent with some turns twice, never fewer (not checked yet). A turn that works in several folders is filed under the project of the first one, sorted.
- Codex runs each hook through your login shell (
$SHELL -lc): a slow profile slows every prompt.
- The new extraction rules apply to what is extracted from now on: a memory already wrong stays until Claude reports it or you retire it (
backsight memory stale,backsight forget <id>). Whether the server's model follows them is checked on live extractions, not in tests. - Whether 5 memories and 1,500 characters on a prompt help more than they cost in context is measured on live use (the
Per recallline), not in tests. - A fact Claude stores as a correction, then reports outdated with
memory_credit, is stored as two correction notes. - Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- The Projects page reads the date of each project's latest memory from the server, one small read per project, four at a time (cached by the dashboard): with many projects, the page's first load takes longer.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails its writes until the state directory is back on a local disk.
stats daysreads a year of prompts with no index for it (about 0.1 s locally). - Import: a file the server keeps rejecting holds that folder's next files until it passes. The last tick before a cap can overshoot it by what was already in flight. A file deleted from the folder stays in the memory until
import purge. - Windows:
- WSL is not tested, and Windows on Arm has no binary.
- The native runtime is the only runtime there (
server runtime switchis refused). It serves this PC only, has no web UI, and starts with your logon, not at boot. backsight server statuskeeps showing the server's last refusal while it is stopped, until a start passes the check.- backsight's
.exefiles are not code-signed: SmartScreen or Smart App Control may warn about them. The install script checks the release signature before it runs anything.
- The ter...
v1.2.0
Codex support. backsight gives OpenAI's Codex the same memory as Claude Code: one server, one memory, shared by both tools on one PC or across several. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested. Codex is tested on Linux, in CI, with a real Codex 0.167.0 against a fake model; Codex on Windows is not checked on a real PC yet.
Update from v1.0.1 or any earlier release with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code, so it loads the new plugin, and a running dashboard (Ctrl+C, then backsight dashboard). To add Codex, see below. New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade. The memory bank's template is unchanged.
- The instruction set is v19 (v18 before): the skills and the first session's notice in Codex's words. Claude Code's texts are unchanged.
- The Claude Code plugin: only the doctor skill's allowed commands change, adding
backsight guide codexfor the new Codex page. Its hooks, its memory server and the other skills are as before. The memory tools now declare what they touch, for Claude Code too (below). - The metrics index's schema changes: each table fed by a usage or journal line gains a
clientcolumn, the coding tool, and keeps every row, counted as Claude Code's.backsight update applymigrates it once the update is committed, and an older backsight that opens it afterwards works on a side file of its own (A newer index). - Two client migrations edit
config.toml, each through the config editor (a backup copy of the file first;backsight client config restore <run>undoes it).0100-clients-tablerenames[client]to[clients.claude_code], in place, with your comments.0101-headless-skip-entrypointsbringsprivacy.skip_entrypointsfrom its former default, exactly["sdk-*"], to the new one, which also skips headless Codex; a value of your own is left as it is. - Before installing an older backsight by hand: an older version refuses
[clients.claude_code], a table it does not know, and every command stops onconfig.toml. Rename the header line back to[client](the keys under it stay as they are) before installing it. With Codex wired, unwire it first (backsight client uninstall --codex): an older backsight cannot run Codex's hooks or its memory server. A failedupdate applyis not affected: its rollback puts back yourconfig.tomlitself (troubleshooting).
To add Codex (0.167.0 or newer, with codex on your PATH) to an install already set up:
backsight client install --codex(--planfirst), as the Codex page recommends. Then, as you want:backsight retain backfill --tools codexsends your past Codex sessions,backsight import --from codeximports Codex's own memories,backsight client codex-memories offturns them off.- Or run
backsight setupagain: with Codex found, it asks which tools to wire (tools,bothby default when Claude Code is there) and, with Codex picked, offers those three steps.
Then restart Codex and trust backsight's hooks in the review Codex shows at start (or under /hooks). Until you do, the memory tools and skills work but no hook runs: no briefing, no recall on prompts, no end-of-turn check (trust the hooks).
What changed
Codex
Codex 0.167.0 or newer. Everything in the docs applies to both tools; Codex covers what is Codex's own.
- Setup offers Codex when it finds it in its home (
--codex-home <dir>, else$CODEX_HOME, else~/.codex): atoolsquestion,claude-code,codexorboth,bothby default when Claude Code is installed too, so a non-interactive setup on such a PC wires both. Without Codex, setup asks nothing new. With Codex alone, Claude Code's steps are skipped. The Codex home it wires is recorded: every later command uses that one, whateverCODEX_HOMEsays (#298). - Two Codex plugins, generated by the binary in their own marketplace:
backsight@backsightholds the memory server and the six skills,backsight-hooks@backsightthe hooks alone, so an update that changes only a skill or the server leaves your hooks trusted (#298). - The memory server is named
backsightin Codex: its tools aremcp__backsight__memory_searchand so on, where Claude Code keepsmcp__plugin_backsight_memory__…. An MCP server of yours namedbacksightstops setup andclient install --codex, which name it; one namedmemoryis no clash (#304). - Hooks, behind Codex's trust review. Codex runs a plugin's hooks only once you trust them, and backsight never trusts them for you. Codex asks again only when an update changes the hooks or backsight's data directory moves. A Codex session then gets what a Claude Code one does: the guide and the briefing (with your first prompt: Codex runs its session-start hooks then), up to 3 memories per prompt, the end-of-turn check, a subagent's short guide and its report kept, and the question gate on Codex's
request_user_input. Text a hook adds is cut at 9,000 bytes, at a line's end, so Codex never spills it to a file (#297). - Skills as
$backsight:<name>: the same six, in Codex's words.$backsight:memory-retroproposesAGENTS.mdwhere Claude Code hasCLAUDE.md, and$backsight:updateends by asking you to restart Codex. What Claude Code enforces through a skill's allowed tools is written in the text: pause resumes only on your own words, doctor asks before a command that changes the install (#309). - No approval prompt for the memory tools.
memory_searchandmemory_readdeclare that they only read;memory_storeandmemory_creditthat they change nothing outside the memory and reach nothing else. Codex runs tools declared so without asking, in its terminal UI and incodex exec; backsight writes no approval setting. Claude Code is served the same declarations. Each memory call names its own Codex session: a call that names none is refused bymemory_store(store from the shell withbacksight store) and bymemory_credit(#295). - The sandbox. The skills'
backsightcommands run in Codex's shell, whichworkspace-writeconfines (no writes outside the workspace, no network by default). When it blocks one, the skills tell Codex to run that same command again, and only that one, with escalated permissions, which Codex asks you to approve (#309). - Codex's own memories. When they are on, setup offers to import them (
codex_import,yesrecommended), then to turn them off (codex_memories,offrecommended); nothing changes without your answer. At any time:backsight import --from codex,backsight client codex-memories off(oron). The import sendsmemory_summary.mdandMEMORY.mdto the transverse project, and a conversation's summary to its folder's project only when the conversation itself is no longer on disk (the backfill sends the conversation, which holds more). A folder kept out of memory stays out, and Codex's merged files are skipped while they may quote one (#300). - Your Codex sessions in memory, read only in the Codex home backsight wired (none before you wire it), compressed ones (
.jsonl.zst) included: your prompts, Codex's replies and one line per tool call, as from a Claude Code transcript, taggedharness:codex. A resumed session continues its document; a subagent's thread becomes its report (#296). - Backfill per tool. Setup's
backfillquestion covers each tool it wires, and names them once Codex is among them ("Send your 3 past sessions (2 Claude Code, 1 Codex) to the memory…"); with Claude Code alone its text is as before. By hand:backsight retain backfill --tools claude-code,codexorboth(#316). - Headless Codex is not recorded by default:
codex exec, Codex's SDKs, its app server SDK, and Codex run as another agent's tool. Their turns are never sent and their subagents send no report; recall still works there.privacy.skip_entrypointsgains their patterns, and an install that kept the former default gets the new one at the update (headless Codex, #296, #303). - Nested shells. In a shell inside Codex,
backsight pause,store,whyandfeedback logtake that Codex session, also when Codex was started from a Claude Code session's shell: Codex's session-start hook records which Claude Code session started it. Claude Code started from a Codex shell keeps its own session (pausing in Codex, #297, #309). backsight verify --codexruns each hook as Codex sends it, the memory server as Codex starts it, then a store-and-recall round trip; setup runs it when it wires Codex (#316).- Doctor and report. Once Codex is wired,
backsight doctoradds nine checks:codex(the version),codex-plugins,codex-drift,codex-hooks(trusted, and run in the latest session),codex-tools,codex-rollouts,codex-memories,codex-mcp-nameandcodex-shim(the program behind the shim).backsight reportadds a Codex section.$backsight:doctorruns both from Codex (https://git...
v1.0.1
Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from v1.0.0 or any v0.1 with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code, so it reads the memory tools' new answers, and a running dashboard (Ctrl+C, then backsight dashboard). New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade.
- The instruction set is v18 (v17 before): the
memory_storeanswers below. - The memory bank gets a new template, with the new extraction rules below: it is sent once, at the next bank apply, which
update applyruns. Memories already extracted are not extracted again. On a PC that uses another PC's server, the server's PC sends it once that PC is updated. - The plugin and the metrics index are unchanged.
- From the update on,
injection.contradictedno longer counts a prompt that came after a subagent's hand-back or another session's message, so it can drop once.
What changed
An audit of two weeks of one install's memory, checked against its sessions, found that extraction generalises: a plan written in a note came back as a delivered fact, and a constraint given to a subagent for one task came back as your standing rule. A correction then could not always retire what it replaced. Nothing wrong was done from these memories, since your own words won each time, but a session without them would get a confident, contradictory answer (#317, #318).
- Plans stay plans. The bank's extraction rules say that a plan, an assignment or an intended step is never a delivered outcome: kept, it is recorded as planned, with its date. Only a source that says something was done, verified, merged or released gives a delivered state. A note that states a plan keeps it a plan.
- A task's constraints stay the task's. What a subagent was told for its task ("do not merge", "do not push") is not extracted as your rule, and a permission or restriction you give for one task is recorded with that scope. When the server consolidates memories, a fact with no date of its own no longer reads "since" the day it was mentioned, and a rule you stated outranks one inferred from an agent's report.
- A correction can retire what it replaces. A fact Claude stores as a
correctionnow shows up to 2 similar memories, from a score of 0.6 (recall.store_correction_min_score) instead of one from 0.8: the memory a correction replaces is often worded otherwise. Withfeedback.enabledon (the default), everymemory_storeanswer that shows a memory now asks Claude, when the fact replaces it, to report it outdated withmemory_credit, which retires it:🧠🔄 Updatedalone names the memory and retires nothing. - The retirement limit counts memories.
feedback.max_retirementscounted the raw facts retired, so one observation drawn from 3 facts used 3 of the 3 allowed; it now counts each memory Claude reports once, an observation retired through any number of its facts, over any number of calls, included. Its default goes from 3 to 10. The other guards are unchanged: a memory shown in the session, a correction and its evidence on every report,feedback.cross_project_retire, and the line printed with its undo. A limit you set inconfig.tomlis kept. backsight readtakes a short id. The 8 characters the lines from memory print are enough when this PC's record of what was shown holds a memory starting with them, asmemory_readdoes; several, or none, exit 2 and ask for more of the id, instead of the server'sHTTP 400.- Corrections after memory was shown, measured truer.
injection.contradictedjudged the prompt after an injection whatever came between; after a subagent's hand-back or another session's message, that prompt answers that work, not the memory. It is still logged, never as contradicted. - Built with Go 1.27.4 (1.26.10 before), with the standard library's latest fixes (#302).
- New setting,
recall.store_correction_min_score = 0.6, and a new default,feedback.max_retirements = 10; backsight writes neither inconfig.toml(configuration). An older backsight refuses aconfig.tomlwith a key it does not know: removestore_correction_min_scoreif you set it, before installing an older version (a failedupdate applyputs back yourconfig.tomlitself).
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
Known limits
- The new extraction rules apply to what is extracted from now on: a memory already wrong stays until Claude reports it or you retire it (
backsight memory stale,backsight forget <id>). Whether the server's model follows them is checked on live extractions, not in tests. - A fact Claude stores as a correction, then reports outdated with
memory_credit, is stored as two correction notes. - Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails its writes until the state directory is back on a local disk.
stats daysreads a year of prompts with no index for it (about 0.1 s locally). - Import: a file the server keeps rejecting holds that folder's next files until it passes. The last tick before a cap can overshoot it by what was already in flight. A file deleted from the folder stays in the memory until
import purge. - Windows:
- WSL is not tested, and Windows on Arm has no binary.
- The native runtime is the only runtime there (
server runtime switchis refused). It serves this PC only, has no web UI, and starts with your logon, not at boot. backsight server statuskeeps showing the server's last refusal while it is stopped, until a start passes the check.- backsight's
.exefiles are not code-signed: SmartScreen or Smart App Control may warn about them. The install script checks the release signature before it runs anything.
- The terminal's look:
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
chcp 65001): many consoles default to another one. - The views' tables (
stats <view>) and section headings are not colored yet, norsetup --undo's list. - The braille logo needs a font with braille characters (most coding fonts have them); with one that lacks them, set
terminal.logo = "blocks". The logo's dot can take two columns in an East Asian terminal.
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
- A new install reads "learning" for its first week, and some numbers read "too few" until enough prompts and turns accumulate.
- Extraction cost needs a price: the built-in table's, or one set under
[llm]in the config file for another model (doctor'spricecheck says when none is known). The server reports token counts for all PCs together. - On native, PostgreSQL is 18.1 with pgvector 0.8.5, where the Docker image runs 18.6 with 0.8.7;
backup verifyruns in the runtime that will restore. - On Windows, the commands the dashboard and
stats --jsonoffer to copy are quoted for PowerShell; run through Git Bash, a name holding an apostrophe comes out without it. - Claude cannot run
/reload-plugins: after an update from the session, you type it. - A LAN address carries the API key in clear; a tailnet address encrypts it.
- The shared part of a session continued on two PCs may be stored twice.
- Several PCs: a PC sends its figures once a UTC day, up to the day before, so another PC's today is not in all PCs until the next day; the others' figures are fetched every 6 hours. A PC counts in a window by the noon (UTC) of each of its days. The other PCs send no project, session or memory: Project...
v1.0.0
First stable release. Releases drop their pre-release suffix from this one on. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from any v0.1 with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code and a running dashboard (Ctrl+C, then backsight dashboard). New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade.
- The instruction set (v17), the bank template, the plugin and the metrics index are unchanged.
- A v0.1 install is a pre-release one, so it is offered v1.0.0 as usual. Once on v1.0.0, a later pre-release is offered only with
prereleases = trueunder[update]inconfig.toml(update).
What changed
memory_search returns every hit above its floor, up to 20. It stopped at 8, though memories are short: a search with many strong hits dropped some that scored as high as the ones shown. The relevance floor (0.4) still decides which hits come back; the limit only caps a long answer, which costs about 2,500 tokens at 20 hits.
- Each server call of a search now brings up to 3,000 tokens of memories (1,500 before), so one query alone can fill the 20; a search takes as long as before (about 1 s on a local server).
- Recall at each prompt is unchanged: same floors, same 1,500 tokens a call, at most 3 memories.
backsight searchhas the same defaults (--limit 20,--min-score 0.4).memory_search'slimitandmin_scorestill change them for one search.
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
Known limits
- Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails its writes until the state directory is back on a local disk.
stats daysreads a year of prompts with no index for it (about 0.1 s locally). - Import: a file the server keeps rejecting holds that folder's next files until it passes. The last tick before a cap can overshoot it by what was already in flight. A file deleted from the folder stays in the memory until
import purge. - Windows:
- WSL is not tested, and Windows on Arm has no binary.
- The native runtime is the only runtime there (
server runtime switchis refused). It serves this PC only, has no web UI, and starts with your logon, not at boot. backsight server statuskeeps showing the server's last refusal while it is stopped, until a start passes the check.- backsight's
.exefiles are not code-signed: SmartScreen or Smart App Control may warn about them. The install script checks the release signature before it runs anything.
- The terminal's look:
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
chcp 65001): many consoles default to another one. - The views' tables (
stats <view>) and section headings are not colored yet, norsetup --undo's list. - The braille logo needs a font with braille characters (most coding fonts have them); with one that lacks them, set
terminal.logo = "blocks". The logo's dot can take two columns in an East Asian terminal.
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
- A new install reads "learning" for its first week, and some numbers read "too few" until enough prompts and turns accumulate.
- Extraction cost needs a price: the built-in table's, or one set under
[llm]in the config file for another model (doctor'spricecheck says when none is known). The server reports token counts for all PCs together. - On native, PostgreSQL is 18.1 with pgvector 0.8.5, where the Docker image runs 18.6 with 0.8.7;
backup verifyruns in the runtime that will restore. - On Windows, the commands the dashboard and
stats --jsonoffer to copy are quoted for PowerShell; run through Git Bash, a name holding an apostrophe comes out without it. - Claude cannot run
/reload-plugins: after an update from the session, you type it. - A LAN address carries the API key in clear; a tailnet address encrypts it.
- The shared part of a session continued on two PCs may be stored twice.
- Several PCs: a PC sends its figures once a UTC day, up to the day before, so another PC's today is not in all PCs until the next day; the others' figures are fetched every 6 hours. A PC counts in a window by the noon (UTC) of each of its days. The other PCs send no project, session or memory: Projects, Sessions and Memories stay this PC's, and a project filter does not narrow the others (
other PCs: not filtered). The verdict stays this PC's. Speed across PCs is a range from time buckets, never an exact time, and the PCs' figures are trusted as sent: nothing signs them. - The feedback database:
- The ledger lookup's speed is measured on Linux only: Windows has no bench yet.
- After a rollback to an older version and an update again, the counts that version added catch up at the first tick.
- In a rare race during an update or a rollback, an older version can leave one tick's shows out of its
ledger.json; this version's next tick counts them.
Report problems at https://github.com/Barben360/backsight/issues, after reading the diagnostic backsight report prints, or ask Claude /backsight:doctor. Report vulnerabilities privately, as https://github.com/Barben360/backsight/blob/main/SECURITY.md describes.
v0.1.37-m7
Pre-release. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from any earlier v0.1 with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code and a running dashboard (Ctrl+C, then backsight dashboard). New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade.
- The instruction set is v17 (v16 before):
memory_searchtells Claude to name another project inprojectswhen the task involves it. The bank template, the plugin and the metrics index are unchanged.
What changed
Claude knows your other projects' names, and searches them when they come up. Until now a search reached another project's memories only by a strong match, and Claude had to guess a project's name to search it.
- At a new session, after
/clearand after a compaction, one line names the current project, the projects searched with it, and up to 12 others, most recently active first. Projects with fewer than 10 memories, and those quiet for 90 days, are left out. It costs 300 to 500 characters of context, once. - A prompt that names another project (its whole name, 5 characters or more) searches that project too, and adds one line saying how to search it further, once per project per session.
memory_searchwith a project name the memory does not know adds a last line with the nearest names; the search still runs.- The names come from the entity index, which now also holds the projects (their memory counts and last activity). The first
jobs tickafter the update (they run every 15 minutes) rebuilds it, so the line appears soon after, without a server call from the hooks (how it works).
backsight doctor prints each check as soon as it is done at a terminal, rather than nothing until its slowest check returns (up to 10 s), which looked hung. Into a file, a pipe or with --json, the report is still written at the end, unchanged.
The documentation had a full pass, true to the code again.
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
Known limits
- Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails its writes until the state directory is back on a local disk.
stats daysreads a year of prompts with no index for it (about 0.1 s locally). - Import: a file the server keeps rejecting holds that folder's next files until it passes. The last tick before a cap can overshoot it by what was already in flight. A file deleted from the folder stays in the memory until
import purge. - Windows:
- WSL is not tested, and Windows on Arm has no binary.
- The native runtime is the only runtime there (
server runtime switchis refused). It serves this PC only, has no web UI, and starts with your logon, not at boot. backsight server statuskeeps showing the server's last refusal while it is stopped, until a start passes the check.- backsight's
.exefiles are not code-signed: SmartScreen or Smart App Control may warn about them. The install script checks the release signature before it runs anything.
- The terminal's look:
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
chcp 65001): many consoles default to another one. - The views' tables (
stats <view>) and section headings are not colored yet, norsetup --undo's list. - The braille logo needs a font with braille characters (most coding fonts have them); with one that lacks them, set
terminal.logo = "blocks". The logo's dot can take two columns in an East Asian terminal.
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
- A new install reads "learning" for its first week, and some numbers read "too few" until enough prompts and turns accumulate.
- Extraction cost needs a price: the built-in table's, or one set under
[llm]in the config file for another model (doctor'spricecheck says when none is known). The server reports token counts for all PCs together. - On native, PostgreSQL is 18.1 with pgvector 0.8.5, where the Docker image runs 18.6 with 0.8.7;
backup verifyruns in the runtime that will restore. - On Windows, the commands the dashboard and
stats --jsonoffer to copy are quoted for PowerShell; run through Git Bash, a name holding an apostrophe comes out without it. - Claude cannot run
/reload-plugins: after an update from the session, you type it. - A LAN address carries the API key in clear; a tailnet address encrypts it.
- The shared part of a session continued on two PCs may be stored twice.
- Several PCs: a PC sends its figures once a UTC day, up to the day before, so another PC's today is not in all PCs until the next day; the others' figures are fetched every 6 hours. A PC counts in a window by the noon (UTC) of each of its days. The other PCs send no project, session or memory: Projects, Sessions and Memories stay this PC's, and a project filter does not narrow the others (
other PCs: not filtered). The verdict stays this PC's. Speed across PCs is a range from time buckets, never an exact time, and the PCs' figures are trusted as sent: nothing signs them. - The feedback database:
- The ledger lookup's speed is measured on Linux only: Windows has no bench yet.
- After a rollback to an older version and an update again, the counts that version added catch up at the first tick.
- In a rare race during an update or a rollback, an older version can leave one tick's shows out of its
ledger.json; this version's next tick counts them.
Report problems at https://github.com/Barben360/backsight/issues, after reading the diagnostic backsight report prints, or ask Claude /backsight:doctor. Report vulnerabilities privately, as https://github.com/Barben360/backsight/blob/main/SECURITY.md describes.
v0.1.36-m7
Pre-release. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from any earlier v0.1 with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code and a running dashboard (Ctrl+C, then backsight dashboard). New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade.
- The instruction set is unchanged (v16). The bank template, the plugin and the metrics index are unchanged.
What changed
The splash draws the braille logo by default, finer than the half blocks of v0.1.35-m7. [terminal] logo = "blocks" in config.toml brings the half blocks back, for a font without braille characters (configuration). A console that is not UTF-8 still gets the ASCII logo.
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
Known limits
- Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails its writes until the state directory is back on a local disk.
stats daysreads a year of prompts with no index for it (about 0.1 s locally). - Import: a file the server keeps rejecting holds that folder's next files until it passes. The last tick before a cap can overshoot it by what was already in flight. A file deleted from the folder stays in the memory until
import purge. - Windows:
- WSL is not tested, and Windows on Arm has no binary.
- The native runtime is the only runtime there (
server runtime switchis refused). It serves this PC only, has no web UI, and starts with your logon, not at boot. backsight server statuskeeps showing the server's last refusal while it is stopped, until a start passes the check.- backsight's
.exefiles are not code-signed: SmartScreen or Smart App Control may warn about them. The install script checks the release signature before it runs anything.
- The terminal's look:
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
chcp 65001): many consoles default to another one. - The views' tables (
stats <view>) and section headings are not colored yet, norsetup --undo's list. - The braille logo needs a font with braille characters (most coding fonts have them); with one that lacks them, set
terminal.logo = "blocks". The logo's dot can take two columns in an East Asian terminal.
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
- A new install reads "learning" for its first week, and some numbers read "too few" until enough prompts and turns accumulate.
- Extraction cost needs a price: the built-in table's, or one set under
[llm]in the config file for another model (doctor'spricecheck says when none is known). The server reports token counts for all PCs together. - On native, PostgreSQL is 18.1 with pgvector 0.8.5, where the Docker image runs 18.6 with 0.8.7;
backup verifyruns in the runtime that will restore. - On Windows, the commands the dashboard and
stats --jsonoffer to copy are quoted for PowerShell; run through Git Bash, a name holding an apostrophe comes out without it. - Claude cannot run
/reload-plugins: after an update from the session, you type it. - A LAN address carries the API key in clear; a tailnet address encrypts it.
- The shared part of a session continued on two PCs may be stored twice.
- Several PCs: a PC sends its figures once a UTC day, up to the day before, so another PC's today is not in all PCs until the next day; the others' figures are fetched every 6 hours. A PC counts in a window by the noon (UTC) of each of its days. The other PCs send no project, session or memory: Projects, Sessions and Memories stay this PC's, and a project filter does not narrow the others (
other PCs: not filtered). The verdict stays this PC's. Speed across PCs is a range from time buckets, never an exact time, and the PCs' figures are trusted as sent: nothing signs them. - The feedback database:
- The ledger lookup's speed is measured on Linux only: Windows has no bench yet.
- After a rollback to an older version and an update again, the counts that version added catch up at the first tick.
- In a rare race during an update or a rollback, an older version can leave one tick's shows out of its
ledger.json; this version's next tick counts them.
Report problems at https://github.com/Barben360/backsight/issues, after reading the diagnostic backsight report prints, or ask Claude /backsight:doctor. Report vulnerabilities privately, as https://github.com/Barben360/backsight/blob/main/SECURITY.md describes.
v0.1.35-m7
Pre-release. Linux amd64 is tested; Windows amd64 is tested in CI. The Linux arm64 and macOS binaries are built but not tested.
Update from any earlier v0.1 with backsight update apply: it takes a verified backup first and rolls back if a step fails. Then restart Claude Code and a running dashboard (Ctrl+C, then backsight dashboard). New install: see below.
- The server is unchanged (Hindsight 1.2.0): no server upgrade.
- The instruction set is unchanged (v16). The bank template, the plugin and the metrics index are unchanged.
config.tomlmay gain a[terminal]section, written by you only: an older backsight refuses it, so remove it before installing an older version.
What changed
backsight looked bleak at a terminal. It now has color and a splash there, and only there: what programs and Claude read is byte for byte what it was (#257).
A splash (#266): at an interactive terminal at least 72 columns wide, a command starts with the backsight logo beside a short panel about backsight itself, never about the project:
- the version and Hindsight's;
- the server's last answer, or since when it is silent;
- the setup (
host · docker,client of <host>,not set up yet · backsight setup); - the sessions and notes waiting to be sent;
- the last daily checks (
50 ok · 2 warn · 0 fail (last run 3h ago)); - a newer release, with the command that installs it.
It reads a few local files under a 50 ms budget, writes and creates nothing, and leaves out a line it cannot read in time. --no-splash or BACKSIGHT_SPLASH=0 hides it. [terminal] logo = "braille" draws a finer logo; a console that is not UTF-8 gets an ASCII one.
doctor,version,update check,update applyandstatswith its views are colored by meaning: green for ok, amber for a warning, red for a failure, cyan for a command to run, dim for times and ids. Every status keeps its word.- So are the step lines of
setup,connect,restore,update apply,server installandserver runtime, the plans and results ofsetup,connectanduninstall, and setup's questions. - On stderr,
backsight:before an error is red, andretain backfillandrestorecolor their progress. - Passphrase and secret prompts, and the commands whose output is a value to capture (
secret,server token,backup identity show,jobsand the hooks), are never colored.
For people only: color and the splash appear only when the stream is a terminal itself.
- A pipe, a redirect,
--json, a scheduled job (its Windows log too) and Claude Code's shell (CLAUDECODE) get plain text, unchanged. --color auto|always|never,BACKSIGHT_COLORandNO_COLORset it.FORCE_COLORandCLICOLOR_FORCEare ignored, so a shell profile cannot send color into Claude's commands.- On Windows the console's color mode is turned on for the command and put back after it, Ctrl-C included.
- Commands lists the classes; configuration lists the variables.
Install
On Linux:
curl -fsSL https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.sh | sh
backsight setupOn Windows x86_64, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/Barben360/backsight/main/scripts/install.ps1 | iex"
backsight setupRequirements as for v0.1.22-m7. On Windows, Claude Code must find Git Bash: if Git for Windows is portable or installed in a place of your own, set CLAUDE_CODE_GIT_BASH_PATH to its bin\bash.exe (doctor's git-bash check gives the command).
Known limits
- Dashboard:
- Version switches and settings changes are marked on a day's page and on Releases only, not on every chart.
- The custom window goes back 13 months, as far as this PC keeps its history.
- Time to recall needs a few days of history, and 20 sessions before it shows times; it is judged (ok or watch) only from 100 sessions, and reads "too few" until then.
- A window, custom or typed in a URL, can span at most 400 days, between 2000 and 2099.
- Bank growth still counts a UTC day that straddles the window's start as a whole day.
- Memory yield needs four weeks: a week counts 28 days after it ends.
- On a window over 200 days, charts show no per-day values on hover, and "Show as a table" lists the latest 120 days.
- A week that is not complete shows no count of new memories.
- The project filter takes a typed name, not a pick from a list (the Projects page lists the names). The Projects list cannot be sorted. The context card names the session budget rather than showing its value.
- GPU reranker:
- It needs the Docker runtime, on the server's PC.
- Tested on one NVIDIA RTX A2000 (Linux) and one AMD Radeon 890M (Linux). Intel GPUs, macOS and Windows are not tested.
- Owner checks:
- The short-lived native units created during install, start and restore are not checked.
- On Windows, when neither
schtasksnor the task's file can be read, the task is driven as before.
retain resend-failed: it does not cover notes and sub-agent reports sent while extraction failed (the queue drops them once sent). A transcript rewritten or moved after its worktree was deleted loses the project recorded for those turns, so the session is then filed by today's rules.- The metrics index: an index already in write-ahead mode whose folder no longer allows it fails its writes until the state directory is back on a local disk.
stats daysreads a year of prompts with no index for it (about 0.1 s locally). - Import: a file the server keeps rejecting holds that folder's next files until it passes. The last tick before a cap can overshoot it by what was already in flight. A file deleted from the folder stays in the memory until
import purge. - Windows:
- WSL is not tested, and Windows on Arm has no binary.
- The native runtime is the only runtime there (
server runtime switchis refused). It serves this PC only, has no web UI, and starts with your logon, not at boot. backsight server statuskeeps showing the server's last refusal while it is stopped, until a start passes the check.- backsight's
.exefiles are not code-signed: SmartScreen or Smart App Control may warn about them. The install script checks the release signature before it runs anything.
- The terminal's look:
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
chcp 65001): many consoles default to another one. - The views' tables (
stats <view>) and section headings are not colored yet, norsetup --undo's list. - The braille logo (
terminal.logo = "braille") needs a font with braille characters; the logo's dot can take two columns in an East Asian terminal.
- On Windows, the splash draws the ASCII logo unless the console's code page is UTF-8 (65001;
- A new install reads "learning" for its first week, and some numbers read "too few" until enough prompts and turns accumulate.
- Extraction cost needs a price: the built-in table's, or one set under
[llm]in the config file for another model (doctor'spricecheck says when none is known). The server reports token counts for all PCs together. - On native, PostgreSQL is 18.1 with pgvector 0.8.5, where the Docker image runs 18.6 with 0.8.7;
backup verifyruns in the runtime that will restore. - On Windows, the commands the dashboard and
stats --jsonoffer to copy are quoted for PowerShell; run through Git Bash, a name holding an apostrophe comes out without it. - Claude cannot run
/reload-plugins: after an update from the session, you type it. - A LAN address carries the API key in clear; a tailnet address encrypts it.
- The shared part of a session continued on two PCs may be stored twice.
- Several PCs: a PC sends its figures once a UTC day, up to the day before, so another PC's today is not in all PCs until the next day; the others' figures are fetched every 6 hours. A PC counts in a window by the noon (UTC) of each of its days. The other PCs send no project, session or memory: Projects, Sessions and Memories stay this PC's, and a project filter does not narrow the others (
other PCs: not filtered). The verdict stays this PC's. Speed across PCs is a range from time buckets, never an exact time, and the PCs' figures are trusted as sent: nothing signs them. - The feedback database:
- The ledger lookup's speed is measured on Linux only: Windows has no bench yet.
- After a rollback to an older version and an update again, the counts that version added catch up at the first tick.
- In a rare race during an update or a rollback, an older version can leave one tick's shows out of its
ledger.json; this version's next tick counts them.
Report problems at https://github.com/Barben360/backsight/issues, after reading the diagnostic backsight report prints, or ask Claude /backsight:doctor. Report vulnerabilities privately, as https://github.com/Barben360/backsight/blob/main/SECURITY.md describes.