Repository navigation
v1.93.0 - Honest Budgets and Self-Healing Edges
Open Second Brain v1.93.0 - Honest Budgets and Self-Healing Edges
Open Second Brain v1.93.0 closes the gap between what a configuration promises and what the model, the filesystem and the package manager actually do. A page holding one long link produced a chunk declared at 4 tokens that the embedding model reads as more than 1,700, a retirement was stamped with a log link the device never writes, a decision-model call answered only if its single configured provider answered and kept its per-model enforce thresholds in the compiled source table, a Codex marketplace add or upgrade replaced the checkout and took the dependency tree with it, and the external review of v1.92.0 found two paths that let marker-private content leave the vault, a quadratic regex on the synchronous write-receipt path, a hold rule that withheld fitting chunks from embedding, and an entity-ranking rule that let one entity match outrank higher-scoring results. Now a long whitespace-free run is charged at a conservative token rate and split across chunks that each fit the budget, retirement provenance resolves the same log shard the appender writes, decision-model providers answer in a configured order with fallback inside the existing budgets and per-model thresholds live beside config.yaml keyed by the model the server reports, the launchers repair a stripped checkout before the first command runs, and all twenty-seven review findings are closed here with regressions.
What ships
- Chunks fit the model window when a page is one long URL. The chunker's token estimator counted any whitespace-free run as one word, so a page holding a single long link produced a chunk declared at 4 tokens that the embedding model reads as more than 1,700 - past its 512-token input window, where the serving stack silently truncated it. A whitespace-free run of 16 characters or more is now charged one token per 3 characters, and the splitter cuts inside such a run - never inside a
[[wikilink]]when an alternative cut point exists - so the text is distributed across chunks that each fit the budget and every character stays indexed; reducingsearch_chunk_sizetherefore works for link-heavy pages, and the chunker version moves to 3, which schedules a one-time re-chunk of the index. - Retirement provenance names the log shard the device writes. A merge retirement, a dream retirement and
brain rejectstampedretired_by: [[Brain/log/<date>]]while the log appender - for a vault with a configureddevice_id- writesBrain/log/<date>.<device>.md, so the doctor reported every fresh retirement as a broken link. All three now build the link through one helper that resolves the same shard id the appender resolves: sharded when a device id is configured, byte-identical to the historical shape when not, and historical records are untouched. - Decision-model providers answer in a configured order with budgeted fallback, and per-model thresholds live in the installation.
decision_model_providersaccepts an ordered list, with the singledecision_model_providerkept as the one-entry form: the first provider that answers serves the call, a connection error or timeout falls through to the next entry within the sametimeout_ms/hook_budget_msbudget, so a dead local server never stalls a hook, and everydecision_model_callrecord names the provider and model that actually answered, so reports never pool two models;o2b decision-model checkshows the order and which entries answer. Per-model enforce thresholds move out of the compiledDECISION_THRESHOLD_PROFILEStable - now the hosted baseline family only - intodecision-thresholds.jsonbesideconfig.yaml, keyed by the model id the server reports rather than the provider preset, with the entries of every model ever tuned kept across switches and an optional per-vault override; a use with no stored thresholds for the active model runs asshadowandcheck/reportsay so explicitly, naming the tuning command, ando2b decision-model thresholds fit --use <use>derives the threshold from the use's labelled report data against a false-action target, withthresholds list/thresholds setrounding the flow out. - A Codex marketplace add or upgrade leaves a launcher that starts. The marketplace flow replaces the checkout wholesale and takes
node_moduleswith it, so the first launcher command died importingproper-lockfilebeforeinstall-clicould repair anything. The bun launchers -o2b,o2b-mcp,o2b-aider,vault-logand their Windows twins - now probe for the dependency tree with one file stat and runbun install --frozen-lockfileonce when it is missing, refusing with the manual command named if that install fails; a warm checkout pays nothing, and a cold-checkout regression drives the real CLI entry point end to end. - All twenty-seven findings of the previous release's external review are closed here, each with its regression. The external review of v1.92.0 raised 6 High and 21 Medium findings, among them two paths that let marker-private content leave the vault - the decision-model gates and the knowledge-pack export treated a marker page like any other - a comma-joined digit run that backtracked quadratically on the synchronous write-receipt path, about forty-five seconds on a 256 KiB body, a hold rule that withheld ordinary English chunks that fit the model's window from embedding, and an entity-ranking rule that let one entity match outrank higher-scoring results. A marker page is now withheld at every egress exactly like a formally reserved one, with marker keys matched case-insensitively, the indexed visibility column re-measured on upgrade (schema v16) and an
update_noteguard that refuses a marker-key write only when it would clear or forge the deny status; the undated-quantity scan is linear and no longer reports numbers inside URLs, markdown link destinations and wikilink targets, dates inside code regions, or3D-style spellings; chunks are held only when even a conservative lower-bound estimate puts them over the window,search checkno longer recommends a backfill for held chunks and reports a declined provider as decided instead of not-configured; the declared-over-derived rule breaks only exact score ties, the usual spellingsA. LovelaceandLovelace, Adaand short operator nicknames resolve, and the nickname-derived index is built once per vault change; and the default OKF export no longer carries prompt-derived entries or kept pages' links, relations and citations to a page it left out, with--include-prompt-derivedcarrying all of it back.
Process wins
- One source per fact: every What ships claim traces to the 1.93.0 CHANGELOG entry or the merged PR #274 description, and the quality numbers come from the local gate run at the merge-branch head, never estimates.
- Review debt from the previous release is closed here with regression tests before merge: all twenty-seven findings of the v1.92.0 external review - 6 High and 21 Medium - are fixed in this release, among them two paths that let marker-private content leave the vault, a quadratic regex on the synchronous write-receipt path, a hold rule that withheld fitting chunks from embedding, and an entity-ranking rule that let one entity match outrank higher-scoring results. The diff exceeds CodeRabbit's 100-file limit at 123 files, so CodeRabbit skips this change set; the pre-merge local gates and the review-repair wave are the compensating review.
- Quality record: 20,574 tests / 0 fail at head 6825cbf, the exact content this release tags, squash-merged as 3064def, the openclaw bundle rebuilt with the CI-pinned Bun 1.4.0 and byte-verified by the release workflow's verify job, TypeScript clean, lint at 0 errors, version synced, and all 20 CI checks green.
Notes
- The provider-decline consent record covers the embedding provider; rerank and decision-model endpoints keep the declines their own settings record, and routing both through the embedding decline is recorded follow-up work, not something this release claims.
- The knowledge pack takes the same
--include-prompt-derivedoverride the other shared exports take, carrying the class-marked material back when an operator asks for it. - The era boundary is documented, never migrated: retirement links stamped before this release keep their historical shape, and pages written before the content-class stamp carry no mark and export exactly as they did, because a rewrite applied by a later pass would describe the pass and not the writer.
- The version bump to 1.93.0 shipped inside the PR (#274), per the project rule in
CLAUDE.md. - Release image: the canonical terminal style, here as an interaction diagram (animated GIF in this body; static PNG, 2x PNG and the SVG source attached as assets).
