Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
570 commits
Select commit Hold shift + click to select a range
4c9db15
Index store: reuse a checkout's memory figure until it changes
ualtinok Nov 6, 2026
826b604
data layer: port the remaining old-store test failures
ualtinok Nov 6, 2026
cca2118
data layer: a refresh skips stale method-call answers of files it rem…
ualtinok Nov 6, 2026
e152e20
remove the old call-graph exit flush and two old-store examples
ualtinok Nov 6, 2026
b58e36c
remove the old meaning-index chunk export example
ualtinok Nov 6, 2026
55d7931
remove two Linux-only tests of views trust and the old meaning cold b…
ualtinok Nov 6, 2026
993eaae
index store: allocator relief after a build only where AFT has it (Li…
ualtinok Nov 6, 2026
15c8009
remove a Linux-only profile of the old text index
ualtinok Nov 6, 2026
f47f366
probe: time call-graph commands on a fresh checkout and measure the f…
ualtinok Nov 6, 2026
3edb908
index store: decoded call-graph files share one bounded cache
ualtinok Nov 6, 2026
2516066
probe: break decoded call-graph memory down by part
ualtinok Nov 6, 2026
c565b99
mason: refuse config names retired in 0.62 or earlier (Rust, WIP)
ualtinok Nov 6, 2026
3d2c91a
mason: refuse retired config names in the TypeScript loaders (WIP)
ualtinok Nov 6, 2026
8745709
mason: update plugin tests for refused retired config names (WIP)
ualtinok Nov 6, 2026
458cf2e
mason: recapture config parity fixtures for refused retired names
ualtinok Nov 6, 2026
1aaa7ec
mason: document refused retired config names, drop experimental.bash …
ualtinok Nov 6, 2026
d3973b3
mason: test that every refused retired name is refused and translated…
ualtinok Nov 6, 2026
946a6f2
mason: meaning fills reuse vectors of the old meaning index
ualtinok Nov 6, 2026
694e50f
mason: example comparing a fill from the old meaning index with one f…
ualtinok Nov 6, 2026
4500407
mason: format the old-index import and say what stored_vector is for
ualtinok Nov 6, 2026
6688630
mason: add aft cache prune-legacy to delete the pre-0.64 index folders
ualtinok Nov 7, 2026
1358b4f
mason: port or delete tests that pinned the retired index stores (wip)
ualtinok Nov 7, 2026
0834bd4
mason: port dead-code, sample and broad-root tests onto the index sto…
ualtinok Nov 7, 2026
a72dce7
mason: split the HOME-root callers check and mark two index-store wir…
ualtinok Nov 7, 2026
8b5c277
mason: mark two meaning-plane status defects ignored (wip)
ualtinok Nov 7, 2026
b141f63
mason: shorten the index store's quiet period for the corpus-refresh …
ualtinok Nov 7, 2026
ddc62c0
mason: delete test-only helpers that only the deleted tests used (wip)
ualtinok Nov 7, 2026
61dae4e
mason: format
ualtinok Nov 7, 2026
f983597
mason: read the missing-facts test's call graph from the index-store …
ualtinok Nov 7, 2026
cf7bd34
Index store: the retired call-graph store queues nothing and reports …
ualtinok Nov 7, 2026
8ea2549
Drop the old-store dead-code CPU probe
ualtinok Nov 7, 2026
bb63686
Meaning search: refreshing edited files after a finished fill is read…
ualtinok Nov 7, 2026
049135f
Refreshing watcher test: shorten the index store's quiet period to a …
ualtinok Nov 7, 2026
145b2a5
Refreshing watcher test: a mid-refresh reply is partial
ualtinok Nov 7, 2026
ba00b3a
Refreshing watcher test: the mid-refresh semantic status is refreshing
ualtinok Nov 7, 2026
d0962b0
mason: compact call-graph slices stored as records, with a gate again…
ualtinok Nov 7, 2026
d231678
mason: keep full names only where a lookup reads them, store span len…
ualtinok Nov 7, 2026
61697eb
mason: front-code full names and signatures in their own table
ualtinok Nov 7, 2026
b3d202b
mason: count the front-coded table in the slice probe's string bytes
ualtinok Nov 7, 2026
184857c
mason: delete the string-row slices and their comparison gate
ualtinok Nov 7, 2026
491c238
Gate script: run only the index store's own gates
ualtinok Nov 7, 2026
f4c84fa
mason: configure bash fixtures with current keys; delete retired-stor…
ualtinok Nov 7, 2026
aa4746a
mason: wait for the published call graph before tests read dead code
ualtinok Nov 7, 2026
ae97d6f
mason: run the in-flight dedup test on Duplicates, which has no call-…
ualtinok Nov 7, 2026
60f42eb
Call-graph queries on a home root name the home root, not the off switch
ualtinok Nov 7, 2026
bb8d8ec
Block cache: shard by block and serve hits under a read lock
ualtinok Nov 7, 2026
c584cb9
Checkout memory probe: report each edit's record-and-refresh time
ualtinok Nov 7, 2026
f554e98
Index store: open each segment file once per process
ualtinok Nov 7, 2026
f06d8fe
Native secret-bash tests find aft where Cargo's build-dir puts it
ualtinok Nov 7, 2026
f6f3de2
Inspect lists its files from the index-store checkout instead of walking
ualtinok Nov 7, 2026
1a12a2b
Checkout memory probe: report the call graph's held memory per line
ualtinok Nov 7, 2026
88c2fbe
mason: answer Thalamus runner heads' background bash launches at once
ualtinok Nov 7, 2026
1c0bde7
Deletion branch: take the runner-head background change from main ins…
ualtinok Nov 7, 2026
1d8f82f
mason: dead code and unused exports on the index store's integer graph
ualtinok Nov 7, 2026
c9da492
mason: files a patched dead-code rollup only calls into are read as a…
ualtinok Nov 7, 2026
ca69b62
mason: Rust dead-code fact extraction is linear in a file's top-level…
ualtinok Nov 7, 2026
8cee86b
mason: stored-facts dead-code scans keep file freshness; data-layer s…
ualtinok Nov 7, 2026
5eb1ab6
mason: kept dead-code graphs are verified; damaged inputs are tested;…
ualtinok Nov 7, 2026
80a6ce3
Inspect: automatic dead code and unused exports follow their own sche…
ualtinok Nov 7, 2026
130e4f4
Merge remote-tracking branch 'origin/main' into data-layer/c7-main
ualtinok Nov 7, 2026
95821a9
Inspect test: feed the watcher event for a file written outside AFT
ualtinok Nov 7, 2026
2f0da5d
Index store: semantic search alone binds the root
ualtinok Nov 7, 2026
170fb55
Configure test: semantic-only bind uses an OpenCode session, which ad…
ualtinok Nov 7, 2026
24eb4a6
Config: a long-retired name refuses only the user config
ualtinok Nov 7, 2026
ed031d3
Plugins: a project config with a long-retired name loads with a notice
ualtinok Nov 7, 2026
6266ccd
Config: project files skip only the long-retired-name refusal
ualtinok Nov 7, 2026
dea136e
mason: assert retired project aliases load within trust limits
ualtinok Nov 7, 2026
c247509
mason: refresh retired-project parity and catalog goldens
ualtinok Nov 7, 2026
90118ba
mason: cover retired experimental project config translation in both …
ualtinok Nov 7, 2026
01c15fb
mason: account for legacy harness feature defaults in config test
ualtinok Nov 7, 2026
f3c3f04
mason: keep re-resolved call-graph files encoded between publications
ualtinok Nov 7, 2026
37ddcfd
mason: an edit no longer copies the checkout's whole state
ualtinok Nov 7, 2026
a529f40
mason: keep changed files' content records encoded until publication
ualtinok Nov 7, 2026
b674440
Index store: dead code reads refreshed files in their encoded form
ualtinok Nov 7, 2026
56ab631
Deletion branch: drop dead bindings, imports and branches left by the…
ualtinok Nov 7, 2026
35dc4eb
mason: delete production-library index retirement remnants
ualtinok Nov 7, 2026
7958387
mason: remove retired SQLite callgraph backend
ualtinok Nov 7, 2026
1afcd53
mason: every call-graph engine resolves on one shared thread pool
ualtinok Nov 7, 2026
cad43f0
mason: method-call site inputs keep reference keys, not formatted ids
ualtinok Nov 7, 2026
f1c7b10
mason: an edit is parsed by the call-graph refresh, not when it is re…
ualtinok Nov 7, 2026
ee50e94
mason: remove obsolete index fixtures and dead test support
ualtinok Nov 7, 2026
bec3f90
Merge remote-tracking branch 'origin/main' into data-layer/c7-main
ualtinok Nov 7, 2026
8bf7424
Merge commit 'ee50e948a0' into data-layer/c7-merge
ualtinok Nov 7, 2026
a368d9f
Index store: drop the last retired-store leftovers
ualtinok Nov 7, 2026
38ea74c
aft_search: caller annotations from the index store; test fixes after…
ualtinok Nov 7, 2026
05af6b1
Tests after the deletion: status, drain, reap and shutdown fixtures f…
ualtinok Nov 7, 2026
ea9d59e
Test: process-group members keep their pid for the never-reaped reason
ualtinok Nov 7, 2026
28a601b
cargo fmt
ualtinok Nov 7, 2026
069c42e
Search-quality descriptor for the index-store release
ualtinok Nov 7, 2026
ff6d38d
Release descriptor: declare the five pattern-lane candidate-count cha…
ualtinok Nov 8, 2026
ea25fb7
mason: admit data-layer handoffs without an executor worker
ualtinok Nov 8, 2026
175f998
Merge remote-tracking branch 'origin/main' into data-layer/c7-merge
ualtinok Nov 8, 2026
e1ca43e
Merge fix: tilde expansion moved to git_root_resolution with the old …
ualtinok Nov 8, 2026
0cf5bfd
Restore two Linux-only test helpers the unused-code pass removed
ualtinok Nov 8, 2026
1ab1109
Index store: dead-code verdicts for test-code receivers and Python do…
ualtinok Nov 8, 2026
d1dd614
mason: a publication of changes retires segments no checkout reads an…
ualtinok Nov 7, 2026
4bb63b7
mason: a process holds at most 1,024 segment files open
ualtinok Nov 7, 2026
17da153
mason: builds and publications share without pinning, and a checkout …
ualtinok Nov 7, 2026
514c93d
mason: release note for the bounded index store and the open-file cap
ualtinok Nov 8, 2026
c33b813
mason: name the repository the sharing figure came from in plain words
ualtinok Nov 8, 2026
c62fe4b
mason: a new worktree starts from its closest sibling's publication
ualtinok Nov 8, 2026
54480ce
mason: a probe measuring a new worktree's first build
ualtinok Nov 8, 2026
883dd85
mason: say what the probe's store is
ualtinok Nov 8, 2026
1e7f351
mason: the checkout gate makes new worktrees from A and compares thei…
ualtinok Nov 8, 2026
91bb80b
mason: release note for new worktrees starting from a sibling
ualtinok Nov 8, 2026
8668e90
Test: fake-Synapse search tests hold the model-free fill guard
ualtinok Nov 8, 2026
22b5e49
Maps: describe the index store instead of the old trigram, SQLite cal…
ualtinok Nov 8, 2026
859813d
Merge remote-tracking branch 'origin/main' into data-layer/c7-merge
ualtinok Nov 8, 2026
e6a2f2d
Release CI fixes: canonical test roots on macOS, probe builds on Wind…
ualtinok Nov 8, 2026
24ac8c8
Windows: dead code finds its checkout under either root spelling; pru…
ualtinok Nov 8, 2026
2fa3bf6
Windows tests: use the product's root spelling in dead-code and prune…
ualtinok Nov 8, 2026
da21c65
Format two files the Windows test fixes touched
ualtinok Nov 8, 2026
eb6ee6a
mason: first call-graph refresh after a restart does its serial reads…
ualtinok Nov 8, 2026
6975fa8
mason: keep the first-read test records out of the exhaustive heap-si…
ualtinok Nov 8, 2026
53e7983
mason: dead code pending at inspect's deadline names what it waits for
ualtinok Nov 8, 2026
7bd6ff0
mason: say what the method-call input record holds without the pass n…
ualtinok Nov 8, 2026
4ca223b
Storm test: stop asserting a file written after a rebind stays out of…
ualtinok Nov 8, 2026
cb6ca03
mason: run whole-repo analyses only on aft_inspect (WIP)
ualtinok Nov 8, 2026
cc9fdc4
mason: release the dead-code graph after ten idle minutes (WIP)
ualtinok Nov 8, 2026
aa1ccf2
mason: plugins, config and docs follow on-demand whole-repo analyses …
ualtinok Nov 8, 2026
036273e
mason: release note and non-ranking descriptor for on-demand inspect
ualtinok Nov 8, 2026
ce21443
mason: compacted status-push fixture records the smaller original body
ualtinok Nov 8, 2026
e95bd22
mason: say what dropping ends the dead-code release thread
ualtinok Nov 8, 2026
06ff2f4
Merge remote-tracking branch 'origin/main' into data-layer/c7-merge
ualtinok Nov 8, 2026
83b8e80
Drop the worker-branch search-quality descriptor; the release branch …
ualtinok Nov 8, 2026
12755bb
Health test: a writer root with no analysis running reports tier2 ready
ualtinok Nov 8, 2026
e50fcaa
Remove a release-only stub left from the deleted search-index rebuild…
ualtinok Nov 8, 2026
6f5e618
Health test: a worktree reports tier2 ready too
ualtinok Nov 8, 2026
49d5246
Dead code waits for a root's first call graph instead of answering pe…
ualtinok Nov 8, 2026
8ed9bd4
mason: aft-store writes a folded segment from stored units, section f…
ualtinok Nov 8, 2026
67f9d0d
mason: fold a checkout's segments from stored units instead of buildi…
ualtinok Nov 8, 2026
55685e1
mason: fold measurement example, memory probe folds, release note and…
ualtinok Nov 8, 2026
6941250
mason: fold measurement runs each step in a fresh process and with a …
ualtinok Nov 8, 2026
5e03188
mason: the checkout gate counts real folds apart from builds a fold f…
ualtinok Nov 8, 2026
84575ac
mason: clearer comments on folded text units and the gate's checkout …
ualtinok Nov 8, 2026
3da594e
fold_measure example: CPU time only where getrusage exists (Windows r…
ualtinok Nov 8, 2026
2ce25dd
mason: changes a build kept are pending again over its publication; f…
ualtinok Nov 8, 2026
a03b108
mason: TODO counts read from the index store, no tree-sitter at count…
ualtinok Nov 8, 2026
0058046
mason: TODO count survives folds, retakes when the store publishes, n…
ualtinok Nov 8, 2026
687c337
Drop worker-branch search-quality descriptors; the release branch has…
ualtinok Nov 8, 2026
09ff2a4
mason: name URL fetch time on the slow outline/zoom call line and add…
ualtinok Nov 8, 2026
3ec18f0
mason: release note for URL fetch times on the slow-call line
ualtinok Nov 8, 2026
e6fa1f9
mason: probe what a new Git worktree's sibling start reads
ualtinok Nov 8, 2026
710e561
mason: format the worktree read probe
ualtinok Nov 8, 2026
c70b05a
mason: explain the sibling start the worktree read probe measures
ualtinok Nov 8, 2026
dd51db4
Resolve the TODO publish test's root after creating it, so it matches…
ualtinok Nov 8, 2026
a698bf9
mason: bash and bash_watch wording puts independent work before waiting
ualtinok Nov 8, 2026
f3bf79c
mason: regenerate tool-provider catalog goldens for the new bash wording
ualtinok Nov 8, 2026
01059bb
mason: test that inspect right after an outside edit counts its TODOs
ualtinok Nov 8, 2026
004179b
mason: aft_inspect catches the index store up with the disk before re…
ualtinok Nov 8, 2026
4ed9b9d
mason: inspect catch-up waits for paths held in the watcher's flush w…
ualtinok Nov 8, 2026
bd3df99
mason: name aft_search waits on the slow-call line and add a wait-mea…
ualtinok Nov 8, 2026
c13dd5f
mason: aft_search embeds a query outside the context's model mutex
ualtinok Nov 8, 2026
16876df
mason: aft_search path lookup reads the index store's path list while…
ualtinok Nov 8, 2026
aaec146
mason: search-quality descriptor for the aft_search wait fixes (engin…
ualtinok Nov 8, 2026
44f5235
mason: release note for the aft_search wait fixes
ualtinok Nov 8, 2026
92d5cc0
mason: name the inventory check the path-lookup listing mirrors
ualtinok Nov 8, 2026
710bdea
mason: split the backup and write phases of an edit into timed steps;…
ualtinok Nov 8, 2026
a804f06
mason: undo snapshot shares one device flush for meta.json and its fo…
ualtinok Nov 8, 2026
758dcd8
mason: deferred-checkpoint test starts from an empty WAL so the mirro…
ualtinok Nov 8, 2026
bc48973
mason: unix-only helpers of the flush-order test stay out of the Wind…
ualtinok Nov 8, 2026
aef0f4b
mason: clarify two comments in the edit latency change
ualtinok Nov 8, 2026
362a8fe
train-push test: wait for the restacked push's own CI run before comp…
ualtinok Nov 8, 2026
a9fc264
mason: undo mirror writes through its own aft.db connection, so an ed…
ualtinok Nov 8, 2026
0582fd0
mason: an edit's undo-mirror write waits at most 50 ms for another af…
ualtinok Nov 8, 2026
94cb34b
Undo mirror connection doc names its write-time busy cap
ualtinok Nov 8, 2026
fbf93ab
mason: allocation tracer core (global allocator wrapper, labels, even…
ualtinok Nov 8, 2026
df3aabf
mason: label the burst suspects and carry labels into resolver pool t…
ualtinok Nov 8, 2026
864f383
mason: census reads label marks only when the tracer's logger runs; c…
ualtinok Nov 8, 2026
9a4a6df
mason: allocation tracer process tests are unix-only
ualtinok Nov 8, 2026
3cdaefa
mason: allocation tracer probe: overhead arms and an in-process burst
ualtinok Nov 8, 2026
dd946af
mason: build id as aft profile keys debug symbols; macOS test checks …
ualtinok Nov 8, 2026
eaa9f33
mason: writing trace lines is never attributed to the caller's label;…
ualtinok Nov 8, 2026
f0a6741
Allocation tracer: probe reports wall time only on Windows; build-id …
ualtinok Nov 8, 2026
f463b9e
mason: share symbol tables decoded from content records across checkouts
ualtinok Nov 8, 2026
cf51843
mason: derive the content key from the cache's hash
ualtinok Nov 8, 2026
c95e451
mason: parity test checks its answers are real; unix-only helpers
ualtinok Nov 8, 2026
b9cac29
mason: drop a diagnostic print from the parity test
ualtinok Nov 8, 2026
f7c3877
mason: drop the stored outline's language, which nothing reads now
ualtinok Nov 8, 2026
e8c4798
mason: release note for shared symbol tables
ualtinok Nov 8, 2026
30f1dbb
Resolve the TODO publish test's root after creating it, so it matches…
ualtinok Nov 8, 2026
c81673c
powershell_available keeps its answer while PATH is unchanged, so too…
ualtinok Nov 9, 2026
048342e
Index store keeps submodule files: only <common>/worktrees/<name> mar…
ualtinok Nov 9, 2026
0bdcb19
mason: list background inspect scope files from the bound index store…
ualtinok Nov 9, 2026
86c0438
mason: name the differing files in the store-list parity tests
ualtinok Nov 9, 2026
fa58610
mason: walk instead of trusting the store's list in repositories with…
ualtinok Nov 9, 2026
3880f4c
mason: drop the submodule refusal; the index store's scan is being fi…
ualtinok Nov 9, 2026
60b1b1b
mason: release note for the TODO refresh listing files from the index…
ualtinok Nov 9, 2026
2d8ad08
mason: health names the roots behind a failed-index-store degraded st…
ualtinok Nov 9, 2026
cb679f9
mason: configure warnings list files from the published index store i…
ualtinok Nov 9, 2026
1d89971
Format the PowerShell lookup cache
ualtinok Nov 9, 2026
2350002
mason: serve permissions/v1 for saved folder-access grants (WIP)
ualtinok Nov 9, 2026
433ba7f
mason: fix permissions handler connection borrow
ualtinok Nov 9, 2026
b577d04
mason: fix test helpers for permissions grants
ualtinok Nov 9, 2026
4d2b532
mason: frame-level permissions route test, bridge manifest list, rele…
ualtinok Nov 9, 2026
f482e2c
mason: clarify the published-sample test comment
ualtinok Nov 9, 2026
047f1c4
Saved folder access: docs say build-server commands aren't stopped by…
ualtinok Nov 9, 2026
fe1bc50
mason: aft_search reads each candidate file once per request (request…
ualtinok Nov 9, 2026
f4bacea
mason: request file set: read-count tests, budget reservation without…
ualtinok Nov 9, 2026
0b5d007
mason: request file set: test-only guard accessor, explicit lifetime …
ualtinok Nov 9, 2026
76f1b7e
mason: prepared-text cache counters on the slow-call line; search_wai…
ualtinok Nov 9, 2026
2110042
mason: search-quality descriptor and release note for the request fil…
ualtinok Nov 9, 2026
8b10cd5
mason: prepared exact-text cache holds 64 MiB; at 32 MiB every miss e…
ualtinok Nov 9, 2026
4fac8a9
mason: descriptor states the measured parity and the prepared-text ca…
ualtinok Nov 9, 2026
7d5716c
mason: share the module's own aft.db handle in the permissions route …
ualtinok Nov 9, 2026
b5bf577
mason: stop commands whose folder grant was revoked before they regis…
ualtinok Nov 9, 2026
e77e9be
mason: build the racing-revoke test hook only where its unix test runs
ualtinok Nov 9, 2026
153462a
mason: outline trait previews walk with one cursor; meaning refresh l…
ualtinok Nov 9, 2026
e847773
mason: hashline snapshots hash content only when an eviction-history …
ualtinok Nov 9, 2026
db3bf96
mason: release note for the outline, tagged-read and meaning-refresh …
ualtinok Nov 9, 2026
7b5602d
Outline trait-preview tests read the crate path at run time, as the c…
ualtinok Nov 9, 2026
6d5b132
mason: call-graph refresh keeps decoded only what it resolves again
ualtinok Nov 9, 2026
c59d8ad
mason: clearer test comment on what a refresh keeps decoded
ualtinok Nov 9, 2026
fb1313a
mason: refresh replays decode each reader once, on the replaying thread
ualtinok Nov 9, 2026
b21d753
mason: release note numbers from the interleaved base/after runs
ualtinok Nov 9, 2026
acefe9d
mason: alloc_trace_probe prints each refresh's stage times and measur…
ualtinok Nov 9, 2026
1864559
mason: stretch allocator walk reuse by walk cost in health rollup and…
ualtinok Nov 9, 2026
19ba675
Merge the post-0.64 performance and fleet fixes into the 0.64 release
ualtinok Nov 9, 2026
a1beb24
Allocation tracer test casts its function pointer through a raw point…
ualtinok Nov 9, 2026
b37426b
Release fixes: the per-search file set has an owner in the search own…
ualtinok Nov 9, 2026
a80e172
Release fixes: search ownership audit counts the two new modules (req…
ualtinok Nov 9, 2026
e9dfb89
mason: a publication moves the call-graph engine onto it instead of d…
ualtinok Nov 9, 2026
6f706ef
mason: engines are measured for the budget at most every 30 s; replay…
ualtinok Nov 9, 2026
451508e
mason: the engine budget's reasons, and release log lines count relea…
ualtinok Nov 9, 2026
e1d12e7
mason: alloc_trace_probe replays with the runtime's publish rule and …
ualtinok Nov 9, 2026
aa906ca
mason: comments name the stored terms an engine finds files through
ualtinok Nov 9, 2026
bc91278
mason: release note for the call-graph engine kept across publications
ualtinok Nov 9, 2026
ebc4e1d
Durability census: edits and undo make one more ordinary fsync and on…
ualtinok Nov 9, 2026
0431b96
mason: OpenCode 2 files AFT's shell permission refusal as the host's …
ualtinok Nov 9, 2026
52ad9c2
mason: release note for OpenCode 2 shell refusals filed as permission…
ualtinok Nov 9, 2026
532dd96
mason: release note names the version the shell refusal filing broke in
ualtinok Nov 9, 2026
3189a52
Beta-pin gate also runs when plugin or bridge source changes, so a re…
ualtinok Nov 9, 2026
28de704
mason: Windows-safe saved-grant tests: absolute temp-dir folders and …
ualtinok Nov 9, 2026
5b99ca7
Load matrix: the sidebar no longer draws Dead Code, Unused Exports or…
ualtinok Nov 9, 2026
ebd6726
mason: count runon monitor-loop record writes and catalog lists
ualtinok Nov 9, 2026
7442b9e
mason: save one record at runon acceptance, read executor capabilitie…
ualtinok Nov 9, 2026
581ce4d
mason: pin the acceptance record write to one file and directory sync
ualtinok Nov 9, 2026
7a5cb1a
mason: keep the cross-thread record-write counter quiet on Windows bu…
ualtinok Nov 9, 2026
ae99b23
mason: describe the per-route capability cache by what recovery does;…
ualtinok Nov 9, 2026
58ad032
Merge remote-tracking branch 'origin/main' into data-layer/c7-merge
ualtinok Nov 9, 2026
70b79f5
mason: undo mirror writes through the shared aft.db connection again;…
ualtinok Nov 9, 2026
b2dd2a9
Extraction gate skips files whose record holds only TODO markers, whi…
ualtinok Nov 9, 2026
8697e93
mason: load matrix waits for the service's verdict on a TUI row's plu…
ualtinok Nov 9, 2026
bb3a44f
mason: register the late-service row with the operator canary; clarif…
ualtinok Nov 9, 2026
13c79bb
mason: delete revoked GitHub speech authorities after a day
ualtinok Nov 9, 2026
f14baf6
mason: release note for GitHub speech authority retention
ualtinok Nov 9, 2026
c469a99
mason: rustfmt the retention tests and explain the 24-hour minimum age
ualtinok Nov 9, 2026
39ea1ce
mason: store census example: who reads each segment of a family store…
ualtinok Nov 9, 2026
3bfb340
mason: bound the index store: fold idle checkouts on their behalf and…
ualtinok Nov 9, 2026
a4df3b3
Created-file syntax tests read the tool's reply without the status ba…
ualtinok Nov 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .alfonso/release-notes/next/allocation-tracing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- The `aft` binary now names the operation behind large heap use in its log, for diagnosing short multi-gigabyte memory bursts. Any single allocation or reallocation of 64 MiB or more writes one WARN line (`large allocation 512 MiB realloc from 256 MiB thread=aft-subc-runtime op=frame_encode root=<repo> build_id=<uuid> frames=aft+0x…`). When one operation's live heap bytes cross 512 MiB through many smaller allocations, it writes `allocation burst: op=<label> …`, and when they fall back below half of that, `allocation burst ended: op=<label> peak … over …s`. The labels are each tool call (`tool:<name>`), `index_build`, `callgraph_start`, `callgraph_refresh`, `segment_fold`, `meaning_fill`, `symbol_prewarm`, `remote_input_capture`, `frame_encode` and `census`. Call-graph resolver pool work carries the label of the operation that started it. The uncapped memory census adds `allocation_labels`: the five operations with the highest live-byte marks since the previous census. The tracer's logger writes at most 20 lines a minute. Memory that C libraries take from `malloc` directly (SQLite, tree-sitter, ONNX Runtime) is not seen.
- Each frame is printed as an image and an offset because the shipped binary is stripped. To name the frames, take the binary's dSYM (macOS) or debug file (Linux) with the `build_id` on the line: `aft profile` keeps them under the AFT storage root's `dsym/<build_id>`. Then run `atos -o <aft.dSYM>/Contents/Resources/DWARF/aft -arch arm64 -offset 0x1a2b3c …` on macOS, or `addr2line -C -f -p -e <aft.debug> 0x1a2b3c …` on Linux, with the `aft+0x…` offsets from the line.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/allocator-walk-cost-backoff.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- The health rollup and the module loop's allocator-slack sampler now wait longer between allocator statistics walks when a walk is expensive. The wait is at least 200 times the last walk's duration, never less than before (30 s for the rollup, 60 s for the sampler) and never more than 10 minutes. On Linux, glibc's `mallinfo2` visits every free chunk while holding that arena's lock. On a fragmented heap with 5-7 GiB freed in small blocks it took 0.65-6.5 s per walk, so walking every 30 s cost up to 20% of a core and stalled allocation in other threads. On macOS a walk on a similar heap takes 16-27 ms, so the interval there stays as it was. Memory replies are unchanged: `allocator_observation_age_ms` still reports how old the reused reading is.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/bash-wait-wording.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- The bash and bash_watch descriptions now tell agents to finish any work that doesn't need a running command's result before waiting on it or ending the turn.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/callgraph-edit-memory.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- After a broad edit, AFT's index store keeps the call-graph files it re-resolved encoded until the changes are published, so a busy worktree's call graph holds about a tenth of the memory it did (on AFT's own repository, typically about 120 MB instead of 1 GB).
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- A checkout's call-graph engine now carries over each publication of the checkout's changes. Before, the engine was dropped and the next edit's refresh built a new one from the publication. The engine keeps every file it has bound and is moved onto the new publication, but only when it resolved exactly what the publication holds; otherwise it starts again as before. On a replay of 430 real edits to AFT's repository, published as AFT publishes them (88 publications), refreshes started an engine once instead of 88 times. They used about a third less CPU (1,291 s against 868 s), took about the same wall time (+2%), and the process peaked at 3.8-4.2 GB instead of 5.4-5.5 GB. An engine is released after 10 minutes without an edit, when the engines of all checkouts together hold more than 1 GiB (the least recently used goes first), or when its checkout is unbound. Each release is logged with counts by reason. The first refresh after a bind, a restart or a release still takes 5-15% more CPU than before the change that cut its memory.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- The first call-graph refresh after AFT loads or publishes a checkout's call graph no longer keeps a decoded copy of every file it only checks. That covers a new worktree's first edit, the first edit after a restart, and the first edit after each publication. That refresh used to hold every stored parse, plus the resolutions of every file that reads the edited one, until it finished. On AFT's own repository, one edit to the crate root held about 1.5 GB, and three new worktrees refreshing at once took the process to about 6 GB. The same edit now holds about 360 MB, three worktrees at once peak at about 2 GB, and a refresh takes about as long as before. It returns the same answers as before.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/compaction-folds-segments.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- A busy worktree that piles up index changes no longer rebuilds its whole index to tidy them: AFT now combines the stored pieces into one without rereading or reparsing any file. On a 7,000-file repository that takes under a second and a few tens of MB, where the rebuild took about 12 seconds, 40 seconds of CPU and over 1 GB of memory.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Configure's missing-tool and missing-language-server warnings no longer walk the whole project on each configure once the root's index-store checkout has published. The pass takes the source file list from the checkout, as the background TODO refresh already does, and needs only the files' paths. It still walks when the store's list can't stand in for a walk: no checkout is bound or published yet (usually on a new root's first configure), a rescan against the disk is pending, the folder is a folder of repositories or one the index store never indexes, or confinement or a Jujutsu-only repository applies different ignore rules. Each such walk logs `configure warning files walked: reason=<reason> files=<n> ms=<ms>`.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Edits, writes and patches on macOS return sooner, most of all while the disk is busy. Their undo snapshot now does one fewer device-cache flush. Its undo-history write no longer waits for an aft.db WAL checkpoint, and waits at most 50 ms for the daemon's shared database connection and other aft.db writers. Past that, the next edit of the same file catches the history up. Undo reads the snapshot files on disk, so it is unaffected.
3 changes: 3 additions & 0 deletions .alfonso/release-notes/next/gh-speech-authority-retention.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- AFT now deletes GitHub bot-write authorities from `aft.db` once they have been revoked for 24 hours. Every shell launch in a bot-enabled session stores one row of about 84 KB in `gh_speech_authorities`, and nothing deleted revoked rows, so on a busy machine the table reached 7 GB and grew by about 600 MB a day. The once-a-minute retention worker now deletes at most 64 such rows per transaction, for at most 100 ms per minute, and logs `speech authority retention: examined=… deleted=… batches=… exhausted=… stopped=… vacuum_pages=… elapsed_us=…` (INFO when it deleted something, DEBUG otherwise). On a synthetic table of 100,000 revoked 84 KB rows it deleted about 2,300 rows a minute, 5 ms per transaction, with the data still in the operating system's file cache. Active and candidate authorities are never deleted. The revocation records stay, so a deleted authority's ticket is still refused, now as `ticket_unknown` instead of as revoked. Authorities that a write queued by an older AFT build still refers to are kept.
- Revoking an authority now also drops its copy of the signed routing manifest, which was most of the row. A revoked row takes about 1 KB until it is deleted. The manifest itself stays in `aft.db`'s policy ledger.
- Deleting rows leaves free pages inside `aft.db`. The file does not shrink by itself; SQLite reuses the free pages for later writes, so the file stops growing. AFT databases use SQLite's default `auto_vacuum=NONE`. A database converted to `auto_vacuum=INCREMENTAL` returns up to 4,096 free pages (16 MiB) to the file system each minute.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- When roots' index stores fail to build or refresh, the daemon's health report now names them instead of giving only a count. `metrics.data_store_failed` lists up to five roots in path order, each with its reason code (for example `bind_failed` or `build_failed`), and `metrics.data_store_failed_omitted` counts the rest. The `detail` sentence names the same roots, for example `1 root(s) could not build or refresh their index store: /Users/me/Documents (bind_failed); see roots[].data_store`. The names add at most 1 KiB to the detail, and the metrics stay within their 12 KiB budget.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/import-old-embeddings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Meaning search's first fill after upgrading reuses the vectors the previous meaning index already computed for unchanged files with the same embedding model, instead of embedding them again.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- The index store no longer piles up files while worktrees keep editing, and AFT holds at most 1,024 index files open, so busy daemons stay well below macOS's open-file limit.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- AFT's index store resolves every edited worktree's call graph on one shared set of threads instead of a set per worktree (a daemon with dozens of edited worktrees ran hundreds of resolver threads), and write, edit and apply_patch no longer parse the edited file before returning: search sees the edit at once, and the call graph parses it when it next refreshes.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/index-store-worktree-start.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- A new worktree of a repository AFT already indexes is ready in seconds instead of re-reading and re-indexing every file, which removes the CPU spikes when agents open worktrees.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/inspect-on-demand.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Dead code, unused exports, duplicates, cycles and complexity now run only when `aft_inspect` is called, never in the background; the status bar shows errors, warnings and TODOs (`[AFT E1 W3 | T5]`), the dead-code graph is released after 10 idle minutes, and `inspect.tier2_idle_minutes` is retired.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- On OpenCode 2, a shell command refused by a permission rule or by a prompt rejected with feedback is reported as a permission rejection, not a tool failure (broken since 0.63.1).
3 changes: 3 additions & 0 deletions .alfonso/release-notes/next/outline-read-search-cpu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- `aft_outline` builds the method previews for Rust traits with a single pass over each file's syntax tree, and skips files that never mention `trait`. The first outline of a large Rust file uses less CPU, and the outline is unchanged.
- `aft_read` with line tags, and edits that refer to those tags, no longer hash a file's whole content each time they record a tagged version of the file. The hash is computed only in the rare case where an earlier version of the same file with the same tag has been dropped. Results are unchanged.
- When nothing new has been published, a meaning-search refresh now lists the store's folder and stops there. It no longer opens and checks the newest manifest.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/outline-url-fetch-times.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- A slow `aft_outline` or `aft_zoom` of a web page now says in the daemon log where the time went: the slow-call line carries a `url_fetch=` field with the cache hit count and the milliseconds spent on the address check, connecting, waiting for the server's first byte, reading the body and converting HTML, plus body bytes, redirects, retries and any timeout phase. The URL itself is never logged.
13 changes: 13 additions & 0 deletions .alfonso/release-notes/next/permissions-saved-folder-access.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Saved folder access on the permissions pages

The desktop and phone permissions pages now list the folders you let an agent
or its worker use from AFT's folder-access cards, and you can revoke each one
there. AFT serves the fleet's `permissions/v1` capability through Cingulate.
After a revoke, the agent's next call into that folder asks again. A shell
command that is still running with the folder in its sandbox stops, and the
agent sees it as "killed (folder access revoked)". Commands whose sandbox
never included the folder keep running.

Each saved grant now records when it was granted and which card granted it
(aft.db schema 27). Grants saved before this version show the upgrade time
as their grant time and name no card.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/prune-legacy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- `npx @cortexkit/aft cache prune-legacy` lists the index folders AFT used before 0.64 and their sizes; add `--yes` to delete them and free the disk space. AFT does not delete them on its own in this release.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/refuse-old-config-names.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- AFT now refuses configuration names retired in 0.62 or earlier, with `removed_config_key`: `tool_surface`, `hoist_builtin_tools`, top-level `enabled`, `search_index`, `semantic_search`, `callgraph_store`, `github.enabled`, `gh_read`, `gh_shim.enabled`, `sandbox.enabled`, `idle.lsp_ttl_minutes`, `inspect.tier2_soft_deadline_ms`, `inspect.max_drill_down_items`, the flat `experimental_*` keys, the `experimental.bash` block, and `aft_`-prefixed names in `disabled_tools`. Run `npx @cortexkit/aft doctor --fix` to rewrite them; AFT still rewrites your user config automatically when it can.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/runon-fewer-record-writes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`runon` jobs write to disk less often while waiting on a draining build server, and look up the build server's capabilities once per job instead of once per check.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/search-reads-each-file-once.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- `aft_search` reads each candidate file from disk once per search instead of once per step, and works out the line that best matches the query only once per file, so searches over many matching files take less time and use less CPU. Results are unchanged.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/search-wait-fixes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- `aft_search` no longer makes concurrent searches of one project embed their queries one at a time: a query whose embedding is already cached answers at once instead of waiting behind another search's embedding call, and two searches with the same query text share one embedding call. Searches for a file name such as `subc_format.rs` read the index's path list instead of walking the project, while AFT's file watcher keeps that list current. The daemon's slow-call log line for `aft_search` now names what the search waited on (`waits=` and `search_cpu=`).
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- AFT's index store stays small in long use. A worktree that stopped publishing its changes used to keep every segment it read, so idle worktrees could pin gigabytes; now, when another checkout of the repository publishes, it copies what the idle one still reads into one new segment and drops the rest, with no rebuild. Meaning-search vectors, which each batch of embeddings stored in a segment of its own, are now combined once a repository has more than eight such segments, and searches answer exactly as before. On copies of two real stores, segments went from 213 to 30 (5.2 GB to 1.9 GB) and from 335 to 20 (1.6 GB to 0.6 GB).
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- A new worktree whose files match another checkout of the repository now fills its symbol cache in about a fifth of the time (AFT's repository: 988 ms to 175 ms per bind on Linux), allocating about 16 MiB instead of about 1 GiB and holding about 1.4 MiB instead of 20 MiB. Checkouts share the symbol tables decoded from content records instead of each decoding its own copy, and a file whose recorded stat evidence still proves its content is not read again. The memory census counts the shared tables once, with the data layer's shared caches.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/todo-refresh-store-list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- The status bar's background TODO refresh no longer walks the whole project to list its files. It takes the list from the root's index-store checkout, the same list `aft_inspect` already used, and the disk is no longer stat'ed once per file. It still walks the folder in four cases: no checkout is bound or published yet, a rescan of the checkout against the disk is pending, the folder is a folder of repositories or one the index store never indexes, or a request fenced to part of the root (confinement) or a Jujutsu-only repository applies different ignore rules. Each such walk logs `inspect scope files walked: reason=<reason> files=<n> ms=<ms>`. In a replay of 430 edits on a copy of AFT's repository (6,003 source files, debug build), the 43 listings walked 0 times instead of 43. They used 45 ms of CPU each instead of 130 ms, and every list matched the walk's.
1 change: 1 addition & 0 deletions .alfonso/release-notes/next/todos-from-index-store.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- TODO counts (the status bar's `T` and `aft_inspect`'s TODO section) now come from the index store, which records each file's TODO markers when it indexes the file, so a TODO refresh no longer re-parses every file; with the call-graph index switched off, or for a folder that is not indexed, the TODO count reports itself unavailable instead.
7 changes: 6 additions & 1 deletion .github/workflows/beta-pin-gate.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
name: Beta-pin gate

# Path-filtered gate: runs the full OpenCode V2 load and acceptance matrix
# when matrix paths or version pins change.
# when matrix paths, version pins, or the plugin and bridge code the real host
# exercises change. A plugin change once broke how OpenCode 2 files a refused
# shell command and went unnoticed for two weeks because only the matrix's own
# files triggered this gate.
# Per branch-protection rules: paths-filtered jobs must never be a required check on main.

on:
pull_request:
paths:
- "packages/opencode-plugin/src/**"
- "packages/aft-bridge/src/**"
- "packages/opencode-plugin/test/matrix/**"
- "packages/opencode-plugin/test/load-matrix/**"
- ".github/opencode-version.txt"
Expand Down
12 changes: 7 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -177,10 +177,10 @@ jobs:
# fallback silently masks the version-mismatch bug (we try to publish
# vN, it already exists, we say success even though we wanted vN+1).
#
# `agent-file-tools` depends on `aft-tokenizer` and `aft-secret-rules`
# by path; cargo refuses to publish a crate whose path-only dep has no
# `agent-file-tools` depends on `aft-tokenizer`, `aft-secret-rules` and
# `aft-store` by path; cargo refuses to publish a crate whose path-only dep has no
# `version =` or isn't on crates.io. All three crates therefore declare
# versions (synced by version-sync.mjs) and we publish the two leaf
# versions (synced by version-sync.mjs) and we publish the leaf
# crates first so `agent-file-tools` can resolve them on crates.io.
# scripts/lib/test_native_release_workflow.py fails when a new path
# dependency is added without a publish line here. The `--no-verify` flag on the
Expand All @@ -204,6 +204,8 @@ jobs:
|| { ec=$?; cargo publish --package aft-tokenizer --dry-run 2>&1 | grep -q "already exists" && true || exit $ec; }
cargo publish --package aft-secret-rules \
|| { ec=$?; cargo publish --package aft-secret-rules --dry-run 2>&1 | grep -q "already exists" && true || exit $ec; }
cargo publish --package aft-store \
|| { ec=$?; cargo publish --package aft-store --dry-run 2>&1 | grep -q "already exists" && true || exit $ec; }
# Wait briefly for the new leaf crate versions to become visible on
# crates.io's sparse index before publishing `agent-file-tools` —
# otherwise the verify step in the second publish can race against
Expand Down Expand Up @@ -821,7 +823,7 @@ jobs:
# Cargo's local registry overlay, without needing unpublished siblings on
# crates.io. Stable Cargo >=1.90 supports this selection mode.
- name: Rehearse crates.io publishing
run: cargo publish --dry-run --locked --allow-dirty -p aft-tokenizer -p aft-secret-rules -p agent-file-tools
run: cargo publish --dry-run --locked --allow-dirty -p aft-tokenizer -p aft-secret-rules -p aft-store -p agent-file-tools

# Mirrors the inline 10 MiB check in scripts/release.sh (crates.io package
# sizes). A publish dry run does not enforce the registry's upload limit.
Expand All @@ -839,7 +841,7 @@ jobs:
# Multi-package publish stages archives in tmp-crate and tmp-registry;
# single-package packaging leaves them directly in the package folder.
crates = sorted(crate_dir.rglob("*.crate"))
expected = {"aft-tokenizer", "aft-secret-rules", "agent-file-tools"}
expected = {"aft-tokenizer", "aft-secret-rules", "aft-store", "agent-file-tools"}
filenames = {crate.name for crate in crates}
found = {
package["name"] for package in metadata["packages"]
Expand Down
Loading
Loading