Repository navigation
v0.60.32.0
Fix wave 7: automatic capture stops double-storing what you remember, the maintenance sweep reads whole transcripts, Gmail commitments and timelines work again on managed brains, gbrain upgrade refuses a Bun it can't run, the contradiction judge stops excusing undated conflicts, "who is waiting on me" ages and ranks requests honestly, and 62 community pull requests land.
When two notes give different numbers for the same thing and neither note has a date, nothing tells you which came first, so that is a conflict you need to resolve. The judge kept calling those pairs a change over time instead, guessing an order from the numbers themselves (the bigger headcount must be newer) or from the kind of note (a board deck must be newer than a memo). Prompt v4 tells it plainly not to do that, and that one note saying nothing about headcount does not contradict another note that gives one. On a fresh test world it now calls 149 of 150 planted same-time conflicts contradictions (was 131), all 50 undated ones included (was 37). The price is a few more false alarms: 14 of 820 unrelated pairs (was 11) and 5 of 50 compatible pairs (was 2).
gbrain waiting had four rough edges, all found by the gbrain-evals open-loops wave. A reply that only said "Thanks!" to someone's question closed the loop although the question was still open. An FYI whose only question mark sat inside a link opened a loop as if you had asked something. A first sync of an old inbox ranked a request that had waited 30 days as no older than one from yesterday, because a loop's age started when gbrain noticed it. And the ranking moved with the wall clock, so a published order could not be reproduced. All four are fixed; --as-of pins the clock.
| After upgrading | Before | After |
|---|---|---|
| Undated same-fact conflicts called a contradiction (fresh N2 seed) | 37/50 | 50/50 |
| All same-time conflicts called a contradiction (fresh N2 seed) | 131/150 | 149/150 |
| False alarms on unrelated / compatible pairs (fresh N2 seed) | 11/820, 2/50 | 14/820, 5/50 |
| "Thanks!" in reply to a question | closes the loop | loop stays open |
FYI whose only ? is inside a link |
opens a loop after 72 h | opens nothing |
| A 30-day-old request found on first sync | ranked as new | ranked 30 days old |
gbrain waiting order |
moves with the wall clock | pinnable with --as-of |
| "Who works at Acme?" when "Acme Labs" also exists | no seed, arm silent | seeds from the page titled "Acme" |
A meeting note's Participants: list |
mentions | attended |
segments.join("/") in a file that defines join |
resolved as a caller of join |
unresolved |
| Keyword-only answer to a question no page can answer | graded moderate | graded weak |
check-backlinks fix on a managed brain |
one refusal per page; dry run claims success | one clear refusal, dry run too |
A fact remembered, then seen again by automatic capture |
stored twice | stored once (corrections always kept) |
| Sweep extraction of a 120 KB session transcript | first 8,000 characters | whole transcript, in windows |
| Gmail commitments on a managed brain | never extracted | extracted every sweep |
gbrain upgrade to a release needing a newer Bun |
installs, then fails to start | refuses (exit 78); autopilot holds |
| Remote title search, rare term, 40k pages (Postgres) | ~490 ms | ~34 ms |
Conversation-facts backlog with source-evidence pages marked conversation_parseable: false |
never reaches zero | drains |
chronicle-backfill --limit N, run twice |
the same N pages again | the next N pages |
These came from the gbrain-evals category waves A4 (abstention), N2 (contradictions), N7 (open loops), N9 (multi-hop), N12 (meeting formats) and N13 (code intelligence), plus open issues garrytan#5341, garrytan#5330 and garrytan#5329, and the GBRA-35 lane's fixes for garrytan#5888, garrytan#5887, garrytan#5889, garrytan#5890, garrytan#5892, garrytan#5855, garrytan#5902, garrytan#5875, garrytan#5867, garrytan#5856, garrytan#5877, garrytan#5854, garrytan#5868 and garrytan#5869.
Memory capture got two fixes that change what lands in your brain. A fact your agent saved with remember was often stored a second time by automatic capture a moment later; capture now skips an exact same-claim copy on the same entity, and never skips a correction. And the maintenance sweep only ever read the first 8,000 characters of each session transcript, so everything said after that never became a fact. It now reads whole transcripts in turn-aligned windows and remembers where it stopped. That costs more model calls on long sessions (about 15 for a typical 120 KB transcript, capped per sweep).
Managed brains with Google connected had quietly stopped doing several jobs: Gmail commitments were never extracted, Gmail and Calendar pages got no links or timeline entries, quiet threads never opened their loops once the waiting window passed, and closing a commitment loop claimed it retired the fact when it hadn't. All four work again. gbrain upgrade now checks the target release's Bun requirement before swapping, so a host can no longer upgrade itself into a binary it can't start. An exact-title page ranks first in title search again, and remote title search is index-backed (a rare term on a 40k-page Postgres brain: about 490 ms to about 34 ms).
The release also absorbs 62 open community pull requests, each re-checked against current master: sync stops deleting pages it does not own and keeps skillpack files out of managed checkouts, backups and storage restores cover every source and every live page, Claude Sonnet 5.5 works and Sonnet 5 is priced at its standard rate, list_pages pages losslessly, a multi-line fact no longer blocks its page from being written, and two search paths get faster. Thank you to everyone listed below.
To take advantage of v0.60.32.0
gbrain upgrade installs the binary. There is no schema migration. Restart every gbrain serve, autopilot and worker afterwards so they run the new code.
- Meeting pages re-derive their attendees on their own. The link extractor version moved, so the next
gbrain extract --stale(or the autopilot cycle) re-readsParticipants:lists. - Expect one paid re-judge of contradictions. The judge prompt version moved to 4, so the next
gbrain eval suspected-contradictionsre-judges every pair. It prints its cost estimate first, as on any prompt change. - Existing loops get request-time ages when their thread is next checked. An open thread loop keeps the earlier of its stored age and the oldest unanswered message's time, so the next sync that touches a thread corrects an age set at detection time.
- Code call graphs pick up the member-call fix when a file re-imports. To refresh every code page now:
gbrain reindex-code. - Preview the two new explicit repairs, and apply only after you agree.
gbrain doctorreportscaptured_facts_active(facts captured before v0.60.30.0 from gbrain's own claude-cli sessions or pasted text) andloop_facts_drift(facts of loops closed before this release):Guide: docs/guides/repair.md.gbrain repair captured-facts # preview; apply with --apply --expect <hash> gbrain repair loop-facts # preview
- Decide on connector atom extraction. Atom extraction of connector
emailandmeetingpages is now opt-in on every brain. To keep it (the text of each thread or event goes to yourextract_atomsmodel):gbrain config set cycle.extract_atoms.connector_pages true. - Cached search results are invalidated once (
KNOBS_HASH_VERSION29 -> 30). If you changed your FTS language, rungbrain reindex-search-vectorso remote title search matches it. - Verify:
gbrain waiting --as-of 2026-10-01T12:00:00Z --json | grep as_of gbrain sweep --once --json # corpus_files[] shows windows_done / windows_remaining gbrain doctor
- If any step fails, file an issue at https://github.com/garrytan/gbrain/issues with the output of
gbrain doctorand~/.gbrain/upgrade-errors.jsonlif it exists.
Behavior changes
- Automatic capture skips an exact copy of a claim already stored in the same source on the same entity (or another entity the claim names), visible where the new fact would be, and written within 15 minutes of the turn or by capture in the same conversation. Reworded copies are never skipped, so corrections ("is not moving", a changed amount or place) are always kept. Explicit
rememberis never skipped (garrytan#5888). - The sweep extracts whole transcripts in turn-aligned windows of about 8,000 characters, with a
<file>.progresssidecar, capped at 8 windows per file and 32 per sweep (GBRAIN_CORPUS_WINDOWS_PER_SWEEP). Transcripts marked done before this release are not re-read; only turns added after the upgrade are extracted (garrytan#5887). gbrain upgradeandgbrain self-upgraderefuse a release whose Bun floor the host does not meet (exit 78, nothing changed);--no-bun-floor-checkupgrades anyway when the floor cannot be read. Autopilot holds the upgrade andself_upgrade_healthshows the hold and fix (garrytan#5855).- Remote title matching follows the language
search_vectorwas built with (garrytan#5889). - A synthesis publish still pending after the 30 s writer wait is a phase warning (
publish_pending), not a failure, and the next cycle finishes it (garrytan#5854). - Connector
emailandmeetingatom extraction is opt-in on every brain (cycle.extract_atoms.connector_pages). The auto-drain's daily cap counts attempts at the per-attempt estimate, so 6 attempts a day by default (garrytan#5856). loops_closereturns{ closed, id, status, fact_expired, retryable, reason? }and expires the fact and strikes its fence row in one coordinated write (garrytan#5869).gbrain extract timeline --source dbexits non-zero when a write is refused, naming the code and recovery (garrytan#5904 probe).- Short random passwords are redacted reliably. The
high_entropy_assignmentrule (retrieval redaction and memory relays) judges its 3.5 bits/char floor on bias-corrected entropy. Raw per-character entropy of a 12-16 character value is capped near log2 of its length, so the floor let through 68% of random 12-character secrets and 9% of 15-character ones; it now misses under 1%. A short weak password assigned to a password, secret or token key (password1234) now redacts too. All-digit values (counters, timestamps) never redact, as before. - Contradiction judge prompt v4. The time check comes first: the three temporal verdicts need two different dates (metadata or text) or explicit change wording, never an order guessed from the values, the document kind or which statement is listed first. A statement that does not mention an attribute does not conflict with one that states it. A negative claim about one party ("Fund A is not leading") and a positive claim about another ("Fund B is leading") agree. Matched A/B against prompt v3 on the fresh N2 development seed 20261002, one Haiku 4.5 judge sample per arm, 1,371 identical pairs: same-time conflicts caught 131/150 -> 149/150 (undated 37 -> 50, same-day 45 -> 49, mixed 49 -> 50), temporal recognition unchanged at 40/40, false contradictions on unplanted pairs 11/820 -> 14/820 and on compatible pairs 2/50 -> 5/50, judged-pair precision 91.0% -> 88.7%. A code rule that turned temporal verdicts without time evidence into contradictions was measured and rejected: on the counted seed it added about 65 false alarms, because Haiku uses a temporal label for unrelated pairs it misreads. The prompt version bump invalidates the judge cache (step 2).
- An acknowledgement-only reply to a question does not close a thread loop. "Thanks!", "Got it, thanks." or "Thanks, Bob!" after their question leaves the reply-owed loop open and its clock running. "Will do" and any reply with content still count as the reply. An acknowledgement of a message that asked nothing still closes it.
- A
?inside a link is not a question, so outbound FYIs that only share a link never openunanswered_outbound. - Loop age is request time.
opened_aton a thread loop is the oldest message in the trailing run that carries the obligation, not the detection time. open_loopstakesas_of(ISO 8601, default now) for due-date proximity, loop age and rendered ages, and echoes it in the grouped result;gbrain waiting --as-of <iso>passes it through. An invalid value is refused withinvalid_params.- Bare-name resolution prefers the exact title within one directory. When several pages share a bare name's prefix in one entity directory and exactly one is titled that name, it wins (
AcmeoverAcme Labs). A collision across directories, or two pages with the same exact title, stays unresolved as before. Participantsis attendance evidence everywhereAttendeesis: aParticipants:line,**Participants:**, or a## Participantslink-list section.- OR-relaxed keyword rows are not "keyword_exact". A row from the keyword fallback that matched some query terms but not the query reads
weak_semantic(create_safety: unknown), and CRAG grades a relaxed rank-1weakwith the new reasonkeyword_relaxed_top. A chunk that also appears in a strict list is not relaxed. gbrain check-backlinks fixrefuses a managed canonical worktree once, before scanning, with or without--dry-run.checkstill reports the gaps (garrytan#5341).- Conversation-facts eligibility is one rule. A page of a conversation type whose frontmatter says
conversation_parseable: false(a single-message source-evidence page, say) is never claimed byextract-conversation-factsand never counted by doctor'sconversation_facts_backlogor sampled byconversation_format_coverage, so the backlog can reach zero. Opt in to strict mode withgbrain config set cycle.conversation_facts_backfill.require_parseable_flag trueto admit onlytype: conversationpages and pages markedconversation_parseable: true. The backlog now also counts granular collector types (slack-thread,email-digest, ...) the way the extractor already enumerated them (garrytan#5330). chronicle_backfillmoves forward on every run. Eachchronicle_extractjob is keyed by source, page and content hash, so a repeat run skips pages already enqueued or extracted for their current content (reported asalready_enqueued) and enqueues up tolimitnew pages per type. An edited page is swept again (garrytan#5329, the backfill cursor).- Unpriced conversation models no longer stop fact extraction on a default cap.
extract-conversation-facts, theconversation_facts_backfillphase and transcript-ingest facts drop only the default USD cap, with a warning, when the extraction model has no price. An explicit cap still refuses withno_pricing, and the stop now names the model (garrytan#5825). list_pagestakesupdated_after_slugwithupdated_afterto resume strictly after a(updated_at, slug)keyset, and returnsupdated_at_iso; the truncation hint teaches that recipe (garrytan#5641).- Claude 5 models get native request shapes.
@ai-sdk/anthropicmoves to 3.0.125 (and the@ai-sdk/provider-utilsoverride to 4.0.56), so Claude 5 models are no longer senttemperatureor emulated structured output; Sonnet 5 and Sonnet 5.5 price at $2/$10 per million tokens (garrytan#5688, garrytan#5690). whoamiandcapabilitiesreport the transport of the verified principal, not the caller's claim (garrytan#5899).
Itemized changes
Contradictions (N2)
- Undated same-time conflicts: prompt v4 (above). Measured on the counted N2 seed and on a fresh development seed against prompt v3; numbers in behavior changes.
Open loops (N7)
- N7-2 acknowledgement-only replies (
isAcknowledgementOnly), N7-5 pinnable ranking clock, N7-6 request-timeopened_at(OpenLoopUpsert.openedAt; an open row keeps the earlier value), N7-7 link question marks (asksQuestion).
Graph and retrieval (N9, N12, A4)
- N9-5 exact-title tiebreak in bare-name prefix expansion, so the relational arm fires for colliding names.
- N12-6
Participantsattendance evidence;LINK_EXTRACTOR_VERSION_TSmoves to2026-10-02T00:00:00Z. - A4-2 relaxed keyword tops grade weak.
Code intelligence (N13)
- N13-8 a call through a receiver the extractor cannot type (
obj.m(), emitted as barem) is flaggedmemberCalland stored asedge_metadata.member_call; the within-file resolver never resolves it to a same-file top-level function. Bare-namecode_callersmatching is unchanged.
Maintenance
- garrytan#5341
check-backlinks fixmanaged-worktree refusal. - garrytan#5330 shared conversation-facts eligibility (
isConversationFactsEligiblePageand its SQL twin insrc/core/facts/conversation-types.ts). - garrytan#5329
chronicle_backfillidempotency keys and paging, no schema change. The issue's other parts (a cadence gate, extraction idempotency for directchronicle_extractruns, the no-sub-events page, the judge output cap) remain open.
Memory capture (garrytan#5888, garrytan#5887)
- What the agent saves with
rememberis no longer stored a second time by automatic capture (garrytan#5888). The writeback hook, the compaction harvest and the corpus sweep skip a fact only on an exact normalized match (rules above). Capture counts same-entity near duplicates (cosine 0.92 or higher) without dropping them, so a threshold can be measured first. Hot memory and thecontext_pack/deltafacts show one line per duplicate group. Each skip is logged on stderr and in the hook heartbeat, andgbrain doctor(memory_writeback) reportscross_lane_duplicates_7dandnear_duplicates_shadow_7d. - The maintenance sweep reads whole session transcripts, and a resumed session no longer re-extracts the same head (garrytan#5887). Windows break at turn boundaries and carry their
[user]or[assistant]label, pasted blocks are removed first, and the progress sidecar makes appends and compaction rewrites cost only their new turns.gbrain sweep --once --jsonreportscorpus_files[]withwindows_doneandwindows_remaining. Ported from garrytan#5897. Contributed by @javieraldape. - A capture or atom drain right after another managed write no longer refuses as "writer busy". The managed-facts preflight, the atom-maintenance session and the connector-sync preflight probed the worktree lock with no wait, while this process's own persistence consumer was still finishing the previous write (its receipt already read committed). A
rememberfollowed by automatic capture could lose that capture for a whole sweep cycle, and an atom drain burned one of its capped attempts. All three now share one bounded probe that waits up to 1 s (MANAGED_WRITER_PROBE_WAIT_MS); a writer still busy after that refuses withwriter_lock_unavailableas before. The connector-sync probe only exists to re-stamp a moved checkout's device, so a busy result there still lets the sync continue. - New explicit repair
gbrain repair captured-factsexpires facts captured before v0.60.30.0 from gbrain's own claude-cli sessions or from pasted text (doctorcaptured_facts_active; the post-upgrade banner names the preview). Self-capture facts with evidence expire with--apply --expect <hash>; paste candidates (a word-overlap heuristic against the retained session corpus) only with--include-ambiguous. A claim with a legitimate active copy is kept. Facts are expired, never withdrawn, soremembercan save the claim again.
Search (garrytan#5889, garrytan#5890, garrytan#5892)
- An exact-title page ranks first again in title search, for CLI and MCP callers on both engines (garrytan#5889). Title ties broke by page id, so a page titled exactly "Acme" lost to dozens of "Acme weekly sync N" pages. Remote title search matches
pages.search_vectorwith title-weight lexemes, with no migration: on a 40k-page Postgres brain, rare term 490.9 -> 33.6 ms, 2,000 matches 545.1 -> 453.3 ms, OR fallback 1142.6 -> 498.0 ms (median of 9). Diagnosis credit: @morven-ai (garrytan#5853). thinkand synthesis see the full evidence set again withsearch.adaptive_returnon (garrytan#5890). Gather was cut to 2 or 6 pages before synthesis; gather, brainstorm's close set, grade-takes evidence,whoknowsandenrichnow opt out of both reader-facing trims (6 of 12 matching pages -> 12 of 12 on the reproduction).--jsonoutput stays valid JSON when a claude-cli model runs (garrytan#5892). AI SDK warnings go to stderr; a user-setAI_SDK_LOG_WARNINGSis kept.
Upgrades and operations (garrytan#5855, garrytan#5902, garrytan#5854)
gbrain upgradeno longer installs a release the host's Bun cannot run (garrytan#5855). A clone fetches and checkspackage.jsonat the exact commit it then fast-forwards to. The post-swap smoke runsgbrain --helpand prints per-method recovery when it fails. Clone installs should upgrade withgbrain upgrade, notgit pull, so the check runs. Ported from garrytan#5860. Contributed by @andreineacsu.- An unpaced embed backfill no longer takes every database connection (garrytan#5902). Without an explicit concurrency,
embed --staleand theembed-backfilljob use at most half the engine's real pool (20 with no pool); an explicitGBRAIN_EMBED_CONCURRENCYkeeps the full-pool clamp. - Dream synthesis no longer fails its phase when the canonical writer is busy (garrytan#5854). Maintenance publishes wait up to 30 s (one wait per job, bounded by the job deadline); a still-pending publish is deferred without stamping the cooldown.
Managed brains and Google connectors (garrytan#5875, garrytan#5867, garrytan#5868, garrytan#5869, garrytan#5856, garrytan#5877)
- Gmail and Calendar pages get links and timeline entries again (garrytan#5875). Cycles with no on-disk checkout (connector sources, Postgres brains without
--dir) now run the bounded, source-scoped database-only stale drain each cycle. - Managed brains extract commitments from Gmail again (garrytan#5867). Every sweep queues
loops_extracton managed and unmanaged brains, the sync result carriesloops_enqueue(enqueued,deferred,skipped_reason), and every skip is logged. A one-time catch-up on managed sources analyzes email threads from the last 30 days that were never extracted. - Quiet Gmail threads open their loops when the waiting window ends (garrytan#5868). The sweep records a grace hold and re-evaluates the thread when due, from the stored page when nothing changed; the first sweep after upgrading seeds holds for threads active in the last 14 days, with no Gmail calls. Grace holds are not held items.
- Closing a commitment loop retires its fact, and says so honestly (garrytan#5869). On a managed brain the expiry was refused, the error swallowed, and
loops_closestill answeredfact_expired: true; the fence row was never struck on any brain. A fact another open loop still uses is kept, and a close whose retirement did not commit is retryable. New explicit repairgbrain repair loop-facts(doctorloop_facts_drift) retires the facts of loops closed before this release. - Automatic atom drains stop dead-lettering on connector sources (garrytan#5856). When opted in, each attempt runs under one budget across its batches; with a model the tracker cannot price, only the attempt count bounds spend. A job refused before any model call dead-letters once and does not count; checkout and connector sources take turns. Off switch:
gbrain config set autopilot.auto_drain.enabled false. Theconnector_databasewrite target is ported from garrytan#5865. Contributed by @andreineacsu. gbrain doctor'sorphan_ratiofix command runs, and connector mail no longer inflates the ratio (garrytan#5877). The printed command includes--source db(and--source-idwhen scoped), and orphaned email/meeting renders of connector sources are reported apart asconnector_renders_excluded.gbrain extract timeline --source dbwrites on fresh and managed brains (garrytan#5904 probe). It publishes per page through the coordinator instead of inserting raw rows every managed brain refuses. garrytan#5904's library-level entry point stays open.
Issue reports with reproductions for this group: @andreineacsu (garrytan#5888, garrytan#5887, garrytan#5889, garrytan#5890, garrytan#5892, garrytan#5855, garrytan#5875, garrytan#5867, garrytan#5856, garrytan#5877, garrytan#5868, garrytan#5869), @nezovskii (garrytan#5902, garrytan#5904), @ywlee7922 (garrytan#5854).
Security
- Short random secrets clear the entropy gate (v0.60.31.0 follow-up). A
password=value of 15 random characters with one letter repeated three times read 3.46 bits/char and stayed plaintext; the gate now uses the Miller-Madow estimate (correctedEntropy) and requires a non-digit, and the A5 test that flaked on such values runs on fixed seeded values plus that case.
Known limits
- A
remembersaved after automatic capture already stored the same claim leaves two active rows, and two capture writers racing on the same claim can both insert it. Reworded duplicates still appear twice until a measured cosine threshold ships: single-word corrections ("Lisbon" -> "Porto") embed at 0.95 or higher, which no token guard catches (garrytan#5888). - Hosts on v0.60.31.0 or older run their own upgrade code, which has no Bun floor check (garrytan#5855).
- With an unpriced
extract_atomsmodel the auto-drain's dollar limit is not enforced (garrytan#5856). - garrytan#5902 is mitigated, not reproduced end to end; garrytan#5854 fixes the wait and phase failure, not the reported duplicate child re-runs, which were not proven.
Community fixes
Sync and persistence:
- Deleting a file sync does not own no longer deletes its page (garrytan#5648, garrytan#5565), and recorded page identities survive exactly on every platform (garrytan#5649). Contributed by @MarvinDontPanic.
- Reserved skillpack paths stay out of managed sync walkers (garrytan#5859, garrytan#5852); large deferrals deliver on worker-backed single-source runs (garrytan#5568, garrytan#5386); archives with invalid timestamps are protected from purge (garrytan#5618, garrytan#5452);
core.hooksPathis classified by containment and re-harden repairs the exclusion (garrytan#5578, garrytan#5436). Contributed by @furuchanchan. - A committed pending sync cursor resets after a recorded failure (garrytan#5687). Contributed by @stevewandler.
- Page identities with a file extension in the slug are preserved (garrytan#5841, garrytan#5840). Contributed by @arisgysel-design.
- Remote page writes infer type and subtype from the active schema pack (garrytan#5548); takes fence writes commit on durability-hardened repos (garrytan#5638); derived-link errors name the rejected producer (garrytan#5643);
PageRevisionConflictErrorkeeps its specific message (garrytan#5659). Contributed by @dovstern. - Fence cells encode newlines, so a multi-line fact no longer write-blocks its page (garrytan#5844), and pages the provider blocks at the prompt level are tombstoned in
extract-atoms(garrytan#5849). Contributed by @DmitryBMsk.
Backup, storage, migrate and doctor:
gbrain migratecopies every live page, each source'sdb_onlydump gets its own export, andstorage statusprints a restore command for exactly the listed files (garrytan#5539); connector sources stop pinningbackup_coverageandundeclared_db_only_pagesin warn (garrytan#5531, garrytan#5503, garrytan#5505); v0.32.2 verify accepts a duplicate active fence row indexed once (garrytan#5814, garrytan#5830);self_upgrade.*config keys route to the file plane (garrytan#5489, garrytan#5518); a relaunch onto a newer version counts as applied (garrytan#5813, garrytan#5826). Contributed by @andreineacsu.bootstrap_serve_lockskips only the doctor's own PGLite lock (garrytan#5481, garrytan#5561). Contributed by @harjothkhara.sources statusreports an unreadable hold state (garrytan#5866);edges-backfillrejects invalid--max-chunks(garrytan#5896); the 3A time-boxed cold-pass test drives its clock deterministically (garrytan#5806). Contributed by @Masashi-Ono0611.
Search, graph and timeline:
- The title arm ranks pages before attaching the representative chunk, and dedup's compiled-truth guarantee is linear time with allocation-free Jaccard (garrytan#5655, garrytan#5652). Contributed by @kvnloo.
- The relational arm spans every source for unscoped callers (garrytan#5640); embed spend records bank provider-reported
usage.tokens(garrytan#5642);list_pageskeyset paging (garrytan#5641). Contributed by @IvanPham03. - The two-pass code walk follows the symbol resolver's outcome (garrytan#5574). Contributed by @furuchanchan.
- Symbol-resolver source escapes NUL delimiters (garrytan#5580). Contributed by @RoamingQuack.
normalizeBasenamecollapses hyphen runs likeslugifySegment, so[[Backlog - vault]]resolves (garrytan#5623, garrytan#5624). Contributed by @woprrr.- Dated
###headings parse as timeline entries on the database path (garrytan#5562). Contributed by @kishorkukreja. - Embedding signature invalidation skips soft-deleted pages (garrytan#5647). Contributed by @MarvinDontPanic.
Facts, models and extraction:
- Unpriced conversation models keep explicit caps and drop only the default (garrytan#5825, garrytan#5823). Contributed by @javieraldape.
- Claude Sonnet 5.5, the Sonnet 5 price and the Claude 5 request shape (garrytan#5688, garrytan#5690). Contributed by @morven-ai and @mdoens.
propose_takesscales its call timeout with its output cap (garrytan#5771). Contributed by @h6y3.- The embed phase is skipped when embeddings are disabled (garrytan#5536). Contributed by @tarush1989.
CLI, hooks, connectors and loops:
extract-conversation-facts --json(garrytan#5704, garrytan#5448); a not-yet-written transcript reaches the prompt-only hook path (garrytan#5465, garrytan#5724); timeline summaries drop a citation's link target (garrytan#5483, garrytan#5703); Claude Code Remote Control state files are skipped (garrytan#5597, garrytan#5702);list_pagesTSV escapes record-boundary characters (garrytan#5784);bootstrap harness --helpprints help (garrytan#5488, garrytan#5782). Contributed by @RerankerGuo.- Loop writes enforce the bound write source and hide foreign loop existence (garrytan#5697); persisted Gmail receipts omit ephemeral handles (garrytan#5802, garrytan#5818);
gbrain inithelp and INSTALL show the supported thin-client flags (garrytan#5800, garrytan#5816); bootstrap verify saysfacts.default_visibilitygoverns extraction writes only (garrytan#5605, garrytan#5834). Contributed by @furuchanchan. - Autopilot skips a tick on a transient
listAllSourceserror instead of running the legacy repo-root cycle (garrytan#5678). Contributed by @bengio777. whoami/capabilitiestransport from the verified principal (garrytan#5899); native CI never narrows scope on a large, capped or incomplete PR file list (garrytan#5900);ci:localuses portablexargsand a container-built CLI on macOS hosts (garrytan#5901). Contributed by @nezovskii.
For contributors
KNOBS_HASH_VERSIONis 30.- The managed connector job contract harness (
test/helpers/managed-connector-job-contract.ts, PGLite and Postgres) drives every automatic connector-source job on a managed brain through a real queue and worker and counts everymanaged_writer_guardrefusal. src/commands/extract-timeline-db.tsis the shared coordinated--source dbtimeline path.PROMPT_VERSIONis 4.isManagedFilesystemPath(path)insrc/core/persistence/filesystem-guard.tsis the predicateassertManagedFilesystemWriteuses.ExtractedEdge.memberCallandCodeEdgeInput.edge_metadata.member_call.ThreadLoopSpec.openedMs,OpenLoopUpsert.openedAt;rankGroupsandrenderTexttake the reference time.ConfidenceGrade.reasongainskeyword_relaxed_top.ALLOWED_TYPE_ALIASESandpageTypesForAllowedmoved tosrc/core/facts/conversation-types.ts(re-exported fromextract-conversation-facts.ts), next toisConversationFactsEligiblePage,conversationFactsEligibleSqlandrequireParseableConversationFlag.