Failures are intermittent: they do not happen every time, but occur repeatedly across ordinary editing sessions on small source code.
This sequence has happened multiple times across different small source files.
I do not have a confirmed root cause. Likely candidates include:
Observation: Many failures appear to occur shortly after a prior hashline edit failure,
which suggests state carry‑over after failure may be a contributing factor.
## Description
Pi hashline edit frequently fails on small files
## Environment
- AFT CLI: v0.52.2
- AFT binary: 0.52.2
- OS: linux x64
- Node: v24.19.0
## Diagnostics
- Timestamp: 2026-08-27T06:18:15.778Z
- AFT CLI: v0.52.2
- AFT binary: 0.52.2
- OS: linux x64
- Node: v24.19.0
### Pi
- Host installed: true
- Host version: 0.84.3
- Plugin registered: true
- Plugin version: 0.52.2
- AFT enabled: true
- AFT config parse error: none
#### Config paths
{
"configDir": "~/.pi/agent",
"harnessConfig": "~/.pi/agent/settings.json",
"harnessConfigFormat": "json",
"aftConfig": "~/.config/cortexkit/aft.jsonc",
"aftConfigFormat": "jsonc"
}
#### AFT flags
{
"$schema": "https://raw.githubusercontent.com/cortexkit/aft/main/assets/aft.schema.json",
"tool_surface": "all",
"bash": {
"rewrite": true,
"compress": true,
"background": false
},
"edit_mode": "hashline",
"search_index": true,
"backup": {
"enabled": true,
"max_depth": 2,
"max_file_size": 10485760
}
}
#### Plugin cache
{
"path": "~/.pi/agent/npm/node_modules/@cortexkit/aft-pi/package.json",
"cached": "0.52.2",
"exists": true
}
#### Storage
{
"path": "~/.local/share/cortexkit/aft",
"exists": true,
"accessible": true,
"sizesByKey": {
"index": 2085718,
"semantic": 0,
"backups": 0,
"url_cache": 0,
"onnxruntime": 0,
"logs": 3410037
}
}
#### ONNX Runtime
{
"required": false,
"systemPath": null,
"systemVersion": null,
"systemCompatible": null,
"ignoredSystemPath": null,
"ignoredSystemReason": null,
"cachedPath": null,
"cachedVersion": null,
"cachedCompatible": null,
"platform": "linux-x64",
"installHint": "AFT auto-downloads ONNX Runtime on supported Linux (glibc)",
"requirement": ">=1.20"
}
#### Log file
`~/.local/share/cortexkit/aft/logs/aft-plugin.log` (2499 KB)
### Binary cache
{
"versions": [
"v0.49.4",
"v0.52.1",
"v0.52.2"
],
"activeVersion": "v0.52.2",
"totalSize": 245848944,
"path": "~/.cache/aft/bin"
}
### LSP cache
{
"npm": {
"path": "~/.cache/aft/lsp-packages",
"entries": [
{
"name": "@biomejs/biome",
"path": "~/.cache/aft/lsp-packages/%40biomejs%2Fbiome",
"size": 73256244
},
{
"name": "pyright",
"path": "~/.cache/aft/lsp-packages/pyright",
"size": 19346296
},
{
"name": "yaml-language-server",
"path": "~/.cache/aft/lsp-packages/yaml-language-server",
"size": 19204825
},
{
"name": "bash-language-server",
"path": "~/.cache/aft/lsp-packages/bash-language-server",
"size": 14519148
}
],
"totalSize": 126326513
},
"github": {
"path": "~/.cache/aft/lsp-binaries",
"entries": [],
"totalSize": 0
},
"totalSize": 126326513
}
## Recent errors (last 20, sanitized)
[2026-08-27T04:18:44.417Z] INFO [aft-pi] [aft] 2026-08-27T04:18:44Z [aft] callgraph store refresh failed: sqlite error: database is locked
[2026-08-27T06:11:17.377Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] callgraph store refresh failed: sqlite error: database is locked
### Recent AFT tool failures
- bash_drain_completions: timed out after 30000ms ×4
- tool_call: timed out after 30000ms ×4
- bridge killed after timeout ×2
## Logs (last 200 lines per harness)
#### Pi log (~/.local/share/cortexkit/aft/logs/aft-plugin.log)
[2026-08-27T05:47:48.967Z] INFO [aft-pi] [aft] 2026-08-27T05:47:48Z [aft] project root set: ~/workspace/aiact
[2026-08-27T05:47:48.968Z] INFO [aft-pi] [aft] 2026-08-27T05:47:48Z [aft] gitignore matcher built: 2 pattern(s)
[2026-08-27T05:47:48.981Z] INFO [aft-pi] [aft] 2026-08-27T05:47:48Z [aft] quarantining unresolved background task bash-fbf9c62fd9d39364: background task layout not found
[2026-08-27T05:47:48.982Z] INFO [aft-pi] [aft] 2026-08-27T05:47:48Z [aft] watcher started: ~/workspace/aiact
[2026-08-27T05:47:48.997Z] INFO [aft-pi] Binary version: 0.52.2
[2026-08-27T05:47:48.998Z] INFO [aft-pi] [aft] 2026-08-27T05:47:48Z [aft] [ses_01a041c2-986c-7449-95f8-61e22754515f] bash_wait_detach: session=01a041c2-986c-7449-95f8-61e22754515f detached=false active_wait_sessions=0
[2026-08-27T05:47:49.008Z] INFO [aft-pi] [aft] 2026-08-27T05:47:49Z [aft] loaded symbol cache from disk: 1 files
[2026-08-27T05:47:49.009Z] INFO [aft-pi] [aft] 2026-08-27T05:47:49Z [aft] pre-warmed symbol cache: 0 new, 1 cached, 1 files total
[2026-08-27T05:47:53.862Z] INFO [aft-pi] [01a04191-6c23-7615-9422-a68d68e8be7d] hashline registration carrier transport=ndjson phase=tool_call edit_slot_survives=true
[2026-08-27T05:48:24.021Z] INFO [aft-pi] [aft] 2026-08-27T05:48:24Z [aft] [ses_01a04191-6c23-7615-9422-a68d68e8be7d] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=11 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T05:49:19.640Z] INFO [aft-pi] [aft] 2026-08-27T05:49:19Z [aft] [ses_01a04191-6c23-7615-9422-a68d68e8be7d] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=6 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T05:50:06.260Z] INFO [aft-pi] [aft] 2026-08-27T05:50:06Z [aft] [ses_01a04191-6c23-7615-9422-a68d68e8be7d] log retention sweep: removed_files=0 bytes_freed=0
[2026-08-27T06:00:18.478Z] INFO [aft-pi] [aft] 2026-08-27T06:00:17Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] bash_wait_detach: session=01a0377e-81d6-72d6-885c-5e90ec599a10 detached=false active_wait_sessions=0
[2026-08-27T06:00:19.619Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:00:19.621Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:00:19.621Z] INFO [aft-pi] AFT extension loading (plugin v0.52.2)
[2026-08-27T06:00:19.629Z] INFO [aft-pi] Resolved binary from versioned cache: ~/.cache/aft/bin/v0.52.2/aft
[2026-08-27T06:00:19.630Z] INFO [aft-pi] AFT storage migration skipped for pi: no legacy data at ~/.pi/agent/aft; using ~/.local/share/cortexkit/aft for fresh install
[2026-08-27T06:00:19.631Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:00:19.751Z] INFO [aft-pi] [lsp] auto-install: 3 npm + 0 github install(s) running in background
[2026-08-27T06:00:19.755Z] INFO [aft-pi] Workflow hints injected (3695 chars)
[2026-08-27T06:00:19.755Z] INFO [aft-pi] AFT extension ready (surface=all)
[2026-08-27T06:00:19.756Z] INFO [aft-pi] Spawning binary: ~/.cache/aft/bin/v0.52.2/aft (cwd: ~/research/quant-research-qlib)
[2026-08-27T06:00:19.756Z] INFO [aft-pi] bridge.spawnProcess: useFastembedBackend=true, parentORT=(unset), ortLibraryPath=(none)
[2026-08-27T06:00:19.996Z] INFO [aft-pi] hashline registration carrier transport=ndjson phase=configure edit_slot_survives=true
[2026-08-27T06:00:20.609Z] INFO [aft-pi] [aft] 2026-08-27T06:00:20Z [aft] log retention sweep: removed_files=0 bytes_freed=0
[2026-08-27T06:00:20.609Z] INFO [aft-pi] [aft] 2026-08-27T06:00:20Z [aft] started, pid 793583
[2026-08-27T06:00:20.837Z] INFO [aft-pi] [aft] 2026-08-27T06:00:20Z [aft] project root set: ~/research/quant-research-qlib
[2026-08-27T06:00:20.846Z] INFO [aft-pi] [aft] 2026-08-27T06:00:20Z [aft] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:00:20.933Z] INFO [aft-pi] [aft] 2026-08-27T06:00:20Z [aft] search index: refreshed 4 stale file(s) from disk cache
[2026-08-27T06:00:20.973Z] INFO [aft-pi] [aft] 2026-08-27T06:00:20Z [aft] loaded symbol cache from disk: 138 files
[2026-08-27T06:00:21.003Z] INFO [aft-pi] [aft] 2026-08-27T06:00:21Z [aft] persisted symbol cache: 142 files
[2026-08-27T06:00:21.003Z] INFO [aft-pi] [aft] 2026-08-27T06:00:21Z [aft] pre-warmed symbol cache: 4 new, 138 cached, 142 files total
[2026-08-27T06:00:21.036Z] INFO [aft-pi] [aft] 2026-08-27T06:00:21Z [aft] project root set: ~/research/quant-research-qlib
[2026-08-27T06:00:21.036Z] INFO [aft-pi] [lsp] lsp_paths_extra updated after auto-install: 4 dirs pushed to live bridges
[2026-08-27T06:00:21.040Z] INFO [aft-pi] [aft] 2026-08-27T06:00:21Z [aft] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:00:21.042Z] INFO [aft-pi] Binary version: 0.52.2
[2026-08-27T06:00:21.043Z] INFO [aft-pi] [aft] 2026-08-27T06:00:21Z [aft] [ses_01a041ce-1026-7c6a-b083-70ab1784da8e] bash_wait_detach: session=01a041ce-1026-7c6a-b083-70ab1784da8e detached=false active_wait_sessions=0
[2026-08-27T06:00:23.051Z] INFO [aft-pi] [aft] 2026-08-27T06:00:23Z [aft] watcher stop timed out after 2000 ms: ~/research/quant-research-qlib
[2026-08-27T06:00:26.340Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] watcher started: ~/research/quant-research-qlib
[2026-08-27T06:00:26.341Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] watcher stopped: ~/research/quant-research-qlib
[2026-08-27T06:00:26.583Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] [ses_01a041ce-1026-7c6a-b083-70ab1784da8e] watcher overflow: forcing project rescan
[2026-08-27T06:00:26.586Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] [ses_01a041ce-1026-7c6a-b083-70ab1784da8e] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:00:26.589Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] [ses_01a041ce-1026-7c6a-b083-70ab1784da8e] callgraph store scheduled for background rebuild after watcher overflow
[2026-08-27T06:00:26.589Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] [ses_01a041ce-1026-7c6a-b083-70ab1784da8e] started search index refresh after watcher overflow
[2026-08-27T06:00:26.696Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] search index cold streaming build: 147 files, 27952 trigrams, 102 ms (pool=6)
[2026-08-27T06:00:26.514Z] INFO [aft-pi] [aft] 2026-08-27T06:00:26Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=1 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:00:30.062Z] INFO [aft-pi] [01a0377e-81d6-72d6-885c-5e90ec599a10] hashline registration carrier transport=ndjson phase=tool_call edit_slot_survives=true repeated=5
[2026-08-27T06:01:16.253Z] INFO [aft-pi] [aft] 2026-08-27T06:01:16Z [aft] [ses_01a041ce-1026-7c6a-b083-70ab1784da8e] perf tick: watcher={ingested:1,paths:0,dropped:1} drains=5 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:01:22.047Z] INFO [aft-pi] [aft] 2026-08-27T06:01:22Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=36 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:02:17.573Z] INFO [aft-pi] [aft] 2026-08-27T06:02:17Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=12 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:03:13.250Z] INFO [aft-pi] [aft] 2026-08-27T06:03:13Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=1 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:06:58.191Z] INFO [aft-pi] [aft] 2026-08-27T06:06:58Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=1 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:07:53.836Z] INFO [aft-pi] [aft] 2026-08-27T06:07:53Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=7 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:08:48.737Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:08:48.739Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:08:48.739Z] INFO [aft-pi] AFT extension loading (plugin v0.52.2)
[2026-08-27T06:08:48.748Z] INFO [aft-pi] Resolved binary from versioned cache: ~/.cache/aft/bin/v0.52.2/aft
[2026-08-27T06:08:48.748Z] INFO [aft-pi] AFT storage migration skipped for pi: no legacy data at ~/.pi/agent/aft; using ~/.local/share/cortexkit/aft for fresh install
[2026-08-27T06:08:48.749Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:08:48.813Z] INFO [aft-pi] [lsp] auto-install: 3 npm + 0 github install(s) running in background
[2026-08-27T06:08:48.817Z] INFO [aft-pi] Workflow hints injected (3695 chars)
[2026-08-27T06:08:48.817Z] INFO [aft-pi] AFT extension ready (surface=all)
[2026-08-27T06:08:48.818Z] INFO [aft-pi] Spawning binary: ~/.cache/aft/bin/v0.52.2/aft (cwd: ~/research/quant-research-qlib)
[2026-08-27T06:08:48.818Z] INFO [aft-pi] bridge.spawnProcess: useFastembedBackend=true, parentORT=(unset), ortLibraryPath=(none)
[2026-08-27T06:08:49.051Z] INFO [aft-pi] hashline registration carrier transport=ndjson phase=configure edit_slot_survives=false
[2026-08-27T06:08:49.453Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=1 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:08:49.599Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] log retention sweep: removed_files=0 bytes_freed=0
[2026-08-27T06:08:49.599Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] started, pid 830300
[2026-08-27T06:08:49.811Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] project root set: ~/research/quant-research-qlib
[2026-08-27T06:08:49.815Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:08:49.862Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] search index: refreshed 4 stale file(s) from disk cache
[2026-08-27T06:08:49.902Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] search index build adopted by equivalent reconfigure (generation 1)
[2026-08-27T06:08:49.902Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] project root set: ~/research/quant-research-qlib
[2026-08-27T06:08:49.902Z] INFO [aft-pi] [lsp] lsp_paths_extra updated after auto-install: 4 dirs pushed to live bridges
[2026-08-27T06:08:49.905Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:08:49.906Z] INFO [aft-pi] Binary version: 0.52.2
[2026-08-27T06:08:49.912Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] loaded symbol cache from disk: 142 files
[2026-08-27T06:08:49.913Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] [ses_01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f] bash_wait_detach: session=01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f detached=false active_wait_sessions=0
[2026-08-27T06:08:49.913Z] INFO [aft-pi] [aft] 2026-08-27T06:08:49Z [aft] pre-warmed symbol cache: 0 new, 142 cached, 142 files total
[2026-08-27T06:08:50.787Z] INFO [aft-pi] [aft] 2026-08-27T06:08:50Z [aft] watcher stopped: ~/research/quant-research-qlib
[2026-08-27T06:08:50.819Z] INFO [aft-pi] [aft] 2026-08-27T06:08:50Z [aft] watcher started: ~/research/quant-research-qlib
[2026-08-27T06:08:50.920Z] INFO [aft-pi] [aft] 2026-08-27T06:08:50Z [aft] [ses_01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f] watcher overflow: forcing project rescan
[2026-08-27T06:08:50.924Z] INFO [aft-pi] [aft] 2026-08-27T06:08:50Z [aft] [ses_01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:08:50.927Z] INFO [aft-pi] [aft] 2026-08-27T06:08:50Z [aft] [ses_01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f] callgraph store scheduled for background rebuild after watcher overflow
[2026-08-27T06:08:50.927Z] INFO [aft-pi] [aft] 2026-08-27T06:08:50Z [aft] [ses_01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f] started search index refresh after watcher overflow
[2026-08-27T06:08:51.034Z] INFO [aft-pi] [aft] 2026-08-27T06:08:51Z [aft] search index cold streaming build: 147 files, 27952 trigrams, 101 ms (pool=6)
[2026-08-27T06:09:47.318Z] INFO [aft-pi] [aft] 2026-08-27T06:09:47Z [aft] [ses_01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f] perf tick: watcher={ingested:1,paths:0,dropped:1} drains=5 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:09:47.346Z] INFO [aft-pi] [aft] 2026-08-27T06:09:47Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=1 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:10:42.871Z] INFO [aft-pi] [aft] 2026-08-27T06:10:42Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=3 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:10:49.038Z] INFO [aft-pi] [01a0377e-81d6-72d6-885c-5e90ec599a10] hashline registration carrier transport=ndjson phase=tool_call edit_slot_survives=true repeated=16
[2026-08-27T06:11:17.309Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] [ses_01a041d5-de4f-72dc-a5ae-e2a9ef8a8d1f] invalidated 2 files
[2026-08-27T06:11:17.320Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] callgraph store writer open failed during refresh; deferred paths: callgraph writer lease error: timed out acquiring filesystem lock
[2026-08-27T06:11:17.311Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:11:17.311Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] tier2 refresh scheduled: reason=ceiling, categories=["dead_code", "unused_exports", "duplicates", "cycles"]
[2026-08-27T06:11:17.377Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] callgraph store refresh failed: sqlite error: database is locked
[2026-08-27T06:11:17.377Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] marked 1 callgraph store file(s) stale after refresh failure
[2026-08-27T06:11:17.432Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] tier2 dead_code: refreshed callgraph store at ~/.local/share/cortexkit/aft/callgraph/d35f055cc7f455b1 for 6 watcher path(s): changed=6 deleted=0 refreshed_own=1
[2026-08-27T06:11:17.670Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] perf tier2_callgraph_snapshot: source=callgraph_store files=142 exports=0 edges=7549 entry_points=0 ms=449
[2026-08-27T06:11:17.824Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] perf tier2 phases category=dead_code freshness=0ms snapshot=466ms scan=50ms(6 files) db=24ms(lock=0,txn=24) rollup=62ms
[2026-08-27T06:11:17.824Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] perf tier2 category=dead_code reuse=miss ms=623
[2026-08-27T06:11:17.876Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] perf tier2 phases category=unused_exports freshness=0ms snapshot=0ms scan=28ms(6 files) db=8ms(lock=0,txn=8) rollup=16ms
[2026-08-27T06:11:17.876Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] perf tier2 category=unused_exports reuse=miss ms=62
[2026-08-27T06:11:17.922Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] perf tier2 category=duplicates reuse=miss ms=45
[2026-08-27T06:11:17.953Z] INFO [aft-pi] [aft] 2026-08-27T06:11:17Z [aft] perf tier2 category=cycles reuse=miss ms=26
[2026-08-27T06:11:24.376Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:11:24.378Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:11:24.378Z] INFO [aft-pi] AFT extension loading (plugin v0.52.2)
[2026-08-27T06:11:24.387Z] INFO [aft-pi] Resolved binary from versioned cache: ~/.cache/aft/bin/v0.52.2/aft
[2026-08-27T06:11:24.388Z] INFO [aft-pi] AFT storage migration skipped for pi: no legacy data at ~/.pi/agent/aft; using ~/.local/share/cortexkit/aft for fresh install
[2026-08-27T06:11:24.389Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:11:24.453Z] INFO [aft-pi] [lsp] auto-install: 3 npm + 0 github install(s) running in background
[2026-08-27T06:11:24.457Z] INFO [aft-pi] Workflow hints injected (3695 chars)
[2026-08-27T06:11:24.457Z] INFO [aft-pi] AFT extension ready (surface=all)
[2026-08-27T06:11:24.458Z] INFO [aft-pi] Spawning binary: ~/.cache/aft/bin/v0.52.2/aft (cwd: ~/research/quant-research-qlib)
[2026-08-27T06:11:24.458Z] INFO [aft-pi] bridge.spawnProcess: useFastembedBackend=true, parentORT=(unset), ortLibraryPath=(none)
[2026-08-27T06:11:24.686Z] INFO [aft-pi] hashline registration carrier transport=ndjson phase=configure edit_slot_survives=false
[2026-08-27T06:11:25.272Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] log retention sweep: removed_files=0 bytes_freed=0
[2026-08-27T06:11:25.272Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] started, pid 831438
[2026-08-27T06:11:25.445Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] project root set: ~/research/quant-research-qlib
[2026-08-27T06:11:25.448Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:11:25.490Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] search index: refreshed 5 stale file(s) from disk cache
[2026-08-27T06:11:25.503Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] search index build adopted by equivalent reconfigure (generation 1)
[2026-08-27T06:11:25.503Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] project root set: ~/research/quant-research-qlib
[2026-08-27T06:11:25.504Z] INFO [aft-pi] [lsp] lsp_paths_extra updated after auto-install: 4 dirs pushed to live bridges
[2026-08-27T06:11:25.507Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:11:25.509Z] INFO [aft-pi] Binary version: 0.52.2
[2026-08-27T06:11:25.511Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] bash_wait_detach: session=01a041d8-3566-7f29-8fce-63b8e0ab3a1a detached=false active_wait_sessions=0
[2026-08-27T06:11:25.528Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] loaded symbol cache from disk: 141 files
[2026-08-27T06:11:25.548Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] persisted symbol cache: 142 files
[2026-08-27T06:11:25.548Z] INFO [aft-pi] [aft] 2026-08-27T06:11:25Z [aft] pre-warmed symbol cache: 1 new, 141 cached, 142 files total
[2026-08-27T06:11:26.340Z] INFO [aft-pi] [aft] 2026-08-27T06:11:26Z [aft] watcher stopped: ~/research/quant-research-qlib
[2026-08-27T06:11:26.395Z] INFO [aft-pi] [aft] 2026-08-27T06:11:26Z [aft] watcher started: ~/research/quant-research-qlib
[2026-08-27T06:11:26.516Z] INFO [aft-pi] [aft] 2026-08-27T06:11:26Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] watcher overflow: forcing project rescan
[2026-08-27T06:11:26.519Z] INFO [aft-pi] [aft] 2026-08-27T06:11:26Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] gitignore matcher built: 43 pattern(s)
[2026-08-27T06:11:26.523Z] INFO [aft-pi] [aft] 2026-08-27T06:11:26Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] callgraph store scheduled for background rebuild after watcher overflow
[2026-08-27T06:11:26.523Z] INFO [aft-pi] [aft] 2026-08-27T06:11:26Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] started search index refresh after watcher overflow
[2026-08-27T06:11:26.633Z] INFO [aft-pi] [aft] 2026-08-27T06:11:26Z [aft] search index cold streaming build: 147 files, 27953 trigrams, 104 ms (pool=6)
[2026-08-27T06:11:31.917Z] INFO [aft-pi] [aft] 2026-08-27T06:11:31Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:11:32.062Z] INFO [aft-pi] [aft] 2026-08-27T06:11:32Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] invalidated 2 files
[2026-08-27T06:11:38.550Z] INFO [aft-pi] [aft] 2026-08-27T06:11:38Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:2,paths:4,dropped:0} drains=17 tier2=[cycles:1/20ms,dead_code:1/604ms,duplicates:1/25ms,unused_exports:1/54ms] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=1 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:11:54.394Z] INFO [aft-pi] [01a0377e-81d6-72d6-885c-5e90ec599a10] hashline registration carrier transport=ndjson phase=tool_call edit_slot_survives=true repeated=13
[2026-08-27T06:12:09.535Z] INFO [aft-pi] [aft] 2026-08-27T06:12:09Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:12:09.583Z] INFO [aft-pi] [aft] 2026-08-27T06:12:09Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] invalidated 2 files
[2026-08-27T06:12:23.023Z] INFO [aft-pi] [aft] 2026-08-27T06:12:23Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] perf tick: watcher={ingested:3,paths:4,dropped:1} drains=5 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=2 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:12:34.216Z] INFO [aft-pi] [aft] 2026-08-27T06:12:34Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:1,paths:2,dropped:0} drains=14 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=1 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:12:40.711Z] INFO [aft-pi] [aft] 2026-08-27T06:12:40Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:12:40.735Z] INFO [aft-pi] [aft] 2026-08-27T06:12:40Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] invalidated 2 files
[2026-08-27T06:13:08.353Z] INFO [aft-pi] [01a0377e-81d6-72d6-885c-5e90ec599a10] hashline registration carrier transport=ndjson phase=tool_call edit_slot_survives=true repeated=11
[2026-08-27T06:13:18.621Z] INFO [aft-pi] [aft] 2026-08-27T06:13:18Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] perf tick: watcher={ingested:1,paths:2,dropped:0} drains=0 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=1 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:13:23.158Z] INFO [aft-pi] [aft] 2026-08-27T06:13:23Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] invalidated 2 files
[2026-08-27T06:13:23.234Z] INFO [aft-pi] [aft] 2026-08-27T06:13:23Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:13:29.985Z] INFO [aft-pi] [aft] 2026-08-27T06:13:29Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:2,paths:4,dropped:0} drains=14 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=2 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:14:04.088Z] INFO [aft-pi] [aft] 2026-08-27T06:14:04Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:14:04.183Z] INFO [aft-pi] [aft] 2026-08-27T06:14:04Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] invalidated 2 files
[2026-08-27T06:14:12.697Z] INFO [aft-pi] [01a0377e-81d6-72d6-885c-5e90ec599a10] hashline registration carrier transport=ndjson phase=tool_call edit_slot_survives=true repeated=11
[2026-08-27T06:14:14.044Z] INFO [aft-pi] [aft] 2026-08-27T06:14:14Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] perf tick: watcher={ingested:2,paths:4,dropped:0} drains=0 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=2 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:14:22.680Z] INFO [aft-pi] [aft] 2026-08-27T06:14:22Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] invalidated 2 files
[2026-08-27T06:14:23.078Z] INFO [aft-pi] [aft] 2026-08-27T06:14:22Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:14:25.448Z] INFO [aft-pi] [aft] 2026-08-27T06:14:25Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:2,paths:4,dropped:0} drains=16 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=2 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:14:29.502Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] inspect-triggered cold-build request queued behind concurrency cap (2): request=inspect:~/research/quant-research-qlib:40 kind=explicit inspect Tier-2 run
[2026-08-27T06:14:29.502Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] inspect-triggered cold-build request queued behind concurrency cap (2): request=inspect:~/research/quant-research-qlib:38 kind=explicit inspect Tier-2 run
[2026-08-27T06:14:29.562Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2 category=duplicates reuse=miss ms=79
[2026-08-27T06:14:29.569Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] tier2 dead_code: refreshed callgraph store at ~/.local/share/cortexkit/aft/callgraph/d35f055cc7f455b1 for 3 watcher path(s): changed=3 deleted=0 refreshed_own=0
[2026-08-27T06:14:29.584Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] inspect-triggered cold-build slot acquired after 100ms wait: request=inspect:~/research/quant-research-qlib:40 kind=explicit inspect Tier-2 run
[2026-08-27T06:14:29.614Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2 category=cycles reuse=miss ms=136
[2026-08-27T06:14:29.620Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2_callgraph_snapshot: source=callgraph_store files=142 exports=0 edges=7573 entry_points=0 ms=127
[2026-08-27T06:14:29.684Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] inspect-triggered cold-build slot acquired after 200ms wait: request=inspect:~/research/quant-research-qlib:38 kind=explicit inspect Tier-2 run
[2026-08-27T06:14:29.762Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2 phases category=unused_exports freshness=5ms snapshot=0ms scan=25ms(3 files) db=8ms(lock=0,txn=8) rollup=22ms
[2026-08-27T06:14:29.762Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2 category=unused_exports reuse=miss ms=269
[2026-08-27T06:14:29.762Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2 phases category=dead_code freshness=9ms snapshot=134ms scan=52ms(3 files) db=8ms(lock=0,txn=8) rollup=60ms
[2026-08-27T06:14:29.762Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2 category=dead_code reuse=miss ms=271
[2026-08-27T06:14:29.892Z] INFO [aft-pi] [aft] 2026-08-27T06:14:29Z [aft] perf tier2_callgraph_snapshot: source=callgraph_store files=142 exports=0 edges=7573 entry_points=0 ms=136
[2026-08-27T06:14:38.059Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:14:38.061Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:14:38.061Z] INFO [aft-pi] AFT extension loading (plugin v0.52.2)
[2026-08-27T06:14:38.070Z] INFO [aft-pi] Resolved binary from versioned cache: ~/.cache/aft/bin/v0.52.2/aft
[2026-08-27T06:14:38.070Z] INFO [aft-pi] AFT storage migration skipped for pi: no legacy data at ~/.pi/agent/aft; using ~/.local/share/cortexkit/aft for fresh install
[2026-08-27T06:14:38.071Z] INFO [aft-pi] Config loaded from ~/.config/cortexkit/aft.jsonc
[2026-08-27T06:14:38.077Z] INFO [aft-pi] Workflow hints injected (3695 chars)
[2026-08-27T06:14:38.077Z] INFO [aft-pi] AFT extension ready (surface=all)
[2026-08-27T06:14:38.078Z] INFO [aft-pi] Spawning binary: ~/.cache/aft/bin/v0.52.2/aft (cwd: ~/workspace/aiact)
[2026-08-27T06:14:38.078Z] INFO [aft-pi] bridge.spawnProcess: useFastembedBackend=true, parentORT=(unset), ortLibraryPath=(none)
[2026-08-27T06:14:38.422Z] INFO [aft-pi] hashline registration carrier transport=ndjson phase=configure edit_slot_survives=false
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:38Z [aft] log retention sweep: removed_files=0 bytes_freed=0
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:38Z [aft] started, pid 832868
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:39Z [aft] project root set: ~/workspace/aiact
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:39Z [aft] gitignore matcher built: 2 pattern(s)
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:39Z [aft] quarantining unresolved background task bash-fbf9c62fd9d39364: background task layout not found
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:39Z [aft] watcher started: ~/workspace/aiact
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:39Z [aft] loaded symbol cache from disk: 1 files
[2026-08-27T06:14:39.362Z] INFO [aft-pi] [aft] 2026-08-27T06:14:39Z [aft] pre-warmed symbol cache: 0 new, 1 cached, 1 files total
[2026-08-27T06:14:39.425Z] INFO [aft-pi] Binary version: 0.52.2
[2026-08-27T06:14:57.044Z] INFO [aft-pi] [aft] 2026-08-27T06:14:56Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] invalidated 2 files
[2026-08-27T06:14:57.111Z] INFO [aft-pi] [aft] 2026-08-27T06:14:57Z [aft] [ses_01a041d8-3566-7f29-8fce-63b8e0ab3a1a] invalidated 2 files
[2026-08-27T06:15:23.226Z] INFO [aft-pi] [aft] 2026-08-27T06:15:23Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:1,paths:2,dropped:0} drains=18 tier2=[cycles:1/30ms,dead_code:1/266ms,duplicates:1/46ms,unused_exports:1/62ms] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=1 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:15:28.794Z] INFO [aft-pi] [01a0377e-81d6-72d6-885c-5e90ec599a10] hashline registration carrier transport=ndjson phase=tool_call edit_slot_survives=true repeated=9
[2026-08-27T06:15:34.533Z] INFO [aft-pi] [aft] 2026-08-27T06:15:34Z [aft] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=3 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:16:18.738Z] INFO [aft-pi] [aft] 2026-08-27T06:16:18Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=12 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
[2026-08-27T06:17:14.257Z] INFO [aft-pi] [aft] 2026-08-27T06:17:14Z [aft] [ses_01a0377e-81d6-72d6-885c-5e90ec599a10] perf tick: watcher={ingested:0,paths:0,dropped:0} drains=7 tier2=[none] semantic={collects:0,files:0,chunks:0,ms:0} callgraph_invalidations=0 executor_completed={interactive:0,maintenance:0} oldest_queued_ms={interactive:none,maintenance:none} toolcall={new:0,window:0,p50_total_ms:0,max_total_ms:0,p50_queue_ms:0,max_queue_ms:0} file_log_dropped=0
_Usernames and home paths have been stripped from this report._
Short description
Pi hashline edit frequently fails on small files
What happened?
Summary
Hashline editing within Pi frequently fails during normal editing workflows,
even on small source files that are well below the documented size limit for this feature.
The observed failure rate is substantially higher compared to the default edit mode.
Failures are intermittent: they do not happen every time, but occur repeatedly across ordinary editing sessions on small source code.
Examples
One representative failure sequence:
Attempted hashline edit failed with error:
The model explicitly re‑invoked the read tool on the file. The file is only 130 lines of Python source (not auto‑generated large reports), far under the documented size threshold. The read output clearly contained all expected lines including line 16.
The immediately‑following hashline edit then failed with:
This sequence has happened multiple times across different small source files.
Open questions / potential root causes
I do not have a confirmed root cause. Likely candidates include:
The
line 16 was not retained by the tagged readerror is especially problematic:the preceding read tool call returned the file content and visibly included line 16,
yet the subsequent edit rejects this line as missing from tagged read snapshot.
Observation: Many failures appear to occur shortly after a prior hashline edit failure,
which suggests state carry‑over after failure may be a contributing factor.
Expected behavior
readfollowed immediately by a hashline edit should reliably complete successfully.Diagnostics
Plugin version
No response
AFT binary version
No response
Platform
No response
Log output (optional)