Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
334 commits
Select commit Hold shift + click to select a range
aac0e13
feat: distinguish observed native duplicate attempt accounting
zzet Oct 29, 2026
7a93521
test: close direct watcher fixture without an unstarted loop
zzet Oct 29, 2026
8855181
fix: stop diagnostic collection on proven terminal duplicate coverage
zzet Oct 29, 2026
d0da6ea
feat: measure read-assisted publisher phases within its own window
zzet Oct 29, 2026
391f5d1
feat: validate actual read-assisted publisher accounting independently
zzet Oct 29, 2026
c7348ed
fix: await late publisher and background evidence after duplicate com…
zzet Oct 29, 2026
6160433
test: describe optional read-assisted accounting window in report schema
zzet Oct 29, 2026
a7b529e
Merge shutdown recovery and current main before publisher validation
zzet Oct 29, 2026
f6150b7
test: include optional publisher accounting in paired report schema
zzet Oct 29, 2026
1642d61
fix: lowercase read-repair accounting error text
zzet Oct 29, 2026
9dfd49b
fix: bind publisher evidence to the original publication identity
zzet Oct 29, 2026
9281d09
docs: describe independent publisher phases and late evidence
zzet Oct 29, 2026
1281be4
fix(load): bound raw evidence spool by accepted bytes
zzet Oct 29, 2026
1436c93
test(load): join held evidence writers during cleanup
zzet Oct 29, 2026
ce63460
fix(indexer): measure ordered native timer handoffs
zzet Oct 29, 2026
10f33ce
test(indexer): cover handoff overflow and refusal wire identity
zzet Oct 29, 2026
3b0fe3d
fix(load): retain nil sink on evidence setup failure
zzet Oct 29, 2026
87ac736
fix(indexer): retain observed callback refusal reasons
zzet Oct 29, 2026
cfdc610
refactor(load): share edit reply and probe observations
zzet Oct 29, 2026
df99b8a
fix: retain read-repair witness before watcher admission
zzet Oct 29, 2026
1e76164
test: await bound ticket in admitted read-repair fixture
zzet Oct 29, 2026
23553dd
fix: bind in-flight read-repair candidates after actual commit
zzet Oct 29, 2026
69fb542
test: isolate read-repair ownership refusal from readiness
zzet Oct 29, 2026
d0d29a0
feat: pair initial edit-and-probe accounting requests
zzet Oct 29, 2026
3dc190c
docs: specify zero linked worktrees for paired accounting cell
zzet Oct 29, 2026
bbf29b8
test: use resource envelope for paired stats fixture
zzet Oct 29, 2026
169582d
Merge main into edit-loop measurements
zzet Oct 29, 2026
9847518
fix: make paired probe cancellation ownership explicit
zzet Oct 29, 2026
c41147f
test(mcp): reproduce read repair straddling commit bookkeeping
zzet Oct 29, 2026
6b4a837
test(mcp): hold straddling repair before its source read
zzet Oct 29, 2026
f42ea2d
fix(mcp): bind read repair to its actual applied acceptance
zzet Oct 29, 2026
9a56f62
feat(bench): add explicit TypeScript intrafile probe cell
zzet Oct 30, 2026
e4ed101
feat(bench): add explicit Python intrafile probe cell
zzet Oct 30, 2026
541dd2a
style(bench): satisfy language fixture lint checks
zzet Oct 30, 2026
6fef7b8
feat(bench): add explicit whole-file intrafile write cell
zzet Oct 30, 2026
d888e4d
test(bench): refresh optional write intent schemas
zzet Oct 30, 2026
25f90fa
feat(load): model distinct one-file batch receipt identities
zzet Oct 30, 2026
04df200
feat(load): bind batch acknowledgements to offered whole-file bytes
zzet Oct 30, 2026
0dfc5ce
feat(mcp): isolate batch file publication observation ownership
zzet Oct 30, 2026
1a6ab98
feat(mcp): retain observed batch writer returns behind final verdict
zzet Oct 30, 2026
f45b329
feat: bind measured batch file to its original publication ticket
zzet Oct 30, 2026
e6c12aa
feat: expose separate bounded batch file timing references
zzet Oct 30, 2026
6e7828b
test: cover real batch writer and durable observation boundaries
zzet Oct 30, 2026
5184e48
perf: avoid batch timing lookup without an observed request
zzet Oct 30, 2026
58a3c12
test: refuse batch publication timing after real directory rollback
zzet Oct 30, 2026
d2da547
test: retain original batch file ticket after actual receipt loss
zzet Oct 30, 2026
8a8982a
test: bind batch file accounting to public transaction and original p…
zzet Oct 30, 2026
b70d0d8
feat: account shared batch ACK independently from per-file publisher …
zzet Oct 30, 2026
eac39e0
feat: collect one-file batch evidence through distinct public timing …
zzet Oct 30, 2026
498621c
test: pin optional batch timing identity schema
zzet Oct 30, 2026
6b1d4ad
fix: honor explicit parser inapplicability for owned batch ACK windows
zzet Oct 30, 2026
e7da37a
test: reproduce batch reader capture before durable verdict and ticke…
zzet Oct 30, 2026
6255f24
test: propagate held batch fixture failure through the real handler
zzet Oct 30, 2026
0c42edd
fix: retain exact batch writer candidate across publication admission
zzet Oct 30, 2026
6782dce
test: preserve batch completion and ownership fences across early rea…
zzet Oct 30, 2026
24dbec5
test: require explicit null parser evidence and propagate fixture tim…
zzet Oct 30, 2026
babec98
test: specify direct requested background ownership and real failed S…
zzet Oct 30, 2026
eca6bac
test: inspect arm bounds only after direct background publication
zzet Oct 30, 2026
14061e3
feat: measure direct requested background with exact pre-callback adm…
zzet Oct 30, 2026
dc57a7e
test: reject borrowed native intervals from direct requested backgrou…
zzet Oct 30, 2026
8ae64ae
test: bind direct background predecessor proof before testing contrad…
zzet Oct 30, 2026
c75e3d2
fix: size the direct background projection with integer lap counts
zzet Oct 30, 2026
44ddea9
test: retain coalesced arithmetic while separating requested quiet ow…
zzet Oct 30, 2026
438cb82
test: retain native handoff totals with an unexecuted requested quiet…
zzet Oct 30, 2026
40d9be0
feat: bind explicit symbol-splice fixtures to actual Go TypeScript an…
zzet Oct 30, 2026
57b0ed9
feat: bind symbol-splice parser applicability to the offered and prod…
zzet Oct 30, 2026
0c47440
feat(load): distinguish declared symbol absence from probe errors
zzet Oct 30, 2026
3f980ba
test(load): require owned declaration proof before absence probes
zzet Oct 30, 2026
4eb302e
fix(load): retain absence identity only for uncensored complete evidence
zzet Oct 30, 2026
6c53aee
fix(load): publish actual edit send time before acknowledgement
zzet Oct 30, 2026
8bc6e7a
test(load): send a complete edit request in held acknowledgement control
zzet Oct 30, 2026
8567e11
feat(load): add exact rename fixtures with positive and absence oracles
zzet Oct 30, 2026
fc6776e
feat(load): verify symbol deletion with explicit complete absence evi…
zzet Oct 30, 2026
72797b5
feat(load): add explicit numeric leaf fixtures and relation oracles
zzet Oct 30, 2026
18be869
test(mcp): exercise valid body and signature measurement splices
zzet Oct 30, 2026
8e5cab2
feat(load): route rename and delete through supported edit adapters
zzet Oct 30, 2026
74174b3
docs(load): distinguish operation fixtures and explicit absence evidence
zzet Oct 30, 2026
f2d7a57
feat(load): retain matched expected-refusal pairs as a separate category
zzet Oct 30, 2026
03cf2ac
fix(load): honor explicit empty producer collections and stale rename…
zzet Oct 30, 2026
4aed632
feat(load): witness body changes with stable following declarations
zzet Oct 30, 2026
989a3c4
feat(load): add compatible signature-change fixtures and specific ora…
zzet Oct 30, 2026
37d1f05
fix(load): request exact source ranges for mutation witnesses
zzet Oct 30, 2026
846b45b
fix(load): respect search fallback and language signature representat…
zzet Oct 30, 2026
148146f
test(load): bound complete search evidence for hundred-symbol fixtures
zzet Oct 30, 2026
5d64fed
feat(load): add explicit crossfile call fixtures and callee admission
zzet Oct 30, 2026
e138e01
test(load): distinguish Go relocation from unsupported move measurements
zzet Oct 30, 2026
c286bfa
Merge remote-tracking branch 'origin/main' into feat/edit-loop-measur…
zzet Oct 30, 2026
6849709
fix(indexer): bind refusal snapshots to the retained final publicatio…
zzet Oct 30, 2026
eab3ee4
fix(load): fence crossfile admission to real root-level source results
zzet Oct 30, 2026
a597c15
test(load): construct the parseable error-envelope refusal fixture
zzet Oct 30, 2026
4b0fd43
test(mcp): reproduce relocation caller reconciliation on real indexer…
zzet Oct 30, 2026
f3dbc2c
fix(mcp): preserve token separation when moving adjacent Go declarations
zzet Oct 30, 2026
315bf81
feat(mcp): observe real move writes and direct reconcile owners
zzet Oct 30, 2026
8760886
test(mcp): require actual per-file move executor and shared acknowled…
zzet Oct 30, 2026
6826667
fix(mcp): fence move publication by actual competing write order
zzet Oct 30, 2026
c437627
fix(mcp): project move acknowledgement without legacy physical timing…
zzet Oct 30, 2026
2729303
feat(mcp): expose direct move scheduling applicability without synthe…
zzet Oct 30, 2026
92731f6
feat(load): validate standalone move acknowledgements and independent…
zzet Oct 30, 2026
a3bc1c3
fix(load): keep unavailable move clocks null and owner-bound
zzet Oct 30, 2026
e082546
feat(load): plan explicit Go relocations with owned destination oracles
zzet Oct 30, 2026
ab4ac21
fix(mcp): keep each move direct admission and refusal immutable
zzet Oct 30, 2026
a56659b
test(load): fence the full offered Go relocation fixture
zzet Oct 30, 2026
116cd88
fix(mcp): preserve the first final move refusal on repeated callbacks
zzet Oct 30, 2026
4733741
feat(load): collect original Go move owners after immediate dual-file…
zzet Oct 30, 2026
51fad39
test(load): require both owned files in the public move restore batch
zzet Oct 30, 2026
7d7f260
style(load): format explicit move runtime controls
zzet Oct 30, 2026
284bf5a
test(load): preserve immediate own-ACK move readbacks before timing q…
zzet Oct 30, 2026
ecc3006
docs(load): describe explicit changed-fact and Go relocation cells
zzet Oct 30, 2026
a32e1c3
fix(load): retain bad move readbacks without polling immutable failur…
zzet Oct 30, 2026
4dde001
test(load): stop move collection while preserving a failed immediate …
zzet Oct 30, 2026
4b3f5b3
test(load): regenerate optional relocation report schemas
zzet Oct 30, 2026
89c511e
fix(load): match exact old-symbol absence with real inline suggestions
zzet Oct 30, 2026
8a92808
test(mcp): cover a real public target publication before move direct …
zzet Oct 30, 2026
4bf869c
test(mcp): distinguish read-assisted publication from the later direc…
zzet Oct 30, 2026
9270656
test(mcp): fence independent move read publication by original file o…
zzet Oct 30, 2026
aecddf0
feat(mcp): retain the actual read-assisted publisher of an observed m…
zzet Oct 30, 2026
8d2f363
feat(mcp): expose immutable actual move publication causes and monoto…
zzet Oct 30, 2026
74ad0ac
test(load): bind actual move reader causes and full independent windows
zzet Oct 30, 2026
a8ee7c9
feat(load): validate and name actual move publication routes without …
zzet Oct 30, 2026
5b8706f
test(mcp): prove actual public and direct move callers coalesce into …
zzet Oct 30, 2026
fc7c03f
docs(load): distinguish real move publication routes and shared windows
zzet Oct 30, 2026
587b366
fix: select deterministic adjacency samples before caps
zzet Oct 30, 2026
4b5f492
style: format the move read-assisted observation controls
zzet Oct 30, 2026
8932891
test(load): expose optional named move publication routes in schemas
zzet Oct 30, 2026
9c1d33f
perf: bind registered checkouts with indexed root seeks
zzet Oct 30, 2026
8d8b0c4
style: apply pinned lint fixes to operation measurement controls
zzet Oct 30, 2026
82eb228
perf: scope context candidates before search limits
zzet Oct 30, 2026
0b0b0f5
style: format the operation checkpoint lint corrections
zzet Oct 30, 2026
b67c714
style: simplify the remaining move ownership and restore conditions
zzet Oct 30, 2026
c48a743
perf: narrow graph walk adjacency before decoding edges
zzet Oct 30, 2026
39c4c9a
test: include typed adjacency in generation leak fence
zzet Oct 30, 2026
41d8257
style(mcp): format the retained batch acknowledgement and phase guards
zzet Oct 30, 2026
e28247e
test(mcp): pin actual JSON and TOON edit probe wire contracts
zzet Oct 30, 2026
8a7cb0c
feat(load): decode requested TOON text without borrowing JSON evidence
zzet Oct 30, 2026
836ed7c
feat(load): select explicit JSON or TOON edit and probe output indepe…
zzet Oct 30, 2026
4dfc3dc
test(load): preserve JSON identity and bind TOON intent without chang…
zzet Oct 30, 2026
f53aba5
perf: scope supplemental exact-name candidate lookups
zzet Oct 30, 2026
f32f8ac
feat(load): prove complete TOON emitted rows without synthesizing omi…
zzet Oct 30, 2026
1bbad77
perf: bound reference lookups through visible adjacency
zzet Oct 30, 2026
ab3cf71
feat(load): retain requested wire modes and refuse unsupported TOON s…
zzet Oct 30, 2026
1f19d8e
docs(load): qualify TOON wire evidence and unsupported signature meta…
zzet Oct 30, 2026
f3ab350
perf: anchor test coverage and fan-in to scoped candidates
zzet Oct 30, 2026
a5128fe
test(mcp): prove a TOON signature graph witness without missing metadata
zzet Oct 30, 2026
c1a64a9
perf: read candidate test ancestry in one indexed query
zzet Oct 30, 2026
6b59b97
style: simplify ancestor oracle node lookups
zzet Oct 30, 2026
a322f37
fix(load): distinguish full TOON summaries from compact traversals an…
zzet Oct 30, 2026
b06abc7
test(load): refuse traversal census proof on a full summary producer
zzet Oct 30, 2026
9406267
test(mcp): capture both public handler panic boundaries
zzet Oct 30, 2026
8f2c015
test: anchor overlay coverage fixtures to file identities
zzet Oct 30, 2026
cab178b
test(mcp): use base-corpus routing for in-memory output fixtures
zzet Oct 30, 2026
f495d03
fix: preserve inaccessible checkout binding errors
zzet Oct 30, 2026
ce63578
test: classify composed delta read accelerators
zzet Oct 30, 2026
6d0d062
test: retain cancelled registered lookup causes
zzet Oct 30, 2026
0f91d44
fix(load): separate exact auxiliary session notes from measured wire …
zzet Oct 30, 2026
c81297a
fix(load): preserve producer order for auxiliary notes
zzet Oct 30, 2026
885099c
feat(load): prove TOON signature edits through actual relative traver…
zzet Oct 30, 2026
8947f9f
test(load): compare normalized traversal depth as an exact integer
zzet Oct 30, 2026
51b74e0
refactor: share canonical BFS over selected readers
zzet Oct 30, 2026
8c9d8ee
test(load): honor request-copy float representation for small depth
zzet Oct 30, 2026
b6dd4f9
perf: read scoped BFS admission in one bounded statement
zzet Oct 30, 2026
5e0b285
fix: cancel selected BFS before neighbor reads
zzet Oct 30, 2026
404dba6
chore(load): publish optional edit output selection in report schemas
zzet Oct 30, 2026
ad80e76
perf: drop post-filter slack from repo-scoped symbol queries
zzet Oct 31, 2026
e00e6ce
perf: walk narrow scoped seeds hop by hop
zzet Oct 31, 2026
56433ef
perf: read walk adjacency through prepared point lookups
zzet Oct 31, 2026
9b9941c
perf: rank large scoped repositories inside their FTS run
zzet Oct 31, 2026
57161cf
style: format the analyzer report resource
zzet Oct 31, 2026
b7aa6d0
perf: count a bound session's edges from its own adjacency
zzet Oct 31, 2026
8a5213d
perf: stream only motivates edges for doc staleness
zzet Oct 31, 2026
ff691dc
docs: explain each remaining whole-store edge scan
zzet Oct 31, 2026
fd1e1c3
Merge remote-tracking branch 'origin/main' into feat/edit-loop-measur…
zzet Oct 31, 2026
dc222e2
test(load): pin the default edit-and-probe plan identity
zzet Oct 31, 2026
fb6a4c9
feat(load): plan fixed-editor arrivals for several editors on one rep…
zzet Oct 31, 2026
d4d6311
feat(load): route each edit and its own readbacks through its fixed e…
zzet Oct 31, 2026
ff99943
docs(load): describe several fixed editors on one repository
zzet Oct 31, 2026
f25ffe5
feat(load): add an explicit baseline role that reports absent phase t…
zzet Oct 31, 2026
4d706d0
refactor(mcp): count in-edges by kind through a reader's own streams
zzet Oct 31, 2026
035b2bb
feat(mcp): serve importers, fan-in and BFS from a narrowed base view
zzet Oct 31, 2026
fdf5477
test(mcp): pin the documented whole-store edge scans
zzet Oct 31, 2026
fd0c1bd
perf(sqlite): read scoped file locations from the covering file index
zzet Oct 31, 2026
77a9bff
perf(mcp): answer unprojected find_files from file locations
zzet Oct 31, 2026
9880577
perf(mcp): resolve the find_files session boundary once per call
zzet Oct 31, 2026
a8a61bf
perf(sqlite): probe BFS admission far ends through covering indexes
zzet Oct 31, 2026
d175ff1
feat(load): report readback, file-graph, relations, search and derive…
zzet Oct 31, 2026
1baf140
test(sqlite): lock the covering-probe admission plan
zzet Oct 31, 2026
c2420e9
refactor(sqlite): decode BFS admission rows apart from the statement
zzet Oct 31, 2026
82d6e73
test(sqlite): hold BFS admission snapshots to the previous statement
zzet Oct 31, 2026
b02cd0d
test(mcp): pin scoped admission walks across caps and scopes
zzet Oct 31, 2026
6a183b2
feat(load): summarize edit-probe distributions with seeded bootstrap …
zzet Oct 31, 2026
0e96ae9
feat(load): measure pure reads under edit beside a same-run no-edit w…
zzet Oct 31, 2026
8dc6d01
docs(load): document roles, per-edit times, intervals and reads under…
zzet Oct 31, 2026
d4c74c3
test(mcp): count the per-kind scans behind a narrowed view's fan-in
zzet Oct 31, 2026
2f7fe35
test(mcp): bound the rows a scoped find_files reads
zzet Oct 31, 2026
9a89044
refactor(load): isolate the strict edit output decoder
zzet Oct 31, 2026
58d12b0
feat(load): account GCX as an explicitly unavailable output mode
zzet Oct 31, 2026
9176f33
test(mcp): pin the actual compact text producers used by edit probes
zzet Oct 31, 2026
1151c2a
feat(load): decode compact text answers for presence-proved call addi…
zzet Oct 31, 2026
15ecf92
perf(sqlite): stop workspace-scoped admission walks at the workspace
zzet Oct 31, 2026
9636604
test(sqlite): cover the workspace gate on BFS admission walks
zzet Oct 31, 2026
bdb9dec
test(mcp): compare bound-session admission walks with the Go walk
zzet Oct 31, 2026
2741338
feat(load): probe through the CLI call verb as its own transport
zzet Oct 31, 2026
2cc5922
docs(load): describe compact, CLI and unavailable GCX accounting
zzet Oct 31, 2026
677277a
feat(load): measure explicit TypeScript and Python relocation refusal…
zzet Oct 31, 2026
0222fae
feat(load): add native shell-write and editor-save senders with their…
zzet Oct 31, 2026
5cfe671
feat(load): add native create/delete pairs and a two-editor hot-file …
zzet Oct 31, 2026
bd21d76
feat(load): measure a daemon kill and restart with an acknowledged re…
zzet Oct 31, 2026
414a05e
docs(load): document live refusals, native writes and lifecycle cells
zzet Oct 31, 2026
224d692
test(mcp): count what a scoped check_references reads for importers
zzet Oct 31, 2026
46631a4
fix(load): take the closing receipt on the restart cell's reopened ed…
zzet Oct 31, 2026
4bbcc6d
fix(load): kill the restart cell's daemon while its edit ACK is outst…
zzet Oct 31, 2026
b273e36
fix(load): ignore a native delete's absence answers before its create…
zzet Oct 31, 2026
f22f617
fix(load): refuse whole-file edit.write with several editors
zzet Oct 31, 2026
e41a893
fix(load): rank censored edit records above observed values in quantiles
zzet Oct 31, 2026
6ecd05b
fix(load): count reads under edit only while a sent edit's receipt is…
zzet Oct 31, 2026
6739bfc
perf: integrate bounded BFS admission reads
zzet Nov 1, 2026
ca3e958
perf: integrate scoped file location reads
zzet Nov 1, 2026
f4eb617
feat: integrate narrowed reader capabilities
zzet Nov 1, 2026
9750894
test: integrate scoped importer row coverage
zzet Nov 1, 2026
2119214
test(mcp): count what a scoped call chain reads from the store
zzet Oct 31, 2026
71c756f
perf(query): read scoped name-only call sites with row-bound regressi…
zzet Nov 1, 2026
6bdfa5f
test(mcp): name scoped read tests so one filter selects them
zzet Oct 31, 2026
64de947
test(mcp): compare scoped callers and call chains across reader capab…
zzet Oct 31, 2026
32b7123
test(mcp): pin repo-scoped search_text reads as repositories are added
zzet Oct 31, 2026
5cf6b09
test(mcp): pin repo-scoped search_symbols reads as repositories are a…
zzet Oct 31, 2026
6ee550c
test(mcp): count smart_context graph rows, not only retrieval rows
zzet Oct 31, 2026
bc61599
test(sqlite): fence the repo-scoped incoming read by generation
zzet Oct 31, 2026
9ea9c4c
perf(query): narrow name-only placeholder reads only for a few reposi…
zzet Oct 31, 2026
1661edd
perf(sqlite): probe a call site's named repositories before the empty…
zzet Oct 31, 2026
d0af22c
docs(sqlite): say what the repo-scoped incoming read still visits
zzet Oct 31, 2026
abf274e
test(mcp): show the name-only equality test takes the narrowed read
zzet Oct 31, 2026
78444a7
test(mcp): count symbol index rows in the scoped search_symbols test
zzet Oct 31, 2026
958a829
test(mcp): stop claiming the golden test compares dynamic boundaries
zzet Oct 31, 2026
7a83815
perf(mcp): resolve bound-session symbol shorthand per repository
zzet Oct 31, 2026
0ef550c
test(mcp): pin bound-session shorthand to the session's repositories
zzet Oct 31, 2026
0798f80
fix(mcp): scope bare-name targets for callers and why
zzet Nov 1, 2026
0d106dd
fix: integrate bound-session bare-name resolution
zzet Nov 1, 2026
204f8e7
perf: integrate scoped call-site reads and row coverage
zzet Nov 1, 2026
8cf8c58
test(mcp): count scoped file location rows in the shared reader
zzet Nov 1, 2026
e6bfd88
test(load): decode restart receipt status before checking its fields
zzet Nov 1, 2026
f24dbd1
merge: refresh scoped reads with current main
zzet Nov 1, 2026
7ce98c9
fix(mcp): pass a compatible exact-name fallback to session resolution
zzet Nov 1, 2026
c0b83b6
fix(load): accept native write evidence in edit-probe phase validation
zzet Nov 1, 2026
9c9b149
merge: refresh scoped reads with performance budget tooling
zzet Nov 1, 2026
495284f
Merge main performance budgets into edit-loop measurements
zzet Nov 1, 2026
de2e831
Merge scoped read parent into edit-loop measurements
zzet Nov 1, 2026
2669a80
fix(perf): explicitly enable cgo for performance artifacts
zzet Nov 1, 2026
67c3e0f
merge: include explicit cgo performance workflow settings
zzet Nov 1, 2026
48ed957
Merge artifact workflow parent into edit-loop measurements
zzet Nov 1, 2026
e10f0f7
test(mcp): request full output for deletion measurement evidence
zzet Nov 1, 2026
1e58d0b
fix(load): snapshot native file identity before replacement
zzet Nov 1, 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
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/workflows/perf-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ concurrency:
cancel-in-progress: false

env:
CGO_ENABLED: '1'
CGO_CFLAGS: -O2 -g -fno-strict-aliasing
CGO_CXXFLAGS: -O2 -g -fno-strict-aliasing
GOTOOLCHAIN: local
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/perf-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ concurrency:
cancel-in-progress: false

env:
CGO_ENABLED: '1'
CGO_CFLAGS: -O2 -g -fno-strict-aliasing
CGO_CXXFLAGS: -O2 -g -fno-strict-aliasing
GOTOOLCHAIN: local
Expand Down
51 changes: 51 additions & 0 deletions bench/check-budgets/workflow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,54 @@ func TestPRSmokeWorkflowIsReportOnly(t *testing.T) {
t.Fatal("PR smoke must retain a read-only token")
}
}

func TestPerformanceTestBuildWorkflowsPinCGO(t *testing.T) {
for _, name := range []string{"perf-main.yml", "perf-gate.yml"} {
t.Run(name, func(t *testing.T) {
data, err := os.ReadFile("../../.github/workflows/" + name)
if err != nil {
t.Fatal(err)
}
var workflow struct {
Env map[string]string `yaml:"env"`
Jobs map[string]struct {
Env map[string]string `yaml:"env"`
Steps []struct {
Run string `yaml:"run"`
Env map[string]string `yaml:"env"`
} `yaml:"steps"`
} `yaml:"jobs"`
}
if err := yaml.Unmarshal(data, &workflow); err != nil {
t.Fatal(err)
}
builds := 0
for jobName, job := range workflow.Jobs {
for _, step := range job.Steps {
if !strings.Contains(step.Run, "prepare-tests") {
continue
}
builds++
env := make(map[string]string)
for _, scope := range []map[string]string{workflow.Env, job.Env, step.Env} {
for key, value := range scope {
env[key] = value
}
}
for key, want := range map[string]string{
"CGO_ENABLED": "1",
"CGO_CFLAGS": "-O2 -g -fno-strict-aliasing",
"CGO_CXXFLAGS": "-O2 -g -fno-strict-aliasing",
} {
if env[key] != want {
t.Errorf("%s prepare-tests environment %s = %q, want %q", jobName, key, env[key], want)
}
}
}
}
if builds == 0 {
t.Fatal("workflow has no test-executable preparation step")
}
})
}
}
374 changes: 374 additions & 0 deletions bench/load/README.md

Large diffs are not rendered by default.

41 changes: 35 additions & 6 deletions bench/load/call.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@ func checkToolResult(data json.RawMessage) error {
return errors.New("tool returned isError without error content")
}
var body struct {
Code string `json:"error_code"`
Message string `json:"message"`
Code string `json:"error_code"`
Message string `json:"message"`
Retriable bool `json:"retriable"`
Data map[string]any `json:"data"`
}
if err := json.Unmarshal(payload, &body); err != nil {
return err
Expand All @@ -64,7 +66,7 @@ func checkToolResult(data json.RawMessage) error {
if body.Code == "invalid_argument" {
code = -32602
}
return &rpcError{Code: code, Message: body.Code + ": " + body.Message}
return &rpcError{Code: code, Message: body.Code + ": " + body.Message, Data: body.Data, Retriable: body.Code == "repo_loading" && body.Retriable}
}

type toolCaller interface {
Expand All @@ -74,6 +76,14 @@ type toolCaller interface {
// Each logical call has its own product budget. The phase context may end
// sooner; that observation is right-censored, never a product deadline.
func callTool(ctx context.Context, client toolCaller, r request, args map[string]any, role string, agent, step, slot int, timeout time.Duration, sleep func(context.Context, time.Duration) error) (json.RawMessage, []Attempt, error) {
return callToolPolicy(ctx, client, r, args, role, agent, step, slot, timeout, sleep, false)
}

func callEditProbeTool(ctx context.Context, client toolCaller, r request, args map[string]any, role string, agent, step, slot int, timeout time.Duration, sleep func(context.Context, time.Duration) error) (json.RawMessage, []Attempt, error) {
return callToolPolicy(ctx, client, r, args, role, agent, step, slot, timeout, sleep, true)
}

func callToolPolicy(ctx context.Context, client toolCaller, r request, args map[string]any, role string, agent, step, slot int, timeout time.Duration, sleep func(context.Context, time.Duration) error, retryTyped bool) (json.RawMessage, []Attempt, error) {
logicalStart := time.Now()
productEnd := logicalStart.Add(timeout)
phaseEnd, phaseBounded := ctx.Deadline()
Expand All @@ -94,28 +104,47 @@ func callTool(ctx context.Context, client toolCaller, r request, args map[string
for retry := 0; ; retry++ {
start := time.Now()
data, err := client.call(callCtx, "tools/call", map[string]any{"name": r.Tool, "arguments": args})
returned := time.Now()
if retryTyped {
if clock, ok := client.(interface{ responseReturnedAt() time.Time }); ok {
if observed := clock.responseReturnedAt(); !observed.IsZero() && !observed.Before(start) {
returned = observed
}
}
}
if err == nil && callCtx.Err() != nil {
err = callCtx.Err()
}
if err == nil {
err = checkToolResult(data)
}
a := Attempt{Tool: r.name(), Role: role, Request: hash, Agent: agent, Step: step, Slot: slot, Retry: retry, Started: start, DurationMS: float64(time.Since(start)) / float64(time.Millisecond), LogicalMS: float64(time.Since(logicalStart)) / float64(time.Millisecond), Outcome: "success"}
a := Attempt{Tool: r.name(), Role: role, Request: hash, Agent: agent, Step: step, Slot: slot, Retry: retry, Started: start, DurationMS: float64(returned.Sub(start)) / float64(time.Millisecond), LogicalMS: float64(returned.Sub(logicalStart)) / float64(time.Millisecond), Outcome: "success"}
var remote *rpcError
if err != nil {
a.Outcome, a.Error = "error", err.Error()
if errors.As(err, &remote) {
a.Code = remote.Code
}
if remote != nil && remote.Code == -32002 {
if remote != nil && remote.Code == -32002 && (!retryTyped || remote.retryEditProbe()) {
a.Outcome = "busy"
} else if retryTyped && remote != nil && remote.retryEditProbe() {
a.Outcome = "retryable"
}
if _, expected := err.(*editProbeExpectedAbsence); expected {
a.Outcome = "expected_refusal"
a.Code = -32000
a.ExpectedOutcome = "symbol_absent"
}
if callCtx.Err() != nil {
a.Outcome = terminalOutcome()
err = errors.Join(err, callCtx.Err())
}
if retryTyped && errors.Is(err, errEditProbeEvidenceIncomplete) {
a.Outcome = "harness_incomplete"
}
}
attempts = append(attempts, a)
if a.Outcome != "busy" {
if a.Outcome != "busy" && a.Outcome != "retryable" {
return data, attempts, err
}
if err := sleep(callCtx, busyBackoff(retry)); err != nil {
Expand Down
68 changes: 65 additions & 3 deletions bench/load/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,27 @@ import (
const maxWireBytes = 64 << 20

type rpcError struct {
Code int `json:"code"`
Message string `json:"message"`
Code int `json:"code"`
Message string `json:"message"`
Data map[string]any `json:"data,omitempty"`
Retriable bool `json:"-"` // typed tool-result refusal, not a JSON-RPC top-level field
}

func (e *rpcError) Error() string { return fmt.Sprintf("RPC %d: %s", e.Code, e.Message) }

func (e *rpcError) retryEditProbe() bool {
if unknown, _ := e.Data["delivery_unknown"].(bool); unknown {
return false
}
// These are actual front-door shapes: dispatcher -32002 in
// mcp_request_lifetime.go, and repo_loading data in
// cmd/gortex/daemon_mcp_repo_loading.go. Unknowns stay terminal.
if e.Code == -32002 {
return true
}
return e.Retriable || e.Code == -32000 && e.Data["error_code"] == "repo_loading" && e.Data["retryable"] == true
}

type wireReply struct {
ID json.Number `json:"id"`
Result json.RawMessage `json:"result"`
Expand Down Expand Up @@ -51,6 +66,14 @@ type socketClient struct {
version string
}

// Per-call values returned to its caller, never a shared last-ID cache. Times
// retain monotonic readings until the scenario renders relative nanoseconds.
type wireCallIdentity struct {
ID int64
onWriteStart func(time.Time)
Started, WriteStarted, WriteFinished, ReplyDelivered, Finished time.Time
}

func readWireLine(reader *bufio.Reader) ([]byte, error) {
var data []byte
for {
Expand Down Expand Up @@ -190,6 +213,10 @@ func (c *socketClient) Close() error {
}

func (c *socketClient) send(ctx context.Context, value any, advisory bool) error {
return c.sendObserved(ctx, value, advisory, nil)
}

func (c *socketClient) sendObserved(ctx context.Context, value any, advisory bool, observation *wireCallIdentity) error {
data, err := json.Marshal(value)
if err != nil {
return err
Expand Down Expand Up @@ -227,7 +254,16 @@ func (c *socketClient) send(ctx context.Context, value any, advisory bool) error
_ = c.conn.Close()
close(interrupted)
})
if observation != nil {
observation.WriteStarted = time.Now()
if observation.onWriteStart != nil {
observation.onWriteStart(observation.WriteStarted)
}
}
_, err = io.Copy(c.conn, bytes.NewReader(append(data, '\n')))
if observation != nil {
observation.WriteFinished = time.Now()
}
if !stop() {
<-interrupted
}
Expand All @@ -242,6 +278,26 @@ func (c *socketClient) send(ctx context.Context, value any, advisory bool) error
}

func (c *socketClient) call(ctx context.Context, method string, params any) (json.RawMessage, error) {
return c.callObserved(ctx, method, params, nil)
}

func (c *socketClient) callWithIdentity(ctx context.Context, method string, params any) (json.RawMessage, wireCallIdentity, error) {
return c.callWithWriteObserver(ctx, method, params, nil)
}

func (c *socketClient) callWithWriteObserver(ctx context.Context, method string, params any, onWriteStart func(time.Time)) (json.RawMessage, wireCallIdentity, error) {
var observation wireCallIdentity
observation.onWriteStart = onWriteStart
data, err := c.callObserved(ctx, method, params, &observation)
observation.onWriteStart = nil
return data, observation, err
}

func (c *socketClient) callObserved(ctx context.Context, method string, params any, observation *wireCallIdentity) (json.RawMessage, error) {
if observation != nil {
observation.Started = time.Now()
defer func() { observation.Finished = time.Now() }()
}
if err := ctx.Err(); err != nil {
return nil, err
}
Expand All @@ -253,6 +309,9 @@ func (c *socketClient) call(ctx context.Context, method string, params any) (jso
}
c.next++
id := c.next
if observation != nil {
observation.ID = id
}
ch := make(chan wireReply, 1)
c.pending[id] = ch
c.mu.Unlock()
Expand All @@ -261,7 +320,7 @@ func (c *socketClient) call(ctx context.Context, method string, params any) (jso
delete(c.pending, id)
c.mu.Unlock()
}()
if err := c.send(ctx, map[string]any{"jsonrpc": "2.0", "id": id, "method": method, "params": params}, false); err != nil {
if err := c.sendObserved(ctx, map[string]any{"jsonrpc": "2.0", "id": id, "method": method, "params": params}, false, observation); err != nil {
return nil, err
}
select {
Expand All @@ -273,6 +332,9 @@ func (c *socketClient) call(ctx context.Context, method string, params any) (jso
cancel()
return nil, ctx.Err()
case reply := <-ch:
if observation != nil {
observation.ReplyDelivered = time.Now()
}
if ctx.Err() != nil {
return reply.Result, ctx.Err()
}
Expand Down
60 changes: 60 additions & 0 deletions bench/load/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -427,3 +427,63 @@ func TestInvalidationSubscriptionRecordsAvailabilityAndActualArguments(t *testin
})
}
}

func TestRecordedCallsKeepExactIdentityAcrossMultiplexedReplies(t *testing.T) {
ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second)
defer cancel()
socket := startStub(t, func(frame stubFrame) (any, *rpcError) {
return map[string]any{"wire_id": frame.ID, "ordinal": frame.Params["ordinal"]}, nil
})
client, err := openMCP(ctx, socket, "")
if err != nil {
t.Fatal(err)
}
defer client.Close()
type result struct {
ordinal int
data json.RawMessage
identity wireCallIdentity
err error
}
results := make(chan result, 32)
var calls sync.WaitGroup
for ordinal := range 32 {
calls.Go(func() {
data, id, err := client.callWithIdentity(ctx, "identity", map[string]any{"ordinal": ordinal})
results <- result{ordinal, data, id, err}
})
}
calls.Wait()
close(results)
seen := make(map[int64]bool)
for result := range results {
if result.err != nil {
t.Fatal(result.err)
}
var decoded struct {
WireID int64 `json:"wire_id"`
Ordinal int `json:"ordinal"`
}
if err := json.Unmarshal(result.data, &decoded); err != nil {
t.Fatal(err)
}
id := result.identity
if id.ID != decoded.WireID || decoded.Ordinal != result.ordinal || seen[id.ID] {
t.Fatalf("misattributed multiplexed reply%+v %+v", result, decoded)
}
seen[id.ID] = true
if id.Started.IsZero() || id.WriteStarted.Before(id.Started) || id.WriteFinished.Before(id.WriteStarted) || id.ReplyDelivered.Before(id.WriteFinished) || id.Finished.Before(id.ReplyDelivered) {
t.Fatalf("incomplete/reversed call readings%+v", id)
}
}
}

func TestRecordedCanceledCallDoesNotFabricateWireOrReply(t *testing.T) {
ctx, cancel := context.WithCancel(t.Context())
cancel()
client := &socketClient{}
data, id, err := client.callWithIdentity(ctx, "not-sent", nil)
if !errors.Is(err, context.Canceled) || data != nil || id.ID != 0 || !id.WriteStarted.IsZero() || !id.ReplyDelivered.IsZero() || id.Started.IsZero() || id.Finished.Before(id.Started) {
t.Fatalf("fabricated canceled call data=%s identity=%+v err=%v", data, id, err)
}
}
Loading
Loading