Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
293 commits
Select commit Hold shift + click to select a range
07cf31d
Merge remote-tracking branch 'origin/master' into cursor/prove-port-s…
cursoragent Sep 18, 2026
30ab3b0
Merge remote-tracking branch 'origin/master' into cursor/prove-move-s…
cursoragent Sep 18, 2026
e3da439
Merge remote-tracking branch 'origin/master' into cursor/prove-port-s…
cursoragent Sep 18, 2026
06a4529
test(mcp): prove tracedecay_rank behavior
cursoragent Sep 18, 2026
de96845
Merge remote-tracking branch 'origin/master' into cursor/prove-multi-…
cursoragent Sep 18, 2026
6b68aca
Merge remote-tracking branch 'origin/master' into cursor/prove-recurs…
cursoragent Sep 18, 2026
b18d05c
test(mcp): prove multi_str_replace over tools/call
cursoragent Sep 18, 2026
3644194
Merge origin/master into cursor/prove-rename-preview-0764
cursoragent Sep 18, 2026
8eddc7d
test(mcp): prove tracedecay_rename_symbol behavior
cursoragent Sep 18, 2026
edff8cb
test(mcp): prove tracedecay_largest behavior
cursoragent Sep 18, 2026
d72afb6
test(mcp): compare god class keys as a set
cursoragent Sep 18, 2026
bce81bd
style: rustfmt shared lock match arms
cursoragent Sep 18, 2026
4d31ae1
test(mcp): match health markdown field order
cursoragent Sep 18, 2026
c3ab2f2
test(mcp): prove tracedecay_retrieve behavior
cursoragent Sep 18, 2026
6f1d1de
test(mcp): read the published feedback diagnostics cycle
cursoragent Sep 18, 2026
41b2a13
test(mcp): call rename symbol over tools/call
cursoragent Sep 18, 2026
79064f8
test(mcp): prove tracedecay_replace_symbol behavior
cursoragent Sep 18, 2026
13af0f4
test(mcp): prove tracedecay_skill_list behavior
cursoragent Sep 18, 2026
047d350
test(mcp): prove tracedecay_similar behavior
cursoragent Sep 18, 2026
598ecf1
test(mcp): prove tracedecay_signature_search behavior
cursoragent Sep 18, 2026
9827f2c
test(mcp): prove tracedecay_signature behavior
cursoragent Sep 18, 2026
f241ad3
test(mcp): prove tracedecay_source_edit_reconcile behavior
cursoragent Sep 18, 2026
8383822
Merge remote-tracking branch 'origin/master' into cursor/prove-sessio…
cursoragent Sep 18, 2026
fdf95d5
test(mcp): prove tracedecay_status behavior
cursoragent Sep 18, 2026
b001f32
test(mcp): prove tracedecay_storage_status behavior
cursoragent Sep 18, 2026
1fc02ac
test(mcp): call skill list through production MCP
cursoragent Sep 18, 2026
73c562d
test(mcp): prove sessions_for over tools/call
cursoragent Sep 18, 2026
0130e33
style: format shared lock match expressions
cursoragent Sep 18, 2026
17356cb
test(mcp): pin insert_at replay and refusal receipts
cursoragent Sep 18, 2026
b22117c
test(mcp): match interface method signatures
cursoragent Sep 18, 2026
50b50e4
test(mcp): compile tracedecay_move_symbol proof
cursoragent Sep 18, 2026
6715d73
test(mcp): prove tracedecay_unmounted_files behavior
cursoragent Sep 18, 2026
4882a2f
test(mcp): lock multi_str_replace replay wire
cursoragent Sep 18, 2026
53f14b5
Merge remote-tracking branch 'origin/master' into cursor/prove-stack-…
cursoragent Sep 18, 2026
c62efe0
test(mcp): prove tracedecay_type_hierarchy behavior
cursoragent Sep 18, 2026
4cd1463
test(mcp): lock observed hotspots payloads
cursoragent Sep 18, 2026
e5f4412
test(mcp): pin tracedecay_lcm_describe documents
cursoragent Sep 18, 2026
383ca3f
test(mcp): call str_replace over tools/call
cursoragent Sep 18, 2026
9776017
test(mcp): compare rename sites as JSON arrays
cursoragent Sep 18, 2026
6061ca1
test(mcp): pin memory status route and decode errors
cursoragent Sep 18, 2026
9a844f4
test(mcp): drive stack snapshot through production MCP
cursoragent Sep 18, 2026
50a4c64
test(mcp): prove tracedecay_unsafe_patterns behavior
cursoragent Sep 18, 2026
e8366d2
style: format shared-lock matches for rustfmt 1.97
cursoragent Sep 18, 2026
94fd9c2
test(mcp): mount both roots before scope-set CAS proof
cursoragent Sep 18, 2026
3f533ac
test(mcp): compile the recursion cycle report proof
cursoragent Sep 18, 2026
e3f37ff
test(mcp): pin expand-query hit and miss receipts
cursoragent Sep 18, 2026
cd98df4
Merge remote-tracking branch 'origin/master' into cursor/prove-work-g…
cursoragent Sep 18, 2026
c5552c8
test(mcp): pin retrieve pages to host wire text
cursoragent Sep 18, 2026
387a615
test(mcp): lock observed rename tools/call results
cursoragent Sep 18, 2026
a8018c9
test(mcp): prove tracedecay_work_mutate_graph behavior
cursoragent Sep 18, 2026
5720987
test(mcp): rank implements edges from impl nodes
cursoragent Sep 18, 2026
caea5cc
test(mcp): assert generate_proposal on the tools/call wire
cursoragent Sep 18, 2026
ccbefab
test(mcp): lock port status proof to indexed symbols
cursoragent Sep 18, 2026
323c35a
test(mcp): prove tracedecay_test_risk behavior
cursoragent Sep 18, 2026
db8ee4b
test(mcp): pin skill list markdown indent
cursoragent Sep 18, 2026
18706a1
fix(mcp): borrow signature JSON text
cursoragent Sep 18, 2026
2a15864
test(mcp): compile session refresh cancel proof
cursoragent Sep 18, 2026
cf1c7b5
test(mcp): prove tracedecay_read behavior
cursoragent Sep 18, 2026
30658c2
test(mcp): lock caller-visible tracedecay_read results
cursoragent Sep 18, 2026
3197a38
fix(mcp): use catalog ids for stack snapshot proof
cursoragent Sep 18, 2026
44e5347
test(mcp): build cancel options through public registry
cursoragent Sep 18, 2026
30f1b7a
test(mcp): align lcm expand proof with served text
cursoragent Sep 18, 2026
387a314
test(mcp): pin recursion cycles returned by tools/call
cursoragent Sep 18, 2026
58b8de3
style: format shared lock match chains
cursoragent Sep 18, 2026
1927ad1
test(mcp): match type hierarchy refusals to the wire
cursoragent Sep 18, 2026
f2abd50
test(mcp): assert similar denial wire message
cursoragent Sep 18, 2026
da4b17e
test(mcp): pin sessions_for schema rejection wire
cursoragent Sep 18, 2026
4faeffb
test(mcp): match retained str_replace answers
cursoragent Sep 18, 2026
514a629
test(mcp): compile signature search proof
cursoragent Sep 18, 2026
e92671a
test(mcp): match source-edit reconcile receipts
cursoragent Sep 18, 2026
09d73ff
test(mcp): lock the status readings a host call returns
cursoragent Sep 18, 2026
8920358
test(mcp): compare mutate-graph command ids
cursoragent Sep 18, 2026
93e0d74
test(mcp): pin activate lifecycle refusals
cursoragent Sep 18, 2026
da76e97
test(mcp): read generate_proposal after the graph stamp
cursoragent Sep 18, 2026
0ffff41
Merge remote-tracking branch 'origin/master' into cursor/prove-work-g…
cursoragent Sep 18, 2026
f15f323
test(mcp): prove tracedecay_work_resume_attempts behavior
cursoragent Sep 18, 2026
eec4635
test(mcp): prove resume after the live daemon is killed
cursoragent Sep 18, 2026
d4c4095
ci: rerun checks after cancellation
cursoragent Sep 18, 2026
3d07281
ci: rerun session refresh cancel checks
cursoragent Sep 18, 2026
4fbaedf
ci: rerun checks after queued cancellation
cursoragent Sep 18, 2026
19b0457
test(mcp): rerun activate definition checks
cursoragent Sep 18, 2026
9dcc417
ci: rerun checks after owner cancellation
cursoragent Sep 18, 2026
1ba485e
ci: rerun checks cancelled in the queue
cursoragent Sep 18, 2026
d5d5c82
Merge origin/master into cursor/prove-insert-at-behavior-6322
cursoragent Sep 18, 2026
3608a5e
Merge remote-tracking branch 'origin/master' into cursor/prove-move-s…
cursoragent Sep 18, 2026
18a73c5
test(mcp): prove tracedecay_health_read behavior
cursoragent Sep 18, 2026
c5608f7
test(mcp): run health_read proof multithreaded
cursoragent Sep 18, 2026
c29bf4e
test(mcp): assert sealed health_read refusal
cursoragent Sep 18, 2026
af9b5dc
ci: rerun tracedecay_read checks
cursoragent Sep 18, 2026
c3fb0f2
test(mcp): write skill list markdown as one literal
cursoragent Sep 18, 2026
cbd6794
style: format shared lock match chains
cursoragent Sep 18, 2026
2e99c16
style: rustfmt shared lock match chains
cursoragent Sep 18, 2026
99c04f5
test(mcp): prove tracedecay_multi_root_scope_set_read behavior
cursoragent Sep 18, 2026
d18e656
style: collapse shared lock match chains for rustfmt
cursoragent Sep 18, 2026
f9da16c
style: keep lock chains on one line for rustfmt 1.97
cursoragent Sep 18, 2026
b757257
ci: rerun checks after cancelled queue
cursoragent Sep 18, 2026
80cc6a1
test(mcp): rerun unsafe patterns CI
cursoragent Sep 18, 2026
6c0c7b1
test(mcp): rerun cancelled rank proof checks
cursoragent Sep 18, 2026
a61db74
ci: rerun checks after a queued cancel
cursoragent Sep 18, 2026
d5c8130
ci: retrigger checks cancelled in queue
cursoragent Sep 18, 2026
608fbff
test(mcp): prove tracedecay_gini behavior
cursoragent Sep 18, 2026
7477c6b
ci: rerun cancelled recursion proof checks
cursoragent Sep 18, 2026
825a24b
style: format shared lock matches
cursoragent Sep 18, 2026
55fbb5d
ci: rerun tracedecay_lcm_describe checks
cursoragent Sep 18, 2026
adac55a
style: format shared lock match chains
cursoragent Sep 18, 2026
6337974
style: format shared lock acquisition chains
cursoragent Sep 18, 2026
cf28e24
ci: retrigger cancelled checks
cursoragent Sep 18, 2026
3234095
test(mcp): prove tracedecay_session_refresh_status behavior
cursoragent Sep 18, 2026
30a65f9
test(mcp): match session refresh status host answers
cursoragent Sep 18, 2026
d5e0921
ci: request a fresh check run
cursoragent Sep 18, 2026
ff9daac
test(mcp): name the str_replace refusal codes
cursoragent Sep 18, 2026
218f688
test(mcp): document tracedecay_read symbol order
cursoragent Sep 18, 2026
a1d6b36
test(mcp): drop unread advisory-cycle payload
cursoragent Sep 18, 2026
f94d731
test(mcp): request tracedecay_rank CI run
cursoragent Sep 18, 2026
bc9a3f4
Merge remote-tracking branch 'origin/master' into cursor/prove-sessio…
cursoragent Sep 18, 2026
6188c25
test(mcp): note rename diff has no trailing newline
cursoragent Sep 18, 2026
528c3f5
test(mcp): prove tracedecay_impls behavior
cursoragent Sep 18, 2026
904b1df
style: rustfmt shared-lock match chains
cursoragent Sep 18, 2026
0708b25
test(mcp): resolve cross-file Show in impls proof
cursoragent Sep 18, 2026
61cb6f0
ci: rerun checks cancelled in the queue
cursoragent Sep 18, 2026
b122b1b
test(mcp): note impls limit does not pin order
cursoragent Sep 18, 2026
26b8590
ci: rerun expand-query proof checks
cursoragent Sep 18, 2026
7bfbaef
ci: rerun cancelled scope-set CAS proof
cursoragent Sep 18, 2026
b0cebc4
test(mcp): record expand-query omission counts
cursoragent Sep 18, 2026
219ec5d
test(mcp): document unmounted scope-set refusal
cursoragent Sep 18, 2026
a74ef2a
test(mcp): prove tracedecay_session_refresh_begin behavior
cursoragent Sep 18, 2026
bcddf70
test(mcp): pin refresh begin selector error path
cursoragent Sep 18, 2026
243e2e3
test(mcp): prove tracedecay_workflows behavior
cursoragent Sep 18, 2026
73714d3
test(mcp): match workflows phase_json key order
cursoragent Sep 18, 2026
73b3ce8
test(mcp): restore observed workflows phase_json
cursoragent Sep 18, 2026
a3b3b48
ci: rerun workflows proof checks
cursoragent Sep 18, 2026
53a0f18
style: format shared lock match chains
cursoragent Sep 18, 2026
de3b561
test(mcp): prove tracedecay_search behavior
cursoragent Sep 18, 2026
58d242a
test(mcp): pin search exact-message classification
cursoragent Sep 18, 2026
e299942
ci: rerun checks after cancellation
cursoragent Sep 18, 2026
1959047
style: format shared lock match arms
cursoragent Sep 18, 2026
446f7be
style: format shared lock match arms
cursoragent Sep 18, 2026
1945b34
test(mcp): prove tracedecay_lcm_doctor behavior
cursoragent Sep 18, 2026
ac9db35
test(mcp): lock the doctor report tools/call returns
cursoragent Sep 18, 2026
573df53
style: format lock chains for the pinned rustfmt
cursoragent Sep 18, 2026
d43b223
test(mcp): prove tracedecay_todos behavior
cursoragent Sep 18, 2026
0e43965
test(mcp): expect identifier NOTE from tracedecay_todos
cursoragent Sep 18, 2026
e6dd5ad
test(mcp): pin FIXME-only scan of mixed markers
cursoragent Sep 18, 2026
4666ab1
ci(mcp): rerun tracedecay_todos checks
cursoragent Sep 18, 2026
f5a4cf3
test(mcp): document tracedecay_todos tools/call proof
cursoragent Sep 18, 2026
d252473
style: format shared-lock match expressions
cursoragent Sep 18, 2026
b8a67e8
Merge branch 'master' into cursor/prove-by-qualified-name-bc05
cursoragent Sep 18, 2026
e0e5e0b
merge(master): integrate latest base into branch-diff proof
cursoragent Sep 18, 2026
51a1c41
Merge remote-tracking branch 'origin/master' into cursor/constructors…
cursoragent Sep 18, 2026
0ecf827
Merge remote-tracking branch 'origin/master' into cursor/prove-automa…
cursoragent Sep 18, 2026
f58b15d
Merge origin/master into cursor/prove-fact-store-remove-8439
cursoragent Sep 18, 2026
76ba87a
test(mcp): prove remove-by-id without a token
cursoragent Sep 18, 2026
03f02d7
test(mcp): pin the empty search after remove
cursoragent Sep 18, 2026
54b8ce8
test(mcp): pin identical remove as a replay
cursoragent Sep 18, 2026
5457008
merge(master): pick up rustfmt fixes behind this branch
cursoragent Sep 18, 2026
f218f2a
Merge remote-tracking branch 'origin/master' into cursor/prove-branch…
cursoragent Sep 18, 2026
99827c5
Merge remote-tracking branch 'origin/master' into cursor/constructors…
cursoragent Sep 18, 2026
5fb89d3
fix(ci): satisfy rustfmt and doc continuation lint
cursoragent Sep 18, 2026
a592fd5
Merge branch 'master' into cursor/prove-tracedecay-circular-f0bb
cursoragent Sep 18, 2026
00cc23b
fix(ci): satisfy rustfmt and the privacy doc lint
cursoragent Sep 18, 2026
02af2d9
merge(master): update hotspots proof onto current base
cursoragent Sep 18, 2026
c46779a
Merge branch 'master' into cursor/prove-by-qualified-name-bc05
cursoragent Sep 18, 2026
9a18bb6
style: collapse shared lock match chains
cursoragent Sep 18, 2026
3a09526
fix(privacy): repair the RE2 dialect doc list
cursoragent Sep 18, 2026
ad9ce4c
Merge remote-tracking branch 'origin/master' into cursor/prove-str-re…
ScriptedAlchemy Sep 18, 2026
4bbd9f7
Merge remote-tracking branch 'origin/master' into cursor/prove-unmoun…
ScriptedAlchemy Sep 18, 2026
fbc3fe1
Merge remote-tracking branch 'origin/master' into cursor/prove-test-r…
ScriptedAlchemy Sep 18, 2026
1a9c50c
Merge remote-tracking branch 'origin/master' into cursor/prove-traced…
ScriptedAlchemy Sep 18, 2026
8e138ba
Merge remote-tracking branch 'origin/master' into cursor/prove-type-h…
ScriptedAlchemy Sep 18, 2026
6a56709
Merge branch 'master' into cursor/prove-test-risk-behavior-5ce8
ScriptedAlchemy Sep 18, 2026
291759f
merge: PR #1601 test(mcp): prove tracedecay_circular behavior
ScriptedAlchemy Sep 18, 2026
98eb15a
merge: PR #1606 test(mcp): prove tracedecay_by_qualified_name behavior
ScriptedAlchemy Sep 18, 2026
a8d5d94
merge: PR #1610 test(mcp): prove tracedecay_automation_run_list behavior
ScriptedAlchemy Sep 18, 2026
afac989
merge: PR #1611 test(mcp): prove tracedecay_hotspots behavior
ScriptedAlchemy Sep 18, 2026
ca4bff0
merge: PR #1618 test(mcp): prove tracedecay_replace_symbol behavior
ScriptedAlchemy Sep 18, 2026
fa76bed
merge: PR #1621 test(mcp): prove tracedecay_session_refresh_begin beh…
ScriptedAlchemy Sep 18, 2026
692da9d
merge: PR #1623 test(mcp): prove tracedecay_multi_root_scope_set_read…
ScriptedAlchemy Sep 18, 2026
320c57e
merge: PR #1624 test(mcp): prove tracedecay_gini behavior
ScriptedAlchemy Sep 18, 2026
e451c2c
merge: PR #1628 test(mcp): prove tracedecay_impls behavior
ScriptedAlchemy Sep 18, 2026
b7feba3
merge: PR #1631 test(mcp): prove tracedecay_branch_diff behavior
ScriptedAlchemy Sep 18, 2026
199758a
merge: PR #1637 test(mcp): prove tracedecay_impact behavior
ScriptedAlchemy Sep 18, 2026
2ffc4f6
merge: PR #1639 test(mcp): prove tracedecay_lcm_expand_query behavior
ScriptedAlchemy Sep 18, 2026
166fe3a
merge: PR #1640 test(mcp): prove tracedecay_largest behavior
ScriptedAlchemy Sep 18, 2026
12d4920
merge: PR #1641 test(mcp): prove tracedecay_health behavior
ScriptedAlchemy Sep 18, 2026
b33e5a1
merge: PR #1648 test(mcp): prove tracedecay_source_edit_reconcile beh…
ScriptedAlchemy Sep 18, 2026
2336c6f
merge: PR #1649 test(mcp): prove tracedecay_work_release_placement be…
ScriptedAlchemy Sep 18, 2026
39680c8
merge: PR #1651 test(mcp): prove tracedecay_todos behavior
ScriptedAlchemy Sep 18, 2026
106f3e3
merge: PR #1653 test(mcp): prove tracedecay_retrieve behavior
ScriptedAlchemy Sep 18, 2026
410ea9e
merge: PR #1654 test(mcp): prove tracedecay_lcm_doctor behavior
ScriptedAlchemy Sep 18, 2026
baa6e81
merge: PR #1659 test(mcp): prove tracedecay_fact_store_supersede beha…
ScriptedAlchemy Sep 18, 2026
d2e9408
merge: PR #1660 test(mcp): prove tracedecay_memory_status behavior
ScriptedAlchemy Sep 18, 2026
6f368d1
merge: PR #1661 test(mcp): prove tracedecay_type_hierarchy behavior
ScriptedAlchemy Sep 18, 2026
829850a
merge: PR #1664 test(mcp): prove tracedecay_search behavior
ScriptedAlchemy Sep 18, 2026
a51cd05
merge: PR #1666 test(mcp): prove tracedecay_multi_root_scope_set_comp…
ScriptedAlchemy Sep 18, 2026
89c319f
merge: PR #1668 test(mcp): prove tracedecay_move_symbol behavior
ScriptedAlchemy Sep 18, 2026
b680785
merge: PR #1672 test(mcp): prove tracedecay_test_risk behavior
ScriptedAlchemy Sep 18, 2026
340e1ac
merge: PR #1675 test(mcp): prove tracedecay_workflow_register_definit…
ScriptedAlchemy Sep 18, 2026
a0cfecf
merge: PR #1676 test(mcp): prove tracedecay_session_refresh_status be…
ScriptedAlchemy Sep 18, 2026
67f4363
merge: PR #1677 test(mcp): prove tracedecay_status behavior
ScriptedAlchemy Sep 18, 2026
3062799
merge: PR #1679 test(mcp): prove tracedecay_rename_symbol behavior
ScriptedAlchemy Sep 18, 2026
0762a8f
merge: PR #1680 test(mcp): prove tracedecay_work_mutate_graph behavior
ScriptedAlchemy Sep 18, 2026
e396753
merge: PR #1682 test(mcp): prove tracedecay_similar behavior
ScriptedAlchemy Sep 18, 2026
b4c1657
merge: PR #1685 test(mcp): prove tracedecay_unmounted_files behavior
ScriptedAlchemy Sep 18, 2026
6d59e9f
merge: PR #1688 test(mcp): prove tracedecay_feedback_expand behavior
ScriptedAlchemy Sep 18, 2026
63db58f
merge: PR #1689 test(mcp): prove tracedecay_signature_search behavior
ScriptedAlchemy Sep 18, 2026
c603162
merge: PR #1690 test(mcp): prove tracedecay_implementations behavior
ScriptedAlchemy Sep 18, 2026
eb8e084
merge: PR #1691 test(mcp): prove tracedecay_storage_status behavior
ScriptedAlchemy Sep 18, 2026
ccd0430
merge: PR #1692 test(mcp): prove tracedecay_sessions_for behavior
ScriptedAlchemy Sep 18, 2026
39bb366
merge: PR #1694 test(mcp): prove tracedecay_feedback_diagnostics beha…
ScriptedAlchemy Sep 18, 2026
0ca729c
merge: PR #1701 test(mcp): prove tracedecay_str_replace behavior
ScriptedAlchemy Sep 18, 2026
e41ea2a
merge: PR #1702 test(mcp): prove tracedecay_workflows behavior
ScriptedAlchemy Sep 18, 2026
39b74e1
merge: PR #1705 test(mcp): prove tracedecay_work_generate_proposal be…
ScriptedAlchemy Sep 18, 2026
f6b4197
merge: PR #1710 test(mcp): prove tracedecay_recursion behavior
ScriptedAlchemy Sep 18, 2026
c90afc3
merge: PR #1711 test(mcp): prove tracedecay_rank behavior
ScriptedAlchemy Sep 18, 2026
00a7c0a
merge: PR #1715 test(mcp): prove tracedecay_god_class behavior
ScriptedAlchemy Sep 18, 2026
af29d3b
merge: PR #1716 test(mcp): prove tracedecay_health_read behavior
ScriptedAlchemy Sep 18, 2026
1c3f86c
merge: PR #1721 test(mcp): prove tracedecay_signature behavior
ScriptedAlchemy Sep 18, 2026
9f7a5b2
merge: PR #1732 test(mcp): prove tracedecay_unsafe_patterns behavior
ScriptedAlchemy Sep 18, 2026
265fa86
merge: PR #1737 test(mcp): prove tracedecay_read behavior
ScriptedAlchemy Sep 18, 2026
0fe3171
merge: PR #1739 test(mcp): prove tracedecay_session_refresh_cancel be…
ScriptedAlchemy Sep 18, 2026
360ce0d
merge: PR #1742 test(mcp): prove tracedecay_work_resume_attempts beha…
ScriptedAlchemy Sep 18, 2026
a3013b3
merge: PR #1743 test(mcp): prove tracedecay_stack_snapshot behavior
ScriptedAlchemy Sep 18, 2026
0ccce5e
merge: PR #1756 test(mcp): prove tracedecay_fact_store_remove behavior
ScriptedAlchemy Sep 18, 2026
89b6b6e
merge: PR #1609 test(mcp): prove tracedecay_constructors behavior
ScriptedAlchemy Sep 18, 2026
5254ee1
merge: PR #1656 test(mcp): prove tracedecay_lcm_expand behavior
ScriptedAlchemy Sep 18, 2026
31bdf69
merge: PR #1670 test(mcp): prove tracedecay_insert_at behavior
ScriptedAlchemy Sep 18, 2026
4b4e346
merge: PR #1681 test(mcp): prove tracedecay_port_status behavior
ScriptedAlchemy Sep 18, 2026
059aa2e
merge: PR #1687 test(mcp): prove tracedecay_feedback_get behavior
ScriptedAlchemy Sep 18, 2026
6610143
merge: PR #1696 test(mcp): prove tracedecay_skill_view behavior
ScriptedAlchemy Sep 18, 2026
f50ed5e
merge: PR #1698 test(mcp): prove tracedecay_skill_list behavior
ScriptedAlchemy Sep 18, 2026
fe45cd3
merge: PR #1722 test(mcp): prove tracedecay_lcm_describe behavior
ScriptedAlchemy Sep 18, 2026
27a63bd
merge: PR #1723 test(mcp): prove tracedecay_multi_str_replace behavior
ScriptedAlchemy Sep 18, 2026
41bef1a
merge: PR #1729 test(mcp): prove tracedecay_workflow_activate_definit…
ScriptedAlchemy Sep 18, 2026
d653886
merge: PR #1733 test(mcp): prove tracedecay_rename_preview behavior
ScriptedAlchemy Sep 18, 2026
ad5d33d
test(mcp): use Duration::from_mins for the CAS call timeout
ScriptedAlchemy Sep 18, 2026
914e5c6
Revert "fix(daemon): mount the published branch worktree's query auth…
ScriptedAlchemy Sep 18, 2026
c1733ef
Merge remote-tracking branch 'origin/master' into ci/pr-batch-a
ScriptedAlchemy Sep 19, 2026
75884d3
Merge remote-tracking branch 'origin/master' into ci/pr-batch-a
ScriptedAlchemy Sep 19, 2026
390f3db
test(mcp): expect the panic's own fn on a shared line
ScriptedAlchemy Sep 19, 2026
023e54b
Merge remote-tracking branch 'origin/master' into ci/pr-batch-a
ScriptedAlchemy Sep 19, 2026
979436b
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
f359cd9
fix(daemon): retry a revoked response in the one-shot client
ScriptedAlchemy Sep 19, 2026
e7b4da9
test(store-runtime): unblock independent shard retirement worker
ScriptedAlchemy Sep 19, 2026
f7d13ac
test(runtime): settle clone backfill before sampling clone freshness
ScriptedAlchemy Sep 19, 2026
f273de2
chore: merge fix/batch-a-shard-retirement (flake fix)
ScriptedAlchemy Sep 19, 2026
b4d80a6
fix(observability): sweep staging temps a killed publisher leaves
ScriptedAlchemy Sep 19, 2026
d73b0bf
chore: merge fix/batch-a-freshness-stale (flake fix)
ScriptedAlchemy Sep 19, 2026
a00a38e
chore: merge fix/batch-a-fanout-mount (spool residue after crash)
ScriptedAlchemy Sep 19, 2026
abd51bf
chore: merge origin/master (58f8f83095, #1847)
ScriptedAlchemy Sep 19, 2026
3ed5c0a
test(code-index): gauge readiness decode waits per call
ScriptedAlchemy Sep 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions crates/tracedecay-application/src/observability/delivery_spool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ use tracedecay_domain::{
DeliverySettlementV1, canonical_json_bytes, canonical_sha256, sha256_hex_suffix,
};
use tracedecay_private_fs::framed_log::{
DirectorySyncPolicy, atomic_write, read_bounded, sync_directory, validate_regular_or_missing,
DirectorySyncPolicy, atomic_write, is_owned_temporary_name, read_bounded,
remove_abandoned_temporaries, sync_directory, validate_regular_or_missing,
};

use super::ObservabilityProducerIdentityV1;
Expand Down Expand Up @@ -148,6 +149,11 @@ impl DeliveryRecorderSpoolV1 {
std::fs::TryLockError::WouldBlock => DeliveryRecorderSpoolError::Busy,
std::fs::TryLockError::Error(_) => DeliveryRecorderSpoolError::Io,
})?;
// The lease is exclusive now, so every staging temporary still in the
// root was abandoned by a killed publisher. Sweeping it here is what
// makes a crashed daemon's project reopenable.
remove_abandoned_temporaries(&root, DIRECTORY_POLICY)
.map_err(|_| DeliveryRecorderSpoolError::Io)?;
let receipt_paths = scan_receipt_paths(&root)?;
let spool = Self {
root,
Expand Down Expand Up @@ -265,7 +271,7 @@ fn scan_receipt_paths(root: &Path) -> Result<Vec<PathBuf>, DeliveryRecorderSpool
.file_name()
.into_string()
.map_err(|_| DeliveryRecorderSpoolError::UnsafePath)?;
if name == LOCK_FILE {
if name == LOCK_FILE || is_owned_temporary_name(&name) {
continue;
}
if !valid_receipt_name(&name)
Expand Down Expand Up @@ -425,4 +431,28 @@ mod tests {
Err(DeliveryRecorderSpoolError::InvalidReceipt)
);
}

/// A publisher killed between staging and rename leaves its `.tmp` behind.
/// The next open owns that residue: it must sweep it and mount, not refuse
/// the project's observability spool as an unsafe path forever.
#[test]
fn open_sweeps_a_staging_temporary_left_by_a_killed_publisher() {
let root = tempfile::tempdir().expect("spool root");
let spool = DeliveryRecorderSpoolV1::open(root.path().to_path_buf()).expect("first open");
let receipt =
DeliveryRecorderSourceReceiptV1::new(settlement(), identity()).expect("receipt");
assert!(spool.append(&receipt).expect("append receipt"));
drop(spool);

// Exactly what `framed_log::temporary_path` stages beside a receipt.
let abandoned = root
.path()
.join(".00000000000000000000000000000000.delivery.v1.json.delivery.4242.7.tmp");
std::fs::write(&abandoned, b"partial").expect("abandoned staging temporary");

let reopened =
DeliveryRecorderSpoolV1::open(root.path().to_path_buf()).expect("reopen after crash");
assert!(!abandoned.exists(), "the staging temporary must be swept");
assert_eq!(reopened.pending(8).expect("pending receipts").len(), 1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4093,6 +4093,17 @@ async fn dashboard_freshness_reports_pending_rebuild_liveness() {
.expect("mount daemon-owned scheduler");
wait_for_initial_generation(&registry, fixture.path()).await;
wait_for_dashboard_ready(&registry, fixture.path()).await;
// The mount seats exact/lexical before the clone successor is built, so
// `wait_for_dashboard_ready` returns with that backfill still pending, and
// the admission below only parks a *new* pass at its dequeue point. A
// backfill slice advances under the clone-successor slot lock, which
// `clone_index_status` takes with `try_lock`: a sample that lands inside
// one reports `Unavailable { "clone-index status is being updated" }`
// before the source-stale branch can answer `Stale` (CI run 35432037843).
// Drain the mount-era backfill and burn the wake permits it banks, so the
// held admission is the only scheduling this sample can observe.
drain_clone_backfill(&registry, fixture.path()).await;
settled_owner_with_idle_admission(&registry, fixture.path()).await;

let admission = registry
.background_reconcile_admission()
Expand All @@ -4118,10 +4129,14 @@ async fn dashboard_freshness_reports_pending_rebuild_liveness() {
projected.rebuild_in_flight,
"a pending scheduler wake must keep stale serving typed as rebuilding"
);
assert!(matches!(
projected.clone_index,
Some(tracedecay_contracts::code_index_freshness::CodeCloneIndexStatusV1::Stale { .. })
));
assert!(
matches!(
projected.clone_index,
Some(tracedecay_contracts::code_index_freshness::CodeCloneIndexStatusV1::Stale { .. })
),
"a settled clone index under a stale source must read Stale: {:?}",
projected.clone_index
);
drop(admission);
registry.shutdown().await;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4148,6 +4148,30 @@ async fn root_graph_ready_does_not_depend_on_the_publication_decode_cache() {
.unwrap_or_else(std::sync::PoisonError::into_inner)
.hold_active_decode();

// `waiter_count` counts every task parked on this store's active decode,
// not this call's. The owner's settle pass decodes the active generation
// inside graph prepare and drops its reconcile-pass guard before it gets
// there, so no admission or quiescence helper can fence it out of the
// hold, and against a bare `== 0` its park reads as a readiness park.
//
// Park the owner first and take its count as the floor instead. A park
// cannot end while the hold is up and the owner is blocked in the step it
// parked in, so every later rise is a readiness call joining the flight.
registry.request_complete_generation(fixture.path()).await;
let deadline = Instant::now() + Duration::from_secs(30);
let parked_owner = loop {
let parked = held_decode.waiter_count();
if parked > 0 {
break parked;
}
assert!(
Instant::now() <= deadline,
"the owner's settle pass never reached the held decode, so its park \
cannot be sequenced ahead of the readiness calls"
);
tokio::time::sleep(Duration::from_millis(2)).await;
};

let ready = tokio::time::timeout(
Duration::from_secs(30),
registry.latest_complete_ready_decoded_for_root_scope(fixture.path(), &scope),
Expand All @@ -4162,7 +4186,7 @@ async fn root_graph_ready_does_not_depend_on_the_publication_decode_cache() {
);
assert_eq!(
held_decode.waiter_count(),
0,
parked_owner,
"root graph readiness must not join the publication decode flight"
);

Expand All @@ -4180,7 +4204,7 @@ async fn root_graph_ready_does_not_depend_on_the_publication_decode_cache() {
);
assert_eq!(
held_decode.waiter_count(),
0,
parked_owner,
"scope query readiness must not join the publication decode flight"
);

Expand Down
9 changes: 7 additions & 2 deletions crates/tracedecay-hooks/src/delivery_spool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ use tracedecay_domain::{
canonical_json_bytes, canonical_sha256, sha256_hex_suffix,
};
use tracedecay_private_fs::framed_log::{
DirectorySyncPolicy, atomic_write, read_bounded, sync_directory, validate_regular_or_missing,
DirectorySyncPolicy, atomic_write, is_owned_temporary_name, read_bounded,
remove_abandoned_temporaries, sync_directory, validate_regular_or_missing,
};

const MAX_PENDING_RECEIPTS: usize = 1_024;
Expand Down Expand Up @@ -187,6 +188,10 @@ impl HookDeliveryReceiptSpoolV1 {
}
}
let spool = Self { root, _lock: lock };
// The lock is held now, so every staging temporary still in the root
// was abandoned by a killed publisher rather than owned by a live one.
remove_abandoned_temporaries(&spool.root, DIRECTORY_POLICY)
.map_err(|_| HookDeliverySpoolError::Io)?;
spool.receipt_paths()?;
Ok(spool)
}
Expand Down Expand Up @@ -306,7 +311,7 @@ impl HookDeliveryReceiptSpoolV1 {
.file_name()
.into_string()
.map_err(|_| HookDeliverySpoolError::UnsafePath)?;
if name == LOCK_FILE {
if name == LOCK_FILE || is_owned_temporary_name(&name) {
continue;
}
if !valid_receipt_name(&name)
Expand Down
46 changes: 45 additions & 1 deletion crates/tracedecay-private-fs/src/framed_log.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,12 +214,14 @@ pub fn read_bounded(path: &Path, maximum: usize) -> io::Result<Option<Vec<u8>>>
Ok(Some(bytes))
}

const TEMPORARY_SUFFIX: &str = ".tmp";

fn temporary_path(path: &Path, kind: &str) -> PathBuf {
static NONCE: AtomicU64 = AtomicU64::new(1);
let nonce = NONCE.fetch_add(1, Ordering::Relaxed);
let parent = path.parent().unwrap_or_else(|| Path::new("."));
parent.join(format!(
".{}.{}.{}.{}.tmp",
".{}.{}.{}.{}{TEMPORARY_SUFFIX}",
path.file_name()
.and_then(|name| name.to_str())
.unwrap_or("spool"),
Expand All @@ -229,6 +231,48 @@ fn temporary_path(path: &Path, kind: &str) -> PathBuf {
))
}

/// Is this directory entry one of this module's staging temporaries?
///
/// [`with_owned_temp_publish`] stages into `.<destination>.<kind>.<pid>.<nonce>.tmp`
/// beside the destination and publishes by rename, so a publisher killed
/// between the two leaves that name behind. A reader enumerating a private
/// directory must recognize the residue as its own rather than refusing the
/// whole directory as foreign.
#[must_use]
pub fn is_owned_temporary_name(name: &str) -> bool {
name.starts_with('.') && name.ends_with(TEMPORARY_SUFFIX)
}

/// Delete staging temporaries abandoned by a killed publisher.
///
/// Only the exclusive owner of `dir` may call this: a live publisher in any
/// process still owns its staging file. A non-regular entry under a staging
/// name is foreign and is left in place for the caller's own path validation
/// to reject.
pub fn remove_abandoned_temporaries(dir: &Path, policy: DirectorySyncPolicy) -> io::Result<()> {
let mut removed = false;
for entry in fs::read_dir(dir)? {
let entry = entry?;
let name = entry.file_name();
let Some(name) = name.to_str() else {
continue;
};
if !is_owned_temporary_name(name) {
continue;
}
let path = entry.path();
if !fs::symlink_metadata(&path)?.file_type().is_file() {
continue;
}
fs::remove_file(&path)?;
removed = true;
}
if removed {
sync_directory(dir, policy)?;
}
Ok(())
}

fn remove_owned_temp(path: &Path) {
let _ = fs::remove_file(path);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,14 @@ mod tests {

use super::*;

#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
// The held destructor below parks one worker thread for the whole test, and
// `begin_shutdown` injects both aborts at once. A worker drains
// `inject.len() / worker_threads + 1` notifications in one batch, so with two
// workers the one that blocks can also capture the second shard's abort into
// its local queue, where the surviving worker never gets notified to steal it
// and the second retirement hangs instead of running slowly. Four workers keep
// that batch at one task each and leave spare capacity for the blocked one.
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn cancelled_shutdown_retains_incomplete_future_drop_and_independent_retirement() {
struct HeldDrop {
started: Arc<Notify>,
Expand Down
1 change: 1 addition & 0 deletions crates/tracedecay/src/daemon/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ mod invocation_ownership;
mod lifecycle;
mod logging;
mod multi_root_journey;
mod multi_root_scope_set_cas_mcp;
mod ownership;
mod remote_project_deletion;
mod remote_project_recovery;
Expand Down
Loading
Loading