Document Assistant message-boundary history edits

This commit is contained in:
Kaede Akino committed 2026-09-23 11:41:58 +08:00
1 parent 5ae3039f0d
commit d74f39bbda
10 files changed
+522 -121

No files matched your search

@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"pageVersion": "sha256:564964f95e8176182ff915ce6d8834e7717b6a3a3be946666c5b1d1d749906cc",
"pageVersion": "sha256:902f023527c34c7a6aacb2a481737931b5f30946486a41b279723af0321cc821",
"claims": [
{
"id": "claim_72f9329a158e418cbf0fd6394f82815e",
@@ -341,8 +341,8 @@
"statement": "Preparation has a separate identity from streaming: cancellation invalidates it synchronously and joins tracked history/preparation work before interrupted persistence; stale edits are rejected, archive/delete cancel preparation, manual compaction refuses it, and changing selection alone does not cancel it.",
"evidence": [
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L236-L259",
"version": "repo-lines-v1:sha256:fb96479831645e246050471c6bfb603e36dfa4c433cea61b917671f897948614:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijk2YmY3NzkyYmMwMzMxOWEyNThmMDMxMzZlNTg4MWE0YjdmNTI3ZWVkNTQ4ZDQ4MGRlZWE5Zjg0ZGE2NTczZWYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMwNTRiZjkyODIzYmI3NmNlYjU1YmNkZGI1Y2UwNTk0MTUzNjJjZGNhZjk3MTQ1MzhmMDg0NzQ1ZmQ4Njg2OWUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ4MDZhNjU1YWM2ZmRkYzgzZGYwOGUyMmQyNjc1MzM3ZjZjYWYzN2E0NGZhMDdjOGEzNWViZGIwZWNlYTVjMWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMxYWI2OTA5MDBkNWZjZmRjMmMxNjEzYjRlNDA0ODc3YTU2MjZjMjM2MWZiNGQ0MTJjMGIyMDlkYjBlNzJlMzgifQ"
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L231-L255",
"version": "repo-lines-v1:sha256:63509c11ab1c2718bead3930614de6427e1e6df47c0e787aeed401498661891c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjY0YzVmZGJhOWRmZTUwNjMwNjlkYTdlN2RiZWVjM2QzZWRiNjE3YmUzMTQxYjBmNGEyYzY0OTEzNWI0N2M2ZDMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIyMzkzYWYzYmRiOTExYzA2ZWFmMjNkYjMxZTkyMmNkNGY3NDc2MmYzNGFmMTE1NTJkNDczYzc1ODhhZmFhZTkifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift#L12-L21",
@@ -357,18 +357,62 @@
"version": "repo-lines-v1:sha256:10dde8f96383fc4e7c331b4e927c1c5e61a7173356ef4b5b49d67c68ba29e2e3:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImExMGUxZDhkNTQ2OGFiNjQ4MzUxNzE3MWM1ZDQ0NzZiNjUzNjIwNDJlYzVlNzZhYjNlZWQ2NTM4YjhmZmRiN2MiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJiZWNkMDQ0NWJmNGEzYTg5NTcwNTczNGE0YmEyYjFjYzQxMjRiNzM1NzYyYWY0ZWYxYzQyODcyNTkyMThlNzQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBiNDkxY2E1OGFjYmFiYWNhOTBhZDBkYmQyNjgxODk3NzFhMjY2YTYyM2FhZmE3NzRhYzY1MTg5OTk3YjU1YWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L684-L770",
"version": "repo-lines-v1:sha256:405ec2eca133a1dd12f58eb7f2099860c2da18f294af59b286e2f1f935847c4c:eyJzZWxlY3RlZExpbmVDb3VudCI6ODcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxMGEwMjJhZTMxNzI3ZmIzMmUxNTFiMmY3NzA0ZmE4ODVkYTZjZTc0NTdhMjU1OTNiMWIxY2M3YTA3ZGY5NjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM0OWVhNzVmZmFiZjU2OTUxMTk2YTQ4ODljNDE1OGZmYjM3NDY5NThhMmI3NDIxODE1NjVkYTU3NDkxZDI2YmQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdiZTFlNjJiNzdiZmE0MWYyZjNjYzlhMDU1MDI1MzY4MWI3Y2VhN2M2ZDZhMTk5MzljYjVkNTEyMGFjNTI4M2UiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZkNjUzOWRjYTQ0MjY0ZTViYjAwZTU2MzRmY2M2NGI4YmMwOThmNTViNDAxZDBjNDIzZTYzNTlmNDJhOGE0ZjEifQ"
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L684-L762",
"version": "repo-lines-v1:sha256:7a08479880142384554fef4c4143ed597856d65be0c552a76400a967ada09df3:eyJzZWxlY3RlZExpbmVDb3VudCI6NzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxMGEwMjJhZTMxNzI3ZmIzMmUxNTFiMmY3NzA0ZmE4ODVkYTZjZTc0NTdhMjU1OTNiMWIxY2M3YTA3ZGY5NjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI5YWI2ZThkYTBmYzkwMDY0YjdjNGEzNTI3YTVlNWFiZDI1NWI2YjBmZTE3NTc5YWFiNDI1Nzg1YjA2NmZmNDUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdiZTFlNjJiNzdiZmE0MWYyZjNjYzlhMDU1MDI1MzY4MWI3Y2VhN2M2ZDZhMTk5MzljYjVkNTEyMGFjNTI4M2UiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBkOTk4NGRkMWE0Y2M1Y2ZlMTkyYzE1NzRkZWMzYTk1MmFmZDgyMWVjNzZjMGJmZTAxM2Y3OWMzNjJmODlkODIifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L829-L839",
"version": "repo-lines-v1:sha256:1cfe225932062439ff267e988637e685c28e2ecefa0b0e93398784b85cb79032:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFhMmRhZDQzODJjOWExZTA4YjBkMDE4YjZmM2E5ZTE3ZDJlODU3YTA0ZjdjOWUyN2RhODQxOGI3YjUzN2U2MzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgwMjczNmZkMDQ2ZjFlNWQ4Y2ExZTYyNjRhNWJjZjhlNTc2YmY4YzFmM2RmNmM4OTk2MTIxZDI1ZWIyMDAzMzQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjYyZDRiYThiMzc0ODExZjYxZDdmOTQ4NWYwNzMzMzFiMDczYTNmNTI5ZDdmM2ZiNDU2MDlmMTRhMTMxMjc1M2QiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJiMDY3MDk2YzhiOTcxNzZhODc3ZGQ3YzIyNjRmYjU3MTljMGRlYWRkMWIxMGI4YjcxYzljYWZjZDk2OWIyNDAifQ"
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L830-L839",
"version": "repo-lines-v1:sha256:ce3f227083ebc0587a705272d2c18cfa110d702714310ad736937b34384653a6:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZDUzYmFhYzE4Nzg1MmI0MzFjMjMyZTA1MTYwNjFkNDk2ZjdhMjE1NmVlNGJmN2RlYTY0N2ZjNjY0OTg2NmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNmNzA5MTI3NmEyNGM5MTU5YzRjZGUzZWZiY2RlYWM3YmQ4ZWM3ZjQxYzVkYjNhNmIyOWM3MTE1OGZkZDg5Y2IiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNlOGQzZmM2YzYwOTVmMmM4OTlhMmM0MTRlMTg4Zjg4MjY3MTA1ZjQ0ZTQ3ZTZhODQ4NjE3MTM1NGE1ZmYzYzMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY5MTNmNzA3ZWY5NzdkM2FlMDUxOTgzMGM2YTc2NmYxYmI1OTdjZjJlMDgxOTQ3MDM0MzU0ZWU0MTQ1ZjA0NmUifQ"
}
]
},
{
"id": "claim_5ebe57a209164945b6910dd77f3e1352",
"statement": "History edits commit before live replacement, truncate at the selected user message in canonical run/message order, preserve the same-run prefix and its owned tool graph with a neutral completed summary, and prune compactions by removed message boundaries while considering compacted display history for live ownership and title retention.",
"evidence": [
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift#L129-L147",
"version": "repo-lines-v1:sha256:45383d212fb6991f01b24f3ea84538b0f619b50ed950673b4c79037e4de1652d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU3ODhmN2QzZWVhNGY0NTY0NzdmM2QwMjliNTAzZDI5YmU4YjExOTNiNjJjZTZlOWMzZTk5ZDQ1NDczMjViNDYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4MzBkMzQxYjc5NmIyZjQyNTk4YTk3M2UwMTJkOGIyZTZjNTE2MDkwYzliMDQ0YWMwZDhkYTIyZjU2MzI4MzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L1089-L1218",
"version": "repo-lines-v1:sha256:248cfe3f3ede17937a4b48e8c211924e23677e9224b64834e14b6a03a7601804:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMwLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIzNmMxMTM5ZTBjOGMxM2Q5MDU2ZTIxYTE4NTEyZjA1OWY0MmI5MzNkNDI3OWU4MWE1NzUyM2NkNDFlYzEyZTk5IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI1OTA5YTUzYTYxOGQwMjhlMWQzMDAwYzBhN2FiY2VlY2JlNWZiMzdmNGU1MTFlZmU0NjY0M2ZhZDZlNjY4NzJmIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIxY2FmYzE2N2VlOTliNmY1YzgxZTA2Yzg5MzYzYmNhMGJkM2VlODVmZGMwZDVmZDNkMDZiNGMwYTIwNTkxZTgwIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmYjA0NTczZTY0ZjNmYjg2YTQ1OTZjYmRmYzZmOTNkYTIxYzE1OGJiNjNiYTgyMjg1OWNkMzNmZTNhNTM0OWRlIn0"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L398-L513",
"version": "repo-lines-v1:sha256:786d58b2e1a37cd62e8cde6443f38ed2fbb0dbd0ce10fdb8bc90b441b3c6eed4:eyJzZWxlY3RlZExpbmVDb3VudCI6MTE2LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI1NTIyYzQyY2QxOWM2ZDAzZDgwOGM0NTI3MjA1NTI4MjViN2VhMWM1YjQ5MWIyMTg1MTFjYWM3NDE1Y2Y5ZDliIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJhMGU2YmJkMjI2NGYyMzJkYTlhOGNlYzkxZWQzMDk1ZmEwODgzYjU3MjU5YzUzODY1MjM4NjVmYjM2MWYwMDY5IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJhMDk3ZjZkNTBkOTY0NWU2MmNhODlkOWQ1MTJhM2U4N2ZiYThkNzkzZTRkMjk2NzlhNWZmMmRiNDMzYWU2ZjlhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIxOTYxN2Y1M2MzNjY1NjllOWI3ZGRhMDk5M2ExOWJjNzBhZTQ2ZjIxMzA3OGY1YWUzNDIyYzFiNTdiYzc0YTMwIn0"
}
]
},
{
"id": "claim_fd359e43825344cb87abb3a4938e1663",
"statement": "An edited message first owns its same-ID staging run; the first real snapshot atomically reassigns only the staged row and removes staging, while live running/failed/interrupted adoption preserves provenance and chronology. Repository-instance retired IDs reject late saves/events; missing-model/credential failures still publish live before asynchronous save.",
"evidence": [
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L719-L793",
"version": "repo-lines-v1:sha256:81156ef97d808d87d63a184f6020940cf4a5bbbdecd8dc55a2d3a3c7e7b0b60c:eyJzZWxlY3RlZExpbmVDb3VudCI6NzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2YjhlMjRkZDNlZmY5YzY3YTZiNzg3ZWMwMjA3ZmMxZTI0ZGMxZTcwZmRlZWViNmFjOTljOGFkNjA1Yzk3YmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2ODhmNzU3ODA1NDczNjk2N2U4NzY5MmJiYTg2YjI4MDhmMzI0MTk3NTQ0MDVlYmZkNmM0NWI3MTk4OWQ0NzQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRhNzdhMDY4Y2ZiMmUwMWRiMDJlMTAyZDRiODhhOWMzYWRlOTU3YTNhMWMzYjczOGE3ZTBjMWNmMTc5MTUwMjgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRjNmM3Y2RjOGM0ZWMwYmM5ZGU4ZTY5MThmYWUwYWE5ODQ0MTJiNDJjZTVjMzY5ZWExZTMzMjg0N2Y4ZjIyOWIifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L2040-L2092",
"version": "repo-lines-v1:sha256:d1a56a12b39372c0277e40115884e11b8c29d16d3df1e847c7407b89efbd1881:eyJzZWxlY3RlZExpbmVDb3VudCI6NTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVkOGQ3MGNkOTIxY2E1NTJmMGEwZWIxMGJhNzc3OWQ2OTk0M2RlZjUwY2NhNjQ5YjIyZTg2MzU3OTgyM2ExM2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU3YzRmZjVmY2EyMGUzODk0Zjc3ZmY2NDk0Y2FmNmVkZDU2NzFiZjE3N2YyMmVmMDE3NDBlNzNhMTYwMTc3OWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjlhZDUyYWNhNzhkODcxNDMzZjJhNzMzZGJmMDQ3MGNmYTZhNGEwZGQzM2IzY2IwYzgyMTJlODNkYTIxY2ExZmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJiNTdmZTYwMTUxZDJlN2IwYWNlZTEzOTJhYzI5OGUxYzBjOGE2OWRiMzlkNWU4OTllYzNkMzdkMTM4Njc3ZjMifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L2625-L2646",
"version": "repo-lines-v1:sha256:078528287f4cac7401a61342ac1db3154e36f5566407f8bb9332cd63c543e273:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdjZWUwZWU1M2M2NjUxODNlOTE0NjU5MDViZWY3ZDQyMTI0ZDRmM2JkYTJkNDg5MzlkNWIwNWQ1Yzc1MzIyODgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNmODMwOTk4YzhiZmMyY2EwMGQ0MGM5NDlmZTgxOTQ5ZmQwZDg4MTg1ZWUzOGNlMDNjMjAzNzg4MDZhZWQ4YWEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA2YzUyZmU0ZTgxMjIzMWU2NGIyMGFmODc0MmI0ZGJjZWNhMjlkMDFjMTVjYzk1NDNjYzc0ZGFhNDAzNjlkZGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJmZGI5NTg3M2IxNmNiMTEwMGJjNGVmMGZmYWFiMzZmODc1Y2EzYmVjODY2MmIwMDA5YzEwY2JlNWE2YWVjNTMifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L156-L165",
"version": "repo-lines-v1:sha256:c887b3a1878d05b6825a0061c2a4ac62fa358fae324872204ffb83d6b940c2ed:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyYmI2ZDU3ODMxMmY2MmZkZDc5Yzg4N2EwY2M2ZWQwNGNkOTA5NDBmMWFhYTdlOWE1MDIwZWY2OTI5MWE5NTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ2MDIwMDcwNjJmOGU3MDc5ODNiZjBkYmI4ODMyMDYwMjZiMzM1ZGY5ODBmODNlZjQ0YWYzYjRjMWI3NDA0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcxMDIxY2E1Njc1M2E4ZWM0MDdkZjY5ZjhhNWM4ZGMwYmJiODEyOWE2MTQ1N2NjYWNhYTdjOGYwNzEyMWQ4NTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMwNzU5M2RmMjVjYjQxMmZiNWI3NWUwZWI3NWQ3NGM1ZWY0YjBhMzE1YmJlMWRmYjcwMTg4N2MwMjEyMGM1NjcifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L16-L121",
"version": "repo-lines-v1:sha256:c1a4a9f265c86d77937e83acae5e2b69a2523713431a89d470dad62099d6b376:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA2LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI3MmJiNmQ1NzgzMTJmNjJmZGQ3OWM4ODdhMGNjNmVkMDRjZDkwOTQwZjFhYWE3ZTlhNTAyMGVmNjkyOTFhOTU3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJkY2UzN2IzN2YwNGIxOGQwODk0NmFmYTY3M2UwYzIzNjcyMWEwMzkwNTQ2YjM4NTUyYzI0YWY3MDc4ZTdhYjMyIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlY2U5NjA2M2ViYmNhNjY1M2Q0YTYwYTViNjBjZWE4OTRkOTVmOWExNjQyZTQxNDEwMjFkNDZlNjQ4MjgyNGVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmNTcxZWY2ZjVlOTYzMTE4ZDM3MTdiNGQ4MmI0YjBiOTliMmI0OTI3NjYzNGFjNWZiNmZhMGE3ZTVjNDBlZjhjIn0"
}
]
}
],
"verification": {
"by": "openwiki/0.5.2",
"at": "2026-09-23T02:40:53.789Z"
"at": "2026-09-23T03:34:06.838Z"
}
}
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"pageVersion": "sha256:1dba6f651d9536e5ea63b9bd551b7e20cc973f0816613aec3593304b42c8cbfb",
"pageVersion": "sha256:46c6736cc2e227449885be7dd7fbf51a7b98259f7509c85a334881cc20382e90",
"claims": [
{
"id": "claim_981f16f030e9469588af705aa377161e",
@@ -163,15 +163,19 @@
"version": "repo-lines-v1:sha256:d63fa5240e197b14ca235275b415affcb5df50fd36b04407f3853864de0eec2f:eyJzZWxlY3RlZExpbmVDb3VudCI6NCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiY2JlNzJmMzczMTQyYTJhMDE4M2U5YjUyYzE4OTMxZDkwNTI5ZWFjOGQwZmJhY2FlMmU3Njc1MTZjMTVlZmIzYiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYjZlYzhlMjVhMTk4MGQ0YmVmNDRmYzk1Y2JlYTAzNmRiZjM2ODQ2MWU1YTU3NmRhNjA2MTNhYzFhYmFjODk1MiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOGYzMzJlODFkY2ZiZjQyZmQyMjU3NDk1OWM2YjdjMTAxNzJjOWMwOWUwOTY3MjczMmUxNDM5Mzg1ZmNkZDNmZiJ9"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L47-L75",
"version": "repo-lines-v1:sha256:3e3cf6dd4cb38f70d589568031e9bdf159967aaa4a80c86fe225a88a4414f107:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJlOGZlM2YzMDFmYjI4M2EzNDNmNWNhZWVkYWZkMTAzMGY0OTQ5YWE4NDQ5MjFiNzUxZDI0NWU0MDViOWMwMWYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE3ZmIwOGJmYjIyNTk4ZmJiOWM0NTgyNjRmM2MxYzZiMDA2MTY4YjY5MTY2MmJjNTBhZTVjYzVlMjg2ZDU2ZmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4OTZhNDc4MzIxYTFmMGQwOTUyMDliMjkyMTBmNmFkZmMyMmQ3YjQ2ZjMxYzMzODhlNGQzMjk5OWRhMTFjNzEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkwODY1Mjc5OWI1MWU3OWUxYTg3OTZlZDMzNDM5ZDVmNTEwNTYzYjA5ODY1ZDgyOGJjYTFiZDMwYTY3MThmYmEifQ"
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L156-L189",
"version": "repo-lines-v1:sha256:96d8bf791ad0209c27eea28ba6e5a377ce55cc1d23e8f033b9b5dc954224032f:eyJzZWxlY3RlZExpbmVDb3VudCI6MzQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyYmI2ZDU3ODMxMmY2MmZkZDc5Yzg4N2EwY2M2ZWQwNGNkOTA5NDBmMWFhYTdlOWE1MDIwZWY2OTI5MWE5NTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE3ZmIwOGJmYjIyNTk4ZmJiOWM0NTgyNjRmM2MxYzZiMDA2MTY4YjY5MTY2MmJjNTBhZTVjYzVlMjg2ZDU2ZmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcxMDIxY2E1Njc1M2E4ZWM0MDdkZjY5ZjhhNWM4ZGMwYmJiODEyOWE2MTQ1N2NjYWNhYTdjOGYwNzEyMWQ4NTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkwODY1Mjc5OWI1MWU3OWUxYTg3OTZlZDMzNDM5ZDVmNTEwNTYzYjA5ODY1ZDgyOGJjYTFiZDMwYTY3MThmYmEifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L550-L605",
"version": "repo-lines-v1:sha256:6aa3a9f8b2bd8335e17c386f68b91564551f30ee25e239ae960ae032ef4f90fd:eyJzZWxlY3RlZExpbmVDb3VudCI6NTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAzNzE0ODNiZmQ5OGM1MGM5NDg5ODlmOWEwNTJjMzI1MGUzNzMyYTczYTc2MGY1ZDJhN2I2MjFhNTJhNmUzYjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNiYjUzMTU2YTNkYjA5MDdmY2I4NDEwNjJjNjc5NjdiMzMwY2I5NTk1ZjViNWEzM2I4ZWVmNTZjZTVlMzczZjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMyZTEzMDIxNmFiMTA4MGE5ZWZiY2Q1NGIzMDdiNDk0ODU2YTUzMTYxNDc2Y2Y4ZWNjZGM0YTYxYzk3NWVlMTIifQ"
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L60-L114",
"version": "repo-lines-v1:sha256:118c8d30f1c995a58390a2ee4694a6fd949d3684e9874e3b8e8e6e3fe003fe43:eyJzZWxlY3RlZExpbmVDb3VudCI6NTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYxZjE3YzM4MDE4ZjhkMDliMDEwMWYzMDI4ZTlmZDk1MGJmZWVhMjljYjAzMTkxYWVlNDNlNzBmODU2MTViMTUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcxN2Y3NTdhNGJiYzVkNGYwMzI5YjU3YmM0NThmODFmNDhiYzBlMTkwMGJiMjU5MGE4YThmNTMyMjU0NzNmMGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMxNmI4NGRlYzM1NDFiMTNkMzFmZTkyN2I0YTM2ZDEwZTBiNWNlNjgzYTVmM2E4YjZjMWRiOWNhODFlYWJhMjYifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L671-L683",
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L746-L786",
"version": "repo-lines-v1:sha256:0bbf3410aaea40a96735687ffa5a11a929afa27945aae74e81a0b4f54512d7bf:eyJzZWxlY3RlZExpbmVDb3VudCI6NDEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYzMDUyZGM5NmZhZDk0ODE0NjNkNjcyNzYyOTZkNzk1Y2Q1ZTAyODJmZmNkMDAzNzAxZTEyMzcwMjM3Mzk3NDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjljMjdkYzQ2OTBhZmJjZmM5NjgxOGIyYWZkNDY4ZjkwOGUyNDBhYTgwZWEzZWYwZjcyYjM2ZjNhOThjYTUyNjgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ5ODY4MDg2NjZjMjE5ZjM3Y2M3MzlhZGRlOWQ4NjBmZDIxNWRkNDc4MDU1OWI4ZWFkMzlkN2Y4ODFhYjI2ZDMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNiZTE1OGU4OWZkYzM4OTc0NzZhMGZmYTc2NjE0MmUxNGNkYjIyMTNjYjIzMmQwYTEzMGU3NTlhNWM3ZDllNGUifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L853-L865",
"version": "repo-lines-v1:sha256:f142043bb1b01de9a0458b3995239712303b9ee5f7cd1bc4531d3ee6da2913f1:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ5NGQ4ZDkyN2FkMTU0ZTM2ZmFhZjZiMmI2MjMxZDllN2Q2MzRiY2IzZTliMjI2MzA4ZmJhMGVkOWQ3MDY0NjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZmMGQ3NTk1MGRmMGZmOWEzZWU5NjYzOWRjYzhmZjVlYWVkYjQwZDY4MmJlYTkyNjIyYjUyMGRkODg3ZDkzZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
}
]
@@ -453,12 +457,12 @@
"statement": "Desktop and mobile prepare edits synchronously before creating a UI task, preserving original attachment payload/suffix but capturing fresh submission context; performAgentEdit checks identity before tracked persistence and again before runtime preparation, and failed persistence does not apply the live edit.",
"evidence": [
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L448-L495",
"version": "repo-lines-v1:sha256:838ceb32878a6eeab928ca75de90ff336039a453f732420b741e243c655d60e7:eyJzZWxlY3RlZExpbmVDb3VudCI6NDgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZkYTc3OGQ5NDJjNzRkNGFjOGYzMmM1MTgyMDg2MGFlOGE2MDQ5YWE1NDUwYTE5NjMzMTM4MmNmNWVmNWU1MGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk1NTUyNmNmOWEwOGQ4Yzc1ZTA5ZThhMWZhMTIwODkxZmQ3MWEwMDNhMjkwY2U5ZTEzY2YwOWQ5NjRmYjkxYWUifQ"
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L450-L503",
"version": "repo-lines-v1:sha256:1c6b9ba0438e47aa7828a8f0a41cdc7625ac586fd9baee676a531b04a954769a:eyJzZWxlY3RlZExpbmVDb3VudCI6NTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZkYTc3OGQ5NDJjNzRkNGFjOGYzMmM1MTgyMDg2MGFlOGE2MDQ5YWE1NDUwYTE5NjMzMTM4MmNmNWVmNWU1MGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJhOTU4ZTIzMDAzNTJiNWU3NmQ0YzYyZWM3ODUyYjY4NjViZTQ4ZDgxODg3NDg2Nzk2ZTkyMTI2MmZkNGRmNTcifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift#L129-L147",
"version": "repo-lines-v1:sha256:cd90c6361276a4a76ce8f418f2c1c6e84412990ab662ed6d79c7aedaf37f184e:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU3ODhmN2QzZWVhNGY0NTY0NzdmM2QwMjliNTAzZDI5YmU4YjExOTNiNjJjZTZlOWMzZTk5ZDQ1NDczMjViNDYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4MzBkMzQxYjc5NmIyZjQyNTk4YTk3M2UwMTJkOGIyZTZjNTE2MDkwYzliMDQ0YWMwZDhkYTIyZjU2MzI4MzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
"version": "repo-lines-v1:sha256:45383d212fb6991f01b24f3ea84538b0f619b50ed950673b4c79037e4de1652d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU3ODhmN2QzZWVhNGY0NTY0NzdmM2QwMjliNTAzZDI5YmU4YjExOTNiNjJjZTZlOWMzZTk5ZDQ1NDczMjViNDYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4MzBkMzQxYjc5NmIyZjQyNTk4YTk3M2UwMTJkOGIyZTZjNTE2MDkwYzliMDQ0YWMwZDhkYTIyZjU2MzI4MzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L216-L281",
@@ -466,7 +470,7 @@
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L1054-L1067",
"version": "repo-lines-v1:sha256:4f484d7cfc22662766e35da9dbd2bbae1e661c48fb02f3e454ed67e39e0efe50:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZkNDEwYjZlNzRkZThiNjdmYWNlOGI5MDE5M2EzYWNiMzg2Y2U2OTk1YjQzMGUwZTVlNThhZmFiZWE0NDFmYTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNmOWI5MjU0ZmFlZTRiMGFkZWU1YmRlMDZjYjY3MjI2ZGI3MDQ2NzUwYjU3NDVkZWQxNzI4YjQ2OTMyODEwZjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU1YjAwYjk5MjY2NDI4ZmU1NTI1NDYwZDE0YzNhMjZlNDI5Yzc3Yjk1ODUyZmEzNzEyYzEzYmNiMTMwM2I3MTAifQ"
"version": "repo-lines-v1:sha256:4f484d7cfc22662766e35da9dbd2bbae1e661c48fb02f3e454ed67e39e0efe50:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZkNDEwYjZlNzRkZThiNjdmYWNlOGI5MDE5M2EzYWNiMzg2Y2U2OTk1YjQzMGUwZTVlNThhZmFiZWE0NDFmYTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNmOWI5MjU0ZmFlZTRiMGFkZWU1YmRlMDZjYjY3MjI2ZGI3MDQ2NzUwYjU3NDVkZWQxNzI4YjQ2OTMyODEwZjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMxODE2NWIyNGI3ZDdhMjdiNTZlZTIxZDVmNzk5NTFmODRkNTk5MDY1YmY3YzZlMzZkYzE5ZjBkZjM2ZWYyZGMifQ"
},
{
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift#L215-L227",
@@ -488,7 +492,7 @@
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L684-L760",
"version": "repo-lines-v1:sha256:64ee147e1dcaafe8cc19bb2697cc20ec0c213ab4605a69f330102ab70ac0e0c7:eyJzZWxlY3RlZExpbmVDb3VudCI6NzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxMGEwMjJhZTMxNzI3ZmIzMmUxNTFiMmY3NzA0ZmE4ODVkYTZjZTc0NTdhMjU1OTNiMWIxY2M3YTA3ZGY5NjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI5YWI2ZThkYTBmYzkwMDY0YjdjNGEzNTI3YTVlNWFiZDI1NWI2YjBmZTE3NTc5YWFiNDI1Nzg1YjA2NmZmNDUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdiZTFlNjJiNzdiZmE0MWYyZjNjYzlhMDU1MDI1MzY4MWI3Y2VhN2M2ZDZhMTk5MzljYjVkNTEyMGFjNTI4M2UiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBkOTk4NGRkMWE0Y2M1Y2ZlMTkyYzE1NzRkZWMzYTk1MmFmZDgyMWVjNzZjMGJmZTAxM2Y3OWMzNjJmODlkODIifQ"
"version": "repo-lines-v1:sha256:7a08479880142384554fef4c4143ed597856d65be0c552a76400a967ada09df3:eyJzZWxlY3RlZExpbmVDb3VudCI6NzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxMGEwMjJhZTMxNzI3ZmIzMmUxNTFiMmY3NzA0ZmE4ODVkYTZjZTc0NTdhMjU1OTNiMWIxY2M3YTA3ZGY5NjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI5YWI2ZThkYTBmYzkwMDY0YjdjNGEzNTI3YTVlNWFiZDI1NWI2YjBmZTE3NTc5YWFiNDI1Nzg1YjA2NmZmNDUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdiZTFlNjJiNzdiZmE0MWYyZjNjYzlhMDU1MDI1MzY4MWI3Y2VhN2M2ZDZhMTk5MzljYjVkNTEyMGFjNTI4M2UiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBkOTk4NGRkMWE0Y2M1Y2ZlMTkyYzE1NzRkZWMzYTk1MmFmZDgyMWVjNzZjMGJmZTAxM2Y3OWMzNjJmODlkODIifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L69-L83",
@@ -517,12 +521,8 @@
"statement": "Archive/delete cancel and join pending preparation before their activity guards; manual compaction refuses preparation, navigation leaves it active, and automatic compaction uses captured preparation settings while preserving persistence-before-live-apply ordering.",
"evidence": [
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L231-L253",
"version": "repo-lines-v1:sha256:139ac4c69442f66025b379fc4089c53b7a0146bb84dc60c78a255b867eec9ffa:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM0NDQ1ZGQ3NzZkZGY3MmE2OGI5ODIzMjUxMjgyYzFlNTI3NmIwNTQwYWVlMzQ3YmViZjEwMWQyODlkZGNmZDUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIyMzkzYWYzYmRiOTExYzA2ZWFmMjNkYjMxZTkyMmNkNGY3NDc2MmYzNGFmMTE1NTJkNDczYzc1ODhhZmFhZTkifQ"
},
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L372-L393",
"version": "repo-lines-v1:sha256:86b94fd10a8c9d7ca8a12fd280f314f6ed57b669f92add6b32897973ab5fbe31:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUxNDk2NDE4YTVkMGU3OTIyYmYzZjczOGMzMzJmZmNhM2UxZGJlMjkwNmFiMWVhMzBkYmE1YjVmNzdiNGYzNDMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBjOGE2MGMzNzZlZGJkOWFjYTMwZGY1NDgwMjUwOGVmMDcxYWU4YmYzN2VmZWE3ZjI3ZTkwOTk0Y2VhZTBhYjAifQ"
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L231-L255",
"version": "repo-lines-v1:sha256:63509c11ab1c2718bead3930614de6427e1e6df47c0e787aeed401498661891c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjY0YzVmZGJhOWRmZTUwNjMwNjlkYTdlN2RiZWVjM2QzZWRiNjE3YmUzMTQxYjBmNGEyYzY0OTEzNWI0N2M2ZDMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIyMzkzYWYzYmRiOTExYzA2ZWFmMjNkYjMxZTkyMmNkNGY3NDc2MmYzNGFmMTE1NTJkNDczYzc1ODhhZmFhZTkifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift#L12-L28",
@@ -537,30 +537,12 @@
"version": "repo-lines-v1:sha256:b7ea68c5df571de68ab0ae45d9c94ed876783cac80350d6c5d0b17aaf3a8683e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVjMGM5OTdhNmNkYjEzZjBmMGY3NDJjNjE2YWRkMmMzYjRlOGMwZDY2OTQ2ZTlkNzQ5Nzc1YjY3YTBkNGY5Y2QiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZmNTNlNmY5NWE4YTI0ODczYjhiMTUyMjJmODMwOWNmNTE2OTY3N2NmYjgwN2JhN2YwYWQwMWQxYTAxMWJhMzMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg1ZThlZjg0MGM3NWUwYTg0ZDlhYTdjN2NkMWY4MmRhMWU2ZmNlM2VjOTY4Yjk5YjIwYzYyZmU1MWYwZDg2OTciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L829-L835",
"version": "repo-lines-v1:sha256:26e72807f43e248f95f1c994dac14bb23d50bba63007496164e70adadf2c6e4a:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMWEyZGFkNDM4MmM5YTFlMDhiMGQwMThiNmYzYTllMTdkMmU4NTdhMDRmN2M5ZTI3ZGE4NDE4YjdiNTM3ZTYzNCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNGY0NjJiN2UxZTkxMWYzN2VhMDM5OWU0OTk1ZWUwMWZmYjc5NzcyNzA0MzU4ZTIzYjQ5M2RhYjBmMjliNzU5NCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNjJkNGJhOGIzNzQ4MTFmNjFkN2Y5NDg1ZjA3MzMzMWIwNzNhM2Y1MjlkN2YzZmI0NTYwOWYxNGExMzEyNzUzZCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDQ2MTIwNmJkOGQ1ZTI2MGNmOWJkYjA0MTlmZjA2MDQyM2IxODIzMWE2ZDE1ZjI4OWY4ZDZhYWI0NDYyNTAxYSJ9"
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L830-L839",
"version": "repo-lines-v1:sha256:ce3f227083ebc0587a705272d2c18cfa110d702714310ad736937b34384653a6:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZDUzYmFhYzE4Nzg1MmI0MzFjMjMyZTA1MTYwNjFkNDk2ZjdhMjE1NmVlNGJmN2RlYTY0N2ZjNjY0OTg2NmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNmNzA5MTI3NmEyNGM5MTU5YzRjZGUzZWZiY2RlYWM3YmQ4ZWM3ZjQxYzVkYjNhNmIyOWM3MTE1OGZkZDg5Y2IiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNlOGQzZmM2YzYwOTVmMmM4OTlhMmM0MTRlMTg4Zjg4MjY3MTA1ZjQ0ZTQ3ZTZhODQ4NjE3MTM1NGE1ZmYzYzMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY5MTNmNzA3ZWY5NzdkM2FlMDUxOTgzMGM2YTc2NmYxYmI1OTdjZjJlMDgxOTQ3MDM0MzU0ZWU0MTQ1ZjA0NmUifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L881-L890",
"version": "repo-lines-v1:sha256:7c9756ce11f5a802355fdf037aff24ef90f81e71df715249370eef766c0a4ab0:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ2MTZmMWZiZWQwMTYzZTEyMTU4OGUxOTZkMjA3Zjk1ZWYwNTFmMGZiMDEwN2YyNDI4OTA1MzAyOTEyYTVhNmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJlMGJhYWZiMDE3NmFmY2M1Yzg3NzI0MTkzYmY4ZmM2NWU4MzgwNGUyYWUwYzk5YjZkODViZjViMmY2ZWFmODEifQ"
}
]
},
{
"id": "claim_8420ecde122546a3a1bc25a77957def7",
"statement": "The SwiftData edit transaction checks cancellation before any synchronous truncation work, but still removes the entire target run and later runs; editing a steering message can therefore remove earlier same-run durable messages that the live model retains before the target message.",
"evidence": [
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L1070-L1095",
"version": "repo-lines-v1:sha256:52e55fbf29dbf0f6cdbb7f1e7a8649d82049f4e361faa3b2fabb517687dd0841:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijk1OTY0YzBmNzc2OTUyZTBkNTg5ZmJiNTBiNzMxMDg2Njg5Y2EyMDc3MzRkNmI0YTcwNmRhYTljMjQ2ZTg0ZjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVkNDQ2MGM1Y2JlNjMyMzgwMmViZWI5M2EzYTkzNjY1ZTU5ZmM5ODYxZjhlYTEzZjY5MDlhYmIyNDZmMWRmOGIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZmMGQ3NTk1MGRmMGZmOWEzZWU5NjYzOWRjYzhmZjVlYWVkYjQwZDY4MmJlYTkyNjIyYjUyMGRkODg3ZDkzZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQyZTkwOGFhOTFkNDc4NzMzMTdhNjJkYjBlNzIwZTU5MjZhNjgyYTQxMjBiZTgyZjVjZmQ3Y2ZmNDc3YjU0ZjMifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L2556-L2581",
"version": "repo-lines-v1:sha256:bda10632960326b0f4e14ddac898407fdd0f3a8325eb63e712a04206f75ef600:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM4MDc5OTUxYmYwMGZiMjNmYzBkZDhiMGIxMDk4NzFmMzQ5MzJiYjNmZTEyZTA4ZWZhZDdkYjllMzQwMjY2NDMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjViMTQxZjY1OGUxNDM2ZWUwZGNkY2I1NDRhYzllNGQ5ZTZhZjI4ZmYxODdlNTkwZTRhODljYjA3NGEzMzY1ZjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjRiMTZkMmIxYWNkOWMwZTFiMzVhZmMwMzVhZWM4YmRkZjMyODcyZWJkNWQ1YzM2OGNiNDI5MGI3ZDU3MGJlMGMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImFiYWFiMmE0NTg0NWUzZDAyOWM1NDI0ODBmMGY4NThiZDMwMmU3OTdmNjNkZjFjNzIzNzMzYmFjZGY1YTgwYTMifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L352-L412",
"version": "repo-lines-v1:sha256:3a86a7bd8ecbbb84119dfaaa13c7eede8a28a6321764a743ba61677b6dcd662f:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyYmI2ZDU3ODMxMmY2MmZkZDc5Yzg4N2EwY2M2ZWQwNGNkOTA5NDBmMWFhYTdlOWE1MDIwZWY2OTI5MWE5NTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcxMDIxY2E1Njc1M2E4ZWM0MDdkZjY5ZjhhNWM4ZGMwYmJiODEyOWE2MTQ1N2NjYWNhYTdjOGYwNzEyMWQ4NTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkwODY1Mjc5OWI1MWU3OWUxYTg3OTZlZDMzNDM5ZDVmNTEwNTYzYjA5ODY1ZDgyOGJjYTFiZDMwYTY3MThmYmEifQ"
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L881-L892",
"version": "repo-lines-v1:sha256:511d122c9d8b8981de6d7c39b078ca3b5f6af4930853207aa98b7d3365557bf8:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjZkNWViODBiM2MyZWVhZTUwMjUzNWRmMTM0YzJjMGY2NzljZGU3OTU4NDQzNjdmYzNhZjVjNDAzZWE4YzMyNjUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJlMGJhYWZiMDE3NmFmY2M1Yzg3NzI0MTkzYmY4ZmM2NWU4MzgwNGUyYWUwYzk5YjZkODViZjViMmY2ZWFmODEifQ"
}
]
},
@@ -648,7 +630,7 @@
"evidence": [
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L66-L85",
"version": "repo-lines-v1:sha256:13e7b01f19946ab38cdef60520d4429dc12ac6ba60679734bb93decce1577a38:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImY1OGZlNzcyYzJiNDExMGEyYzJhOWQxYTk5MjI3OGY4ZTNmZDg5YzMzNzJlZjZmYjE0Y2NjYmU1NDU3MmQyMWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZkMzMwZjllZDlkNjUwYTVhMDRlNTk4Y2YxNmE2NmZkOTM3NWZjYWIxMzhkMmJiNmE0MWYxNTJjYzRjMjExNDQifQ"
"version": "repo-lines-v1:sha256:80d25cc0451a928bc50f91e07a28b411b83c0d7299889938c179b8d5e96fb33b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImY1OGZlNzcyYzJiNDExMGEyYzJhOWQxYTk5MjI3OGY4ZTNmZDg5YzMzNzJlZjZmYjE0Y2NjYmU1NDU3MmQyMWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZkMzMwZjllZDlkNjUwYTVhMDRlNTk4Y2YxNmE2NmZkOTM3NWZjYWIxMzhkMmJiNmE0MWYxNTJjYzRjMjExNDQifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L348-L379",
@@ -699,10 +681,128 @@
"version": "repo-lines-v1:sha256:8c395370a5d6db13c09099290c322db66dec28cafff52ef018a409820775f53e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZhNTA0ZjZiZmJkY2EwOGIwZTE4NmFlMjA4YTBjODQwNTFlYmVjYzg5YjU5NTcxOTc1M2U1MGRhNjJiMDcwNDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjliNGNhZGRmMjhjMGJkYmRjNmVkMWM0NzRiNWIwNTNlZDk3OWQ1ZDQyZjA0NTZlODQ4YmIwNzY5ZjViOWVjMzUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM1ZWJkZTg4ZjUxNjFmNzkyMmRjOWY0ZjdlYzA4OTg2ZDU2MzdjMmI3NDZiNzYxMWVjOGZkY2VkMzM2YTNjZmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoyLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM3OTRkMDJhODEyMTk0NGQxNzZkMjY1ZTliYjljYzU5ZjZhYjg5MGJjYWRmOGFlZmRlYmRiYmI0ZjJlYTg0NDQifQ"
}
]
},
{
"id": "claim_dce95033c20b4420b1a4e93eaa088f42",
"statement": "A validated history edit commits before live mutation and truncates from the selected ordinary user message in canonical run/message order, preserving a same-run prefix and its owned tool graph with a neutral completed summary while deleting wholly later runs, including empty runs.",
"evidence": [
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift#L129-L147",
"version": "repo-lines-v1:sha256:45383d212fb6991f01b24f3ea84538b0f619b50ed950673b4c79037e4de1652d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU3ODhmN2QzZWVhNGY0NTY0NzdmM2QwMjliNTAzZDI5YmU4YjExOTNiNjJjZTZlOWMzZTk5ZDQ1NDczMjViNDYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4MzBkMzQxYjc5NmIyZjQyNTk4YTk3M2UwMTJkOGIyZTZjNTE2MDkwYzliMDQ0YWMwZDhkYTIyZjU2MzI4MzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L398-L474",
"version": "repo-lines-v1:sha256:b4de660c3a3b7c33e6354f0941bc3b8f8b034a3983e044a414a4039dd3073f6e:eyJzZWxlY3RlZExpbmVDb3VudCI6NzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1MjJjNDJjZDE5YzZkMDNkODA4YzQ1MjcyMDU1MjgyNWI3ZWExYzViNDkxYjIxODUxMWNhYzc0MTVjZjlkOWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImEwOTdmNmQ1MGQ5NjQ1ZTYyY2E4OWQ5ZDUxMmEzZTg3ZmJhOGQ3OTNlNGQyOTY3OWE1ZmYyZGI0MzNhZTZmOWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM0ZmU5ZTVmYmZmMzY5YzBkODIzMzZlMDA1NGFiMmM4NzZhODBkN2VhZTYzNDVkODgyMDA0YjgyYTc5ZDkxYTgifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L690-L713",
"version": "repo-lines-v1:sha256:487650c28b9099463e7bfa7834c959b0cf74fc3d13d1b1961ff07461c20fe72d:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNmMDAxZTQ3OTg4NTAxYjJjMTQ3YmI0ODRlN2FiMWFkMTJhODcwM2JlZTA2MGJkOTdkNWM4Yzg3YjMwNGYxZjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjIwZmIwMDQ2MGVkM2FlMTI3MTgwYzExMDE3YzE3ZDYwMTAwNWM2MmFiMDVjOTFjYzZhYzk0OGRiOTAxMTE2YzQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdkM2E0OWNiYWFhZmQzZTYxYzdlNGZhZWU4NzViNGQ0ZjBlMzA2NzAxMzM2ZmNiNTI0MTMyMjJhOTk2MTU0YjYifQ"
},
{
"resource": "repo://TFMTests/AgentPersistenceTests.swift#L872-L1074",
"version": "repo-lines-v1:sha256:2a68be1f9c455cfee76bc0c6c557a1d8af1bf909f951786b861e71498a31b67e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAzLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIxYzlhMjg4MzM2YWFlNTM2ZWUyNDBiMGZjMGU5MTI5YzMwYmYzZGZiNmJiNWQwYzI1YThlNTk3ODk2N2Y1Y2Y3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlOGVhZjNlMWRiMjg0ZjZhNmZkNGUwNjZhZTJmYjY1NGFlNjhmZGZjZjNlN2U0ZGNhNGMyZGQyMTRhNDliOWQwIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI5ZDAxODMwNWY5YTk2MzdiODgxYTY4ZWZlZjM3OGU0NTdhMDkxYWExMmIwYzQ2ZmYzZDVmYjgzN2RkOTE1ZGY2In0"
}
]
},
{
"id": "claim_9e856827319647aa8e174ce79b9e4450",
"statement": "Edit tool cleanup prioritizes known source/call ownership; restore infers legacy source IDs and assigns recovered result ownership, letting live edits use retained result and full display-prefix ownership through compaction. Only unrecoverable ownership falls back to the inclusive timestamp cutoff, including modern provider-native events persisted before their source-message snapshot; compactions prune explicit removed boundaries, nil bases survive, and retained openings preserve the title.",
"evidence": [
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L1099-L1213",
"version": "repo-lines-v1:sha256:391561a2c3b5ec7d720aad49d064e49ee0835d8ae1b7238c893acd5db9f1c2a2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTE1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI2NTExMWVkYzQ0MzRmMWNjY2RjZTRiMWJmYjliMzg0NzliZTQ0OWE4NTI1YmM1NWY1ZDVkNTgzMWUxMWEwODQ2IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0OGQ0MWEzMDg0NzY3MDkwN2YwNTdmYTM2Yzk4M2JjMjgxMTY4OGIxZjY0MjBiNzY5NTdmMjZjNmZiNDM4ZDM2IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJiZmYwNGNhNmE5MmRiNWE1ZWFlYTgyNDU5YjQwMTZhNDY3Yzk0NDFkZjUwODBjZGZhNTU2YWE4ODc2YTc5YzU2IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI0NGYyZWVkNzJiOTA1YmY3MGFlYzgwNTYwN2ZmMTE2NmI4NDg4NDVlM2M1OTE2YTIyMzU4YWMzZDIzMTY0Mzg1In0"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L265-L300",
"version": "repo-lines-v1:sha256:18f9323794aa82ed081c01504f42cbadf30f212d167e36843b0c25b5bf4e037c:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEwMGY1NTMxZTgyMjQzZmE5YTUxMTljZjRhYmQ2YTFlNmMyODM4ZmJmOGY2MThkYzFmNzk0OGE2NmU1M2U0YmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZlMWU1OGJiYjE1OGJmM2Y1NmU4NDU2NTFkOWYzMmNiNGQwNzY1ODE5ZWE0YjBlYjc4MWE2NWE4Njk2YjQ2N2MiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc1ZWM1NjU4Y2ViYTY5NzExNGJjZmQwMWExOWI0OWZhNDY0YjZmMDk3MjFiNWJjYzExZGRhM2VkOWU4MGRhY2MiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA1ZjY4M2EzYWQ3ZTNiMmY1M2NiYjYzMzc0ZGEzYTBlZGI1ODAzNjM4MTA3N2VlOTMzNjg4OTJlMWU1NDcyYWQifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L463-L474",
"version": "repo-lines-v1:sha256:3566b5c55e0c816569eed81c87e1d5fb164f13ddf0411b083be2192939c87efa:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg4MzQ2OTgxMTA0N2U0OGM3YjIwZjMyZTZiMzY3MTkyMTU1YTRiZDNkYTQ5MmNkMGRhY2YwY2E1MWY5NTdiN2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ0NWZmYTMzMWFiMzkxNWJhMzk3Mjc1YzJkNDg1MzMyM2M5NTk4OGUxY2Q2NDk5MDE5ZTE4MmViMDdkMTU4YjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM0ZmU5ZTVmYmZmMzY5YzBkODIzMzZlMDA1NGFiMmM4NzZhODBkN2VhZTYzNDVkODgyMDA0YjgyYTc5ZDkxYTgifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L642-L669",
"version": "repo-lines-v1:sha256:bd434e864596637e645d6eb82622055fd9b8b8d494f895a8278ecdca3581663c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg2MjZkYmE4MTBjOWI5NmZhYmI1MmJkNjhhMTFhY2ZhOTRmYWQyZjZmYWY1ODJhMzMyYjA3MmIzNzE2NWI0NzgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjgyMDZiNTMyMTkzMjkzZThiM2U3OGI2ZmY2MzczNDVlMzhmZTJlYTRmZTQyMjc0YTc2NDhiYzlhNGYzNjk5ZjUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE3NDJmODZmOTJlMzg5MTljZjQzOGQ5MjdlYTUwZDMyZDkwMjljZjgxOGJmYTFkNWYzYWZiYTk1NGQxMmNlNzMifQ"
},
{
"resource": "repo://TFMTests/AgentPersistenceTests.swift#L972-L1015",
"version": "repo-lines-v1:sha256:a4c0ef3257d9a4c53b2a8cac0f20fd52f9bf2f82bbca7a44d7840155674361d4:eyJzZWxlY3RlZExpbmVDb3VudCI6NDQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxZmUxMjYxYjA1NGUzZDE5ZDFjNWZmOTcyMzg2NDRkZGZlNGVjNzQ2MGYwMjNmNmZlZTA3MGM2ZDA0MzFjODAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc4NzU5MzZhZDg0ZTBlZTQxMTdmOGQ2NmQzNjE4MjA2MTBhZDAwMTM5M2Y3YTdkNWE4MjNmZjM4MDM1ZjBlNWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZhNzUyZjZmMDU4ODJhMGVlNzg0YzNhZWY1Y2ViMDZmNTg1ZmM2YWI2MzI3MDIwZTc1YjA4MTdmYjMzNDkwMmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM2NmVkODY5OTU0Zjg2OGM1NTRkODg5NDgxOTk5OWY0ODI5NjQ1M2E4MGFmYjMxOTkwYzU1Y2I0ZDA0ODZmYzgifQ"
},
{
"resource": "repo://TFMTests/ChatComposerStateTests.swift#L2268-L2328",
"version": "repo-lines-v1:sha256:ccca1326878280a11f0532679307a3e4e5508d97e205689a2ffbaffd1fef8f22:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEzYTZiMTA4ZmJkYTIyOTRkMjBjNmZiOWVmMzk2MDNiMTI3NzFhOTdmMzY2ODM5YWM3ZjUyNmExYWYxNGI3ZWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFjN2Q0MjFiMGIyZjI0ODZkYzk1NGU1OTBhY2JmZTA3OWIzOTMzZmFiMzFhZGFhYjdhNDlkNjVmNGFhOTA5MjMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYzZTlhMTY2N2Y2YWUwNzk1YmFiNTMyNzQ3Mzk0NWFiMmUyNzM0ZDdkNTUyZTJiNzBhNTU3MjZkYmRhMjlhZmYifQ"
}
]
},
{
"id": "claim_1980c8db4e9a4fa9ad04ec0bc310b025",
"statement": "A replacement message initially owns a same-ID completed staging run; the first real snapshot with that staged final user message transactionally reassigns only its row and sequence, retains attachments/replay backing, deletes staging and leaves historical replay owners unchanged. Staging orders after retained runs and supplies a start-time lower bound preserved on subsequent saves and terminal timestamps.",
"evidence": [
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L16-L121",
"version": "repo-lines-v1:sha256:c1a4a9f265c86d77937e83acae5e2b69a2523713431a89d470dad62099d6b376:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA2LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI3MmJiNmQ1NzgzMTJmNjJmZGQ3OWM4ODdhMGNjNmVkMDRjZDkwOTQwZjFhYWE3ZTlhNTAyMGVmNjkyOTFhOTU3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJkY2UzN2IzN2YwNGIxOGQwODk0NmFmYTY3M2UwYzIzNjcyMWEwMzkwNTQ2YjM4NTUyYzI0YWY3MDc4ZTdhYjMyIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlY2U5NjA2M2ViYmNhNjY1M2Q0YTYwYTViNjBjZWE4OTRkOTVmOWExNjQyZTQxNDEwMjFkNDZlNjQ4MjgyNGVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmNTcxZWY2ZjVlOTYzMTE4ZDM3MTdiNGQ4MmI0YjBiOTliMmI0OTI3NjYzNGFjNWZiNmZhMGE3ZTVjNDBlZjhjIn0"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L476-L503",
"version": "repo-lines-v1:sha256:c1a8d918c5409018d4549fe64ed7fe6080468331b1c24a04cd3bb17761a6272b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgwNzAyNmVmMjJiMzJkYmQ3OWY3NDc4ZDYzMTg3YTBjZDI4ODNjYjYyMTM4MmU3N2QzNGQyMjcyYTA3MzFlOTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE3NDM2MjdlZDk4ZTAyYjU3OGY1MjY5Yzc2MGVlNTg0ZWU1NDJjM2UzYzlhNDQwODkxY2QxNTE2MjVhNTlkZjciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjRlZjBlYzVlMTdjMGI5MTM2OTFhYzdjYWFiYmVkZjA1MDRiN2Q3YmUwMjBmOGZlZGMzOGQ4NTMzNzk2MjVjOGYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlkZjlmMzU1MjY2ZmFjMjQ4ZDgxZDMwMDc2YWY4YWRiODFjNDBjOTY3NjFkMWQ3MzQ5OGUxY2RmMDNlYWZlMmUifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L671-L688",
"version": "repo-lines-v1:sha256:9430ebe704cfe45e02e2a23637debf77c4d62d0849a7065c405e4b78d26bff00:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY0MDUyMDRhZTk4ZDM4NjdlMTNmYTU5Y2E0MTU4YmU1Y2FkMTMxODZiZTBiMzlhOTZmNTNkMGQ2YmZkNTZiZjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQwYTA4ZjYzZjc3MGZlNGQ4MDFjZmU5YmFmZTg3NjdhMTEzZWM3ZmE2Njg4ZjA1OGU1NTc0ZGJjYTNjMGIyZTMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFmNjMyY2Y1OTNjNzEzYzQwMjI0YzhkNGVhZjhmZWI2ZjUyMWMyNDIzYzRiMTVhYzVkYzFhODAzMGEwM2U3MWIifQ"
},
{
"resource": "repo://TFMTests/AgentPersistenceTests.swift#L1076-L1135",
"version": "repo-lines-v1:sha256:0f33e4023a498a0b07b9840bc6164aab10ee8ecf9af5c6a7b7c562e62cd3dd5f:eyJzZWxlY3RlZExpbmVDb3VudCI6NjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE0ZTAzOTdjN2QwYzg5OTg4NTkxYWFhZTZkZmZlNTdiNzI4NmYwODczNTYxMmRkOTc5M2FlYzJhNGYyZjU4MDAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJhZjRjZmQyZjMzYTRkZmMwMDJmZmE2MWVkMDg2ZWU0YWIzNWU3NjA1YTZhNGFlZmM5YTc5YTFkZTMyYzIwYzEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjEzNjFmOGZjOTJhNWE1NWNhNmJmYTI5ZDE5NDQ0MTQ5ZmIxMjZhNDRiOWUwZDMzMTExM2UxNzlkNjgwY2Y2NWIifQ"
}
]
},
{
"id": "claim_eb12b2d099c145dba48004e4797b19a7",
"statement": "Live run-started, captured-failure and preparation-interrupted paths adopt the staged replacement's real run provenance and chronology. Cancellation awaits save before adopting after an identity check, whereas missing-model/credential failure projects live before asynchronous save, so the end of preparation is not a durability barrier.",
"evidence": [
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L476-L534",
"version": "repo-lines-v1:sha256:435b7b43d6dfe28c7d197656e31af82f72b308168427674bccfeb12777d04735:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjYwZWU0MDJjOGFkMzY5M2YwZjFjNzY1MzZlZTk5OTVmZWMxYjkzNTBkNzU5YTVkOGUyMDY0YmRhYjRlN2Y1MzAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk1NTUyNmNmOWEwOGQ4Yzc1ZTA5ZThhMWZhMTIwODkxZmQ3MWEwMDNhMjkwY2U5ZTEzY2YwOWQ5NjRmYjkxYWUifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L719-L793",
"version": "repo-lines-v1:sha256:81156ef97d808d87d63a184f6020940cf4a5bbbdecd8dc55a2d3a3c7e7b0b60c:eyJzZWxlY3RlZExpbmVDb3VudCI6NzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2YjhlMjRkZDNlZmY5YzY3YTZiNzg3ZWMwMjA3ZmMxZTI0ZGMxZTcwZmRlZWViNmFjOTljOGFkNjA1Yzk3YmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2ODhmNzU3ODA1NDczNjk2N2U4NzY5MmJiYTg2YjI4MDhmMzI0MTk3NTQ0MDVlYmZkNmM0NWI3MTk4OWQ0NzQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRhNzdhMDY4Y2ZiMmUwMWRiMDJlMTAyZDRiODhhOWMzYWRlOTU3YTNhMWMzYjczOGE3ZTBjMWNmMTc5MTUwMjgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRjNmM3Y2RjOGM0ZWMwYmM5ZGU4ZTY5MThmYWUwYWE5ODQ0MTJiNDJjZTVjMzY5ZWExZTMzMjg0N2Y4ZjIyOWIifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L2040-L2092",
"version": "repo-lines-v1:sha256:d1a56a12b39372c0277e40115884e11b8c29d16d3df1e847c7407b89efbd1881:eyJzZWxlY3RlZExpbmVDb3VudCI6NTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVkOGQ3MGNkOTIxY2E1NTJmMGEwZWIxMGJhNzc3OWQ2OTk0M2RlZjUwY2NhNjQ5YjIyZTg2MzU3OTgyM2ExM2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU3YzRmZjVmY2EyMGUzODk0Zjc3ZmY2NDk0Y2FmNmVkZDU2NzFiZjE3N2YyMmVmMDE3NDBlNzNhMTYwMTc3OWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjlhZDUyYWNhNzhkODcxNDMzZjJhNzMzZGJmMDQ3MGNmYTZhNGEwZGQzM2IzY2IwYzgyMTJlODNkYTIxY2ExZmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJiNTdmZTYwMTUxZDJlN2IwYWNlZTEzOTJhYzI5OGUxYzBjOGE2OWRiMzlkNWU4OTllYzNkMzdkMTM4Njc3ZjMifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L2625-L2646",
"version": "repo-lines-v1:sha256:078528287f4cac7401a61342ac1db3154e36f5566407f8bb9332cd63c543e273:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdjZWUwZWU1M2M2NjUxODNlOTE0NjU5MDViZWY3ZDQyMTI0ZDRmM2JkYTJkNDg5MzlkNWIwNWQ1Yzc1MzIyODgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNmODMwOTk4YzhiZmMyY2EwMGQ0MGM5NDlmZTgxOTQ5ZmQwZDg4MTg1ZWUzOGNlMDNjMjAzNzg4MDZhZWQ4YWEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA2YzUyZmU0ZTgxMjIzMWU2NGIyMGFmODc0MmI0ZGJjZWNhMjlkMDFjMTVjYzk1NDNjYzc0ZGFhNDAzNjlkZGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJmZGI5NTg3M2IxNmNiMTEwMGJjNGVmMGZmYWFiMzZmODc1Y2EzYmVjODY2MmIwMDA5YzEwY2JlNWE2YWVjNTMifQ"
}
]
},
{
"id": "claim_56734480c5014ddf8eee4da01df5347b",
"statement": "Repository-instance retired IDs block late saves and tool events from edited target, removed later and adopted staging runs; truncation and snapshot-save errors roll back SwiftData changes and restore the previous retired-ID set.",
"evidence": [
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L156-L165",
"version": "repo-lines-v1:sha256:c887b3a1878d05b6825a0061c2a4ac62fa358fae324872204ffb83d6b940c2ed:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyYmI2ZDU3ODMxMmY2MmZkZDc5Yzg4N2EwY2M2ZWQwNGNkOTA5NDBmMWFhYTdlOWE1MDIwZWY2OTI5MWE5NTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ2MDIwMDcwNjJmOGU3MDc5ODNiZjBkYmI4ODMyMDYwMjZiMzM1ZGY5ODBmODNlZjQ0YWYzYjRjMWI3NDA0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcxMDIxY2E1Njc1M2E4ZWM0MDdkZjY5ZjhhNWM4ZGMwYmJiODEyOWE2MTQ1N2NjYWNhYTdjOGYwNzEyMWQ4NTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMwNzU5M2RmMjVjYjQxMmZiNWI3NWUwZWI3NWQ3NGM1ZWY0YjBhMzE1YmJlMWRmYjcwMTg4N2MwMjEyMGM1NjcifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L16-L121",
"version": "repo-lines-v1:sha256:c1a4a9f265c86d77937e83acae5e2b69a2523713431a89d470dad62099d6b376:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA2LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI3MmJiNmQ1NzgzMTJmNjJmZGQ3OWM4ODdhMGNjNmVkMDRjZDkwOTQwZjFhYWE3ZTlhNTAyMGVmNjkyOTFhOTU3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJkY2UzN2IzN2YwNGIxOGQwODk0NmFmYTY3M2UwYzIzNjcyMWEwMzkwNTQ2YjM4NTUyYzI0YWY3MDc4ZTdhYjMyIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlY2U5NjA2M2ViYmNhNjY1M2Q0YTYwYTViNjBjZWE4OTRkOTVmOWExNjQyZTQxNDEwMjFkNDZlNjQ4MjgyNGVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmNTcxZWY2ZjVlOTYzMTE4ZDM3MTdiNGQ4MmI0YjBiOTliMmI0OTI3NjYzNGFjNWZiNmZhMGE3ZTVjNDBlZjhjIn0"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L443-L451",
"version": "repo-lines-v1:sha256:30e4b2269fdafb0b95f119cd557ef5b625420f3ef1dab432701fb54521508e92:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMWJiOTAwN2E3ZTAwNDcwMjE5MWJjNGJiYzcyN2RkODJmMGM0NTE3N2ZhODY0OTU1YjMyYzA5NWFkOGMxYjVlMSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMThkODhkZDM2NTI2NGYyYjVlZGNmYjM5NDBmMzg2Mzk1MGI2ZDRkYWJhOWY3NDc4ZjM5MzA1ZGRmZTM5MGY0NiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMDdmMTAyMGM1YzI5MDdiZWJiM2Q0NTFlMjdjNzE3NjE1ZDNiMWNiNWU5ZjM2ZDM4Y2ZjMThmNWNhOTI1MDRhNSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNTQ0NDYwZGEwZGZkMWMxYzZhYzc4YTAwYTRjN2NmNzAwYTc2OGE5NjE2NzI2Y2M2NTdkYTMyMjhlZDQxOTc2YiJ9"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L504-L516",
"version": "repo-lines-v1:sha256:f5fa05397f6c5f103da1b22e51552d54d9f197d9f1cd73b34142a57e11b9d9cd:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYxZjE3YzM4MDE4ZjhkMDliMDEwMWYzMDI4ZTlmZDk1MGJmZWVhMjljYjAzMTkxYWVlNDNlNzBmODU2MTViMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZhZGUyYTZhM2JkNmI1M2Q1MWI3ZGZjMzk1MjQ2MDBiM2I0ZDQ2OGMzMWM1Y2ZjNWM5MThiNjgyMDExOGY0ZjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM0Y2FmM2FiYTk4ODdmMWYwNWQ0OTgyM2ViOGQwNWE3YjhhMDkwMzhlNDQxNWE2ZmYzMDg3ZDQxZWRhOTQ2YWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjI2ZjkxNzkxMGMyOWI0MDdmMThlZjI1MDJiNmU1NWE5NDc1M2NlYjVhNDIyMzY0NDUwODgyODBiZjg2M2E1YzUifQ"
}
]
}
],
"verification": {
"by": "openwiki/0.5.2",
"at": "2026-09-23T02:40:53.789Z"
"at": "2026-09-23T03:40:50.823Z"
}
}
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"pageVersion": "sha256:1235c885f381c01020d2218636f500707c8fc6b3b1e8e4fbd712336ef4deb064",
"pageVersion": "sha256:6f9cbf0a3aa5fea9637709e225bee6cf28af7cdf172609b3c903f75bade148b7",
"claims": [
{
"id": "claim_e50b505da2214c6781fa8eb1a146dacf",
@@ -199,15 +199,15 @@
"version": "repo-lines-v1:sha256:da292992815fff9efe5274ba635a38f9c4189246f1737ba3ca30ef3208ab7ad7:eyJzZWxlY3RlZExpbmVDb3VudCI6NTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcxMjIxN2Y4MzliNTcyYmE2ZWI3ODA3YTNkMDZkODBjMmFhNTA0NzU1MDUxZTlhMWQ3MTk5YjJlZmNiN2FhMmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVmNjA3ODI4ZDQxZDU5YjhjM2Y0YmZmOWQ0ZWQyZDRkODYyMzRlOGZmOGE4M2U5OTQ4OGYyMjhjNWQzMzMzZWEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjliZWQ2YWM2NjQyZTQ4OWUxY2Y0NmNiY2EzNjhmYTg0MzM2OWYzYzgxNGYzMDZlM2RjMGRiMjQ0M2VjYjY0MWYifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L550-L605",
"version": "repo-lines-v1:sha256:6aa3a9f8b2bd8335e17c386f68b91564551f30ee25e239ae960ae032ef4f90fd:eyJzZWxlY3RlZExpbmVDb3VudCI6NTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAzNzE0ODNiZmQ5OGM1MGM5NDg5ODlmOWEwNTJjMzI1MGUzNzMyYTczYTc2MGY1ZDJhN2I2MjFhNTJhNmUzYjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNiYjUzMTU2YTNkYjA5MDdmY2I4NDEwNjJjNjc5NjdiMzMwY2I5NTk1ZjViNWEzM2I4ZWVmNTZjZTVlMzczZjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMyZTEzMDIxNmFiMTA4MGE5ZWZiY2Q1NGIzMDdiNDk0ODU2YTUzMTYxNDc2Y2Y4ZWNjZGM0YTYxYzk3NWVlMTIifQ"
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L16-L121",
"version": "repo-lines-v1:sha256:c1a4a9f265c86d77937e83acae5e2b69a2523713431a89d470dad62099d6b376:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA2LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI3MmJiNmQ1NzgzMTJmNjJmZGQ3OWM4ODdhMGNjNmVkMDRjZDkwOTQwZjFhYWE3ZTlhNTAyMGVmNjkyOTFhOTU3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJkY2UzN2IzN2YwNGIxOGQwODk0NmFmYTY3M2UwYzIzNjcyMWEwMzkwNTQ2YjM4NTUyYzI0YWY3MDc4ZTdhYjMyIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlY2U5NjA2M2ViYmNhNjY1M2Q0YTYwYTViNjBjZWE4OTRkOTVmOWExNjQyZTQxNDEwMjFkNDZlNjQ4MjgyNGVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmNTcxZWY2ZjVlOTYzMTE4ZDM3MTdiNGQ4MmI0YjBiOTliMmI0OTI3NjYzNGFjNWZiNmZhMGE3ZTVjNDBlZjhjIn0"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L6-L75",
"version": "repo-lines-v1:sha256:d6a55a5ac83894bc6f31facb7b9ec18a1aa3d1c286a07c6868034542f73c54f2:eyJzZWxlY3RlZExpbmVDb3VudCI6NzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkzNzE0OTM1NDEzMWZlZDcyNmU1MTA3MDQ0NjQzM2M5YzczMGY2MWQ5MWJlZmY1MDY4OTYzZTI2NjhkZThjYTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE3ZmIwOGJmYjIyNTk4ZmJiOWM0NTgyNjRmM2MxYzZiMDA2MTY4YjY5MTY2MmJjNTBhZTVjYzVlMjg2ZDU2ZmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE4NjBhNzU1MzgyZWFiYWMzMmM1MTBkNmYwNjU1ZjIxMWJmYjM4MzA4YzZjMzU5YTdkNzk0YzM1NmRiNmNkYzQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkwODY1Mjc5OWI1MWU3OWUxYTg3OTZlZDMzNDM5ZDVmNTEwNTYzYjA5ODY1ZDgyOGJjYTFiZDMwYTY3MThmYmEifQ"
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L746-L786",
"version": "repo-lines-v1:sha256:0bbf3410aaea40a96735687ffa5a11a929afa27945aae74e81a0b4f54512d7bf:eyJzZWxlY3RlZExpbmVDb3VudCI6NDEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYzMDUyZGM5NmZhZDk0ODE0NjNkNjcyNzYyOTZkNzk1Y2Q1ZTAyODJmZmNkMDAzNzAxZTEyMzcwMjM3Mzk3NDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjljMjdkYzQ2OTBhZmJjZmM5NjgxOGIyYWZkNDY4ZjkwOGUyNDBhYTgwZWEzZWYwZjcyYjM2ZjNhOThjYTUyNjgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ5ODY4MDg2NjZjMjE5ZjM3Y2M3MzlhZGRlOWQ4NjBmZDIxNWRkNDc4MDU1OWI4ZWFkMzlkN2Y4ODFhYjI2ZDMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNiZTE1OGU4OWZkYzM4OTc0NzZhMGZmYTc2NjE0MmUxNGNkYjIyMTNjYjIzMmQwYTEzMGU3NTlhNWM3ZDllNGUifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L671-L683",
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L853-L865",
"version": "repo-lines-v1:sha256:f142043bb1b01de9a0458b3995239712303b9ee5f7cd1bc4531d3ee6da2913f1:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ5NGQ4ZDkyN2FkMTU0ZTM2ZmFhZjZiMmI2MjMxZDllN2Q2MzRiY2IzZTliMjI2MzA4ZmJhMGVkOWQ3MDY0NjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZmMGQ3NTk1MGRmMGZmOWEzZWU5NjYzOWRjYzhmZjVlYWVkYjQwZDY4MmJlYTkyNjIyYjUyMGRkODg3ZDkzZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
}
]
@@ -321,10 +321,116 @@
"version": "repo-lines-v1:sha256:a89d5d90ca621038753469ce401c92c24921c2515141ca78fc72195b90062176:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNDM0ZmQzMmQzZjgwNTA3MTc4NmY5MjIwMGZhMDhjOWZjMWRkZmRkZTk4ZDk0MjkyMzZhYTkwNDcwYjA1MTkwZiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMTllNzYzNTVjZjExOTk0ODBjM2Y5OTgzNmIxNDg2Yzg0MWQ4OTFmYWFkOTA0YzYwOGUwOTMwMjJkMzc1N2FlZSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYzkzMmI2ZmJjYTcwYzM4M2RmM2Q5OWNhMjEyODM0ZTIzMmE2NzFhYWVjOGFmOTM1YjZiMWUwNjFhZTRhY2U1OCJ9"
}
]
},
{
"id": "claim_da4a4d45226a486b9d742042ac641b6c",
"statement": "Assistant restore and truncation share canonical run start/UUID and message run/sequence/time/role/UUID order. Truncation validates before mutation, removes the target message and suffix plus later runs, and preserves a same-run prefix with a neutral completed summary ending at its last retained non-tool message.",
"evidence": [
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L214-L229",
"version": "repo-lines-v1:sha256:bf0a95952f58864d9e6156cdff6e8a1b8ba739ec591ea780cd43f2922ba6f493:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjViMWM2ZTBhOTU1MmUxOGZjODUyZjU3MjhkM2ZiOTkyY2Q0MDY4NmU1ZmI5MzdhZTk2NGMzZTcyMmMxNTZjM2QiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjNmY3Mjg3ZjAwYjYzYTNhZTEzMDA1YTU2MmI1OTg2MjNhNzMyY2QyNDM1YTUzOWZkYzk3NzU1NDVlOWI0NjYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImFjZDFmZWMzYjNhNjkyNmFmMWE2MWU0OGYwNmQ5MDViMzk5Nzg4MGU0YTk4ZWQ1OGI0NDdiYmIxN2NlMmE1NzAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ4NTkxZTdiMmE2ZTc2MzhiZThhNzA0YTI5MmNlYzZjM2E3ZWViNDE2NzMzZjRkYTM2ZDEzOTcxNjA4NzIyMjMifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L398-L468",
"version": "repo-lines-v1:sha256:e172abbe510013e60b30792072b63805778cdff71e214aa3a350786a1e97e53d:eyJzZWxlY3RlZExpbmVDb3VudCI6NzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1MjJjNDJjZDE5YzZkMDNkODA4YzQ1MjcyMDU1MjgyNWI3ZWExYzViNDkxYjIxODUxMWNhYzc0MTVjZjlkOWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg0OTJmYjhlNzg0OTUwYzYxMWY1ZjY0NmY4NTcwNjIxMzQwMWViMDM3NmYyNDExNzdhN2E1NDgwMjlhODYxMWIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImEwOTdmNmQ1MGQ5NjQ1ZTYyY2E4OWQ5ZDUxMmEzZTg3ZmJhOGQ3OTNlNGQyOTY3OWE1ZmYyZGI0MzNhZTZmOWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjVlNmFlN2MzOThiOGNmNDc4NjJmODRjZWJiZjQ1NjIzMjA5NWQ4OWEyMGU0NWJlNDE0MDg4YzVlOWQ2NjMwYjEifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L690-L713",
"version": "repo-lines-v1:sha256:487650c28b9099463e7bfa7834c959b0cf74fc3d13d1b1961ff07461c20fe72d:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNmMDAxZTQ3OTg4NTAxYjJjMTQ3YmI0ODRlN2FiMWFkMTJhODcwM2JlZTA2MGJkOTdkNWM4Yzg3YjMwNGYxZjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjIwZmIwMDQ2MGVkM2FlMTI3MTgwYzExMDE3YzE3ZDYwMTAwNWM2MmFiMDVjOTFjYzZhYzk0OGRiOTAxMTE2YzQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdkM2E0OWNiYWFhZmQzZTYxYzdlNGZhZWU4NzViNGQ0ZjBlMzA2NzAxMzM2ZmNiNTI0MTMyMjJhOTk2MTU0YjYifQ"
}
]
},
{
"id": "claim_9650e27cbdde419f9b8ba9bda9cbf0d7",
"statement": "Partial-run graph cleanup prioritizes source-message then call ownership before an inclusive unknown-ownership timestamp fallback that also covers modern provider-native events preceding their source-message snapshot, deletes associated result/review and message backing rows, and prunes only compactions with removed explicit boundaries. Restore infers legacy sources and recovered result ownership before compaction projection.",
"evidence": [
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L265-L300",
"version": "repo-lines-v1:sha256:18f9323794aa82ed081c01504f42cbadf30f212d167e36843b0c25b5bf4e037c:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEwMGY1NTMxZTgyMjQzZmE5YTUxMTljZjRhYmQ2YTFlNmMyODM4ZmJmOGY2MThkYzFmNzk0OGE2NmU1M2U0YmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZlMWU1OGJiYjE1OGJmM2Y1NmU4NDU2NTFkOWYzMmNiNGQwNzY1ODE5ZWE0YjBlYjc4MWE2NWE4Njk2YjQ2N2MiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc1ZWM1NjU4Y2ViYTY5NzExNGJjZmQwMWExOWI0OWZhNDY0YjZmMDk3MjFiNWJjYzExZGRhM2VkOWU4MGRhY2MiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA1ZjY4M2EzYWQ3ZTNiMmY1M2NiYjYzMzc0ZGEzYTBlZGI1ODAzNjM4MTA3N2VlOTMzNjg4OTJlMWU1NDcyYWQifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L470-L474",
"version": "repo-lines-v1:sha256:ac6200348d5fa872e89fa89195d9ad6b850dfc7436542e8a1198c7e6d86b55df:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiY2M0M2FjMWM4MjNhNWQ0MDM2OThiODE1MTI4MDNiNDdlYmE3NzE3YjgwYWZjNjM5MjkxNDkxMGI4OGY1MzE4YyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNGEyYjlmNjUyOWJlMmNiYjFkYWNmMDA0ZGI5ZWIwNjU2N2ZiYmI2MTE3ZjQ4Y2U2N2ZjMmU0NjZiM2M0NWRjNyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYzRmZTllNWZiZmYzNjljMGQ4MjMzNmUwMDU0YWIyYzg3NmE4MGQ3ZWFlNjM0NWQ4ODIwMDRiODJhNzlkOTFhOCJ9"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L633-L669",
"version": "repo-lines-v1:sha256:00ed4f8e4c2bab3bf461e4171d9fdcbef3414b107c82c5bd771cdf8ab34b18b3:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1ZDcxNzk4OTdjOGViNTc4NjU2NWY0M2E1Nzk1M2I3OTkzYzUwM2ViYjM0YjllOWUwMmU3MzFjYzY4OGJiNmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVjNWUzYWMwNGVhMDg0ZjQ4ZGJhMDY5MjhiNjUxOWQ1OTI3MzE4YzhlZjc2ZTMyNmE0NDc5MWFiOWE0ZWU3NzYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE3NDJmODZmOTJlMzg5MTljZjQzOGQ5MjdlYTUwZDMyZDkwMjljZjgxOGJmYTFkNWYzYWZiYTk1NGQxMmNlNzMifQ"
},
{
"resource": "repo://TFMTests/AgentPersistenceTests.swift#L972-L1015",
"version": "repo-lines-v1:sha256:a4c0ef3257d9a4c53b2a8cac0f20fd52f9bf2f82bbca7a44d7840155674361d4:eyJzZWxlY3RlZExpbmVDb3VudCI6NDQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxZmUxMjYxYjA1NGUzZDE5ZDFjNWZmOTcyMzg2NDRkZGZlNGVjNzQ2MGYwMjNmNmZlZTA3MGM2ZDA0MzFjODAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc4NzU5MzZhZDg0ZTBlZTQxMTdmOGQ2NmQzNjE4MjA2MTBhZDAwMTM5M2Y3YTdkNWE4MjNmZjM4MDM1ZjBlNWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZhNzUyZjZmMDU4ODJhMGVlNzg0YzNhZWY1Y2ViMDZmNTg1ZmM2YWI2MzI3MDIwZTc1YjA4MTdmYjMzNDkwMmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM2NmVkODY5OTU0Zjg2OGM1NTRkODg5NDgxOTk5OWY0ODI5NjQ1M2E4MGFmYjMxOTkwYzU1Y2I0ZDA0ODZmYzgifQ"
}
]
},
{
"id": "claim_cafd574718084c48b15cfd901883e8e9",
"statement": "An edited replacement is stored in a same-ID completed staging run ordered after all retained runs; its first real snapshot transactionally adopts only that message's run/sequence, retains replay/attachment backing, deletes staging and preserves ordinary historical owners. Failed/interrupted snapshots share the adoption path, and subsequent saves retain the adopted chronological lower bound.",
"evidence": [
{
"resource": "repo://FrameworkTests/AgentReplayPersistenceTests.swift#L71-L112",
"version": "repo-lines-v1:sha256:081bbe5beeb6834585986890a850825852d4c0e5010dcce28caea70d9a958c8d:eyJzZWxlY3RlZExpbmVDb3VudCI6NDIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkyMmZhOTY2Mzk0NWFiMDAxZWNjMWQ4NDY0NzE4OGYwZmZkZDlhNjM3MGEzMWEyOTBiMDlhYWI1NzcxNmY4YWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE3YTJiYWYxMjA1ZDE2OTUzOGVjMWE5MTljMTg2NTc2N2M4YzJkMDg1NmQzOTJlM2RmZDhhNjIwYjQ0OTdjNGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY3MzE2YzY1YWJjMWM2NmY5MWYzZjM4NWM3OTNkMjEzMjNlYjk3ZTkxZjNiNGVmYWI0OTNjMGE4YmY1YzUzZGIifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L16-L121",
"version": "repo-lines-v1:sha256:c1a4a9f265c86d77937e83acae5e2b69a2523713431a89d470dad62099d6b376:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA2LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI3MmJiNmQ1NzgzMTJmNjJmZGQ3OWM4ODdhMGNjNmVkMDRjZDkwOTQwZjFhYWE3ZTlhNTAyMGVmNjkyOTFhOTU3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJkY2UzN2IzN2YwNGIxOGQwODk0NmFmYTY3M2UwYzIzNjcyMWEwMzkwNTQ2YjM4NTUyYzI0YWY3MDc4ZTdhYjMyIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlY2U5NjA2M2ViYmNhNjY1M2Q0YTYwYTViNjBjZWE4OTRkOTVmOWExNjQyZTQxNDEwMjFkNDZlNjQ4MjgyNGVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmNTcxZWY2ZjVlOTYzMTE4ZDM3MTdiNGQ4MmI0YjBiOTliMmI0OTI3NjYzNGFjNWZiNmZhMGE3ZTVjNDBlZjhjIn0"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L476-L503",
"version": "repo-lines-v1:sha256:c1a8d918c5409018d4549fe64ed7fe6080468331b1c24a04cd3bb17761a6272b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgwNzAyNmVmMjJiMzJkYmQ3OWY3NDc4ZDYzMTg3YTBjZDI4ODNjYjYyMTM4MmU3N2QzNGQyMjcyYTA3MzFlOTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE3NDM2MjdlZDk4ZTAyYjU3OGY1MjY5Yzc2MGVlNTg0ZWU1NDJjM2UzYzlhNDQwODkxY2QxNTE2MjVhNTlkZjciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjRlZjBlYzVlMTdjMGI5MTM2OTFhYzdjYWFiYmVkZjA1MDRiN2Q3YmUwMjBmOGZlZGMzOGQ4NTMzNzk2MjVjOGYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlkZjlmMzU1MjY2ZmFjMjQ4ZDgxZDMwMDc2YWY4YWRiODFjNDBjOTY3NjFkMWQ3MzQ5OGUxY2RmMDNlYWZlMmUifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L671-L688",
"version": "repo-lines-v1:sha256:9430ebe704cfe45e02e2a23637debf77c4d62d0849a7065c405e4b78d26bff00:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY0MDUyMDRhZTk4ZDM4NjdlMTNmYTU5Y2E0MTU4YmU1Y2FkMTMxODZiZTBiMzlhOTZmNTNkMGQ2YmZkNTZiZjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQwYTA4ZjYzZjc3MGZlNGQ4MDFjZmU5YmFmZTg3NjdhMTEzZWM3ZmE2Njg4ZjA1OGU1NTc0ZGJjYTNjMGIyZTMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFmNjMyY2Y1OTNjNzEzYzQwMjI0YzhkNGVhZjhmZWI2ZjUyMWMyNDIzYzRiMTVhYzVkYzFhODAzMGEwM2U3MWIifQ"
}
]
},
{
"id": "claim_19d50bbe64434f3bbc06c0abae0e1ef0",
"statement": "Edited target, removed later and adopted staging runs are retired within the repository instance; late snapshots/events are ignored. Truncation and snapshot save roll back SwiftData and restore the prior in-memory retired-ID set on errors, without adding persisted tombstones.",
"evidence": [
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L156-L165",
"version": "repo-lines-v1:sha256:c887b3a1878d05b6825a0061c2a4ac62fa358fae324872204ffb83d6b940c2ed:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyYmI2ZDU3ODMxMmY2MmZkZDc5Yzg4N2EwY2M2ZWQwNGNkOTA5NDBmMWFhYTdlOWE1MDIwZWY2OTI5MWE5NTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ2MDIwMDcwNjJmOGU3MDc5ODNiZjBkYmI4ODMyMDYwMjZiMzM1ZGY5ODBmODNlZjQ0YWYzYjRjMWI3NDA0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcxMDIxY2E1Njc1M2E4ZWM0MDdkZjY5ZjhhNWM4ZGMwYmJiODEyOWE2MTQ1N2NjYWNhYTdjOGYwNzEyMWQ4NTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMwNzU5M2RmMjVjYjQxMmZiNWI3NWUwZWI3NWQ3NGM1ZWY0YjBhMzE1YmJlMWRmYjcwMTg4N2MwMjEyMGM1NjcifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L443-L450",
"version": "repo-lines-v1:sha256:ac80ea14eb69afa592a1e4e5c065857c6f79fb565723f8272ad51d7de5f79865:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMWJiOTAwN2E3ZTAwNDcwMjE5MWJjNGJiYzcyN2RkODJmMGM0NTE3N2ZhODY0OTU1YjMyYzA5NWFkOGMxYjVlMSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiOGMzMDJiOTM5ZDRkZjk3Yzg4YzkxMDE0ZmRmNjRkMTI2M2I2ODEzYTYxYjhhNThlNjBjYzM0MzRkZDM4NDg0NCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMDdmMTAyMGM1YzI5MDdiZWJiM2Q0NTFlMjdjNzE3NjE1ZDNiMWNiNWU5ZjM2ZDM4Y2ZjMThmNWNhOTI1MDRhNSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDhhZTFlYzI0ZTJkZDEwY2Y0Yjc5ZDRjNzUyODNhNzkxZTMxNjI0ZTRkYzQ2NmRlNzAwYzAwYmI3ODEwMzA0NyJ9"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L504-L516",
"version": "repo-lines-v1:sha256:f5fa05397f6c5f103da1b22e51552d54d9f197d9f1cd73b34142a57e11b9d9cd:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYxZjE3YzM4MDE4ZjhkMDliMDEwMWYzMDI4ZTlmZDk1MGJmZWVhMjljYjAzMTkxYWVlNDNlNzBmODU2MTViMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZhZGUyYTZhM2JkNmI1M2Q1MWI3ZGZjMzk1MjQ2MDBiM2I0ZDQ2OGMzMWM1Y2ZjNWM5MThiNjgyMDExOGY0ZjkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM0Y2FmM2FiYTk4ODdmMWYwNWQ0OTgyM2ViOGQwNWE3YjhhMDkwMzhlNDQxNWE2ZmYzMDg3ZDQxZWRhOTQ2YWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjI2ZjkxNzkxMGMyOWI0MDdmMThlZjI1MDJiNmU1NWE5NDc1M2NlYjVhNDIyMzY0NDUwODgyODBiZjg2M2E1YzUifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L6-L24",
"version": "repo-lines-v1:sha256:892b2744f0e5c8d0f42d21afaff71c62cb2d48bf0ccdb614593ec779a826ae65:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkzNzE0OTM1NDEzMWZlZDcyNmU1MTA3MDQ0NjQzM2M5YzczMGY2MWQ5MWJlZmY1MDY4OTYzZTI2NjhkZThjYTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFjMjU4YjdiNGY1YjRhZjg4NjE4ZDI4NGJkODg1Y2VmYzNiMmQxOWRhMTk5OTlmN2ExNDI0YmQxMDliMjNjZjMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE4NjBhNzU1MzgyZWFiYWMzMmM1MTBkNmYwNjU1ZjIxMWJmYjM4MzA4YzZjMzU5YTdkNzk0YzM1NmRiNmNkYzQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIyNTlhZmUxOWRiYmEzYWM5ZDQ2ZjRmNGNlMmU0MzM5N2YzZTQ0ZjYyYTQ4NmQ2ZGNlODcxZGQ0YjQ1N2JiODMifQ"
},
{
"resource": "repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift#L90-L121",
"version": "repo-lines-v1:sha256:f2273d4756ab02a62dc182fe44d4409246cd7c58e706cb74cf8dfdb820a99c9c:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjExZWJkNzZiM2QyNjMxNTM3MzYzZmEzODEwMjI3MjEzOTJjZmYwZDI1YWNkMzJiNDQyYzA4MWQ4OGI3NDBjMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRjZTM3YjM3ZjA0YjE4ZDA4OTQ2YWZhNjczZTBjMjM2NzIxYTAzOTA1NDZiMzg1NTJjMjRhZjcwNzhlN2FiMzIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRjM2U2ZTI3ZjQ1YTQwZjU2ZmU1YjRiMjNlZjQ0ODQ3NjMyZTJhZTIzZTk5ZGQ1YjZkNWIxNTA0OTMxMmZhZWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY1NzFlZjZmNWU5NjMxMThkMzcxN2I0ZDgyYjRiMGI5OWIyYjQ5Mjc2NjM0YWM1ZmI2ZmEwYTdlNWM0MGVmOGMifQ"
}
]
},
{
"id": "claim_b0b5b4708fda4de6bcc5775728746d34",
"statement": "Application history mutation publishes only after truncation commits, but captured missing-model/credential failure still projects live before a separate asynchronous save; live failed/interrupted adoption therefore does not turn preparation completion into a universal persistence barrier.",
"evidence": [
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift#L129-L147",
"version": "repo-lines-v1:sha256:45383d212fb6991f01b24f3ea84538b0f619b50ed950673b4c79037e4de1652d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU3ODhmN2QzZWVhNGY0NTY0NzdmM2QwMjliNTAzZDI5YmU4YjExOTNiNjJjZTZlOWMzZTk5ZDQ1NDczMjViNDYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4MzBkMzQxYjc5NmIyZjQyNTk4YTk3M2UwMTJkOGIyZTZjNTE2MDkwYzliMDQ0YWMwZDhkYTIyZjU2MzI4MzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L719-L793",
"version": "repo-lines-v1:sha256:81156ef97d808d87d63a184f6020940cf4a5bbbdecd8dc55a2d3a3c7e7b0b60c:eyJzZWxlY3RlZExpbmVDb3VudCI6NzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2YjhlMjRkZDNlZmY5YzY3YTZiNzg3ZWMwMjA3ZmMxZTI0ZGMxZTcwZmRlZWViNmFjOTljOGFkNjA1Yzk3YmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2ODhmNzU3ODA1NDczNjk2N2U4NzY5MmJiYTg2YjI4MDhmMzI0MTk3NTQ0MDVlYmZkNmM0NWI3MTk4OWQ0NzQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRhNzdhMDY4Y2ZiMmUwMWRiMDJlMTAyZDRiODhhOWMzYWRlOTU3YTNhMWMzYjczOGE3ZTBjMWNmMTc5MTUwMjgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRjNmM3Y2RjOGM0ZWMwYmM5ZGU4ZTY5MThmYWUwYWE5ODQ0MTJiNDJjZTVjMzY5ZWExZTMzMjg0N2Y4ZjIyOWIifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L2040-L2092",
"version": "repo-lines-v1:sha256:d1a56a12b39372c0277e40115884e11b8c29d16d3df1e847c7407b89efbd1881:eyJzZWxlY3RlZExpbmVDb3VudCI6NTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVkOGQ3MGNkOTIxY2E1NTJmMGEwZWIxMGJhNzc3OWQ2OTk0M2RlZjUwY2NhNjQ5YjIyZTg2MzU3OTgyM2ExM2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU3YzRmZjVmY2EyMGUzODk0Zjc3ZmY2NDk0Y2FmNmVkZDU2NzFiZjE3N2YyMmVmMDE3NDBlNzNhMTYwMTc3OWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjlhZDUyYWNhNzhkODcxNDMzZjJhNzMzZGJmMDQ3MGNmYTZhNGEwZGQzM2IzY2IwYzgyMTJlODNkYTIxY2ExZmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJiNTdmZTYwMTUxZDJlN2IwYWNlZTEzOTJhYzI5OGUxYzBjOGE2OWRiMzlkNWU4OTllYzNkMzdkMTM4Njc3ZjMifQ"
}
]
}
],
"verification": {
"by": "openwiki/0.5.2",
"at": "2026-09-23T00:14:42.075Z"
"at": "2026-09-23T03:40:50.823Z"
}
}
@@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"pageVersion": "sha256:57c765ca650c5a286d85e4b4740dbd3e17d8d481a2fbdae60324abe952962271",
"pageVersion": "sha256:a1bfef0a62680b258aa4a9db1d84956798dfe6deb3c50df7c2aa29ba2ffa6ebb",
"claims": [
{
"id": "claim_b7fbd64158554b8b8ca80a0a613b3bc3",
@@ -159,12 +159,8 @@
"statement": "Agent replay persistence tests verify frozen context/tool-result restoration, prevent replay-row duplication across later snapshots, remove replay backing on conversation deletion, and preserve a durable result recorded before the next snapshot.",
"evidence": [
{
"resource": "repo://FrameworkTests/AgentReplayPersistenceTests.swift#L12-L64",
"version": "repo-lines-v1:sha256:1d91c37540c7dea05756c281709cc014a95b0723c78284b8a979570f6e9ea3d6:eyJzZWxlY3RlZExpbmVDb3VudCI6NTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBiNTFmNjI3NGQ5NDk5MTAwOGM3NzI0OTMwMmZhOGQ5NjcxZDE5NmExOTk5MzdmOWM1ZDhmZDk1M2UzYmY0YjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJkYmFkZWE5NTg5OGQxNzlkNmY2NjRlMmZhYWU2ZjkxY2YxYmZlNDc3ZTRkNjAxMjBiOWU3NTFiZDNiOGIyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY3MzE2YzY1YWJjMWM2NmY5MWYzZjM4NWM3OTNkMjEzMjNlYjk3ZTkxZjNiNGVmYWI0OTNjMGE4YmY1YzUzZGIifQ"
},
{
"resource": "repo://FrameworkTests/AgentReplayPersistenceTests.swift#L66-L93",
"version": "repo-lines-v1:sha256:a7a6a69692b66acfabab87d67d6cdce42517ed039c7a5aca47c32a120bac565c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI5YzY1ZTM1MTNlYmM3YzUxNTU2ZTY5N2M1ZmM1OWQ4NzQ0M2Q0MTEwOWEzYzcxNWE1N2Q5ODQ5YzEyZWI3ODciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
"resource": "repo://FrameworkTests/AgentReplayPersistenceTests.swift#L12-L69",
"version": "repo-lines-v1:sha256:5f1da27d6edf07122f88fab1e06ba2ca7c5d2e2f42a474ed81a99a27bef44804:eyJzZWxlY3RlZExpbmVDb3VudCI6NTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBiNTFmNjI3NGQ5NDk5MTAwOGM3NzI0OTMwMmZhOGQ5NjcxZDE5NmExOTk5MzdmOWM1ZDhmZDk1M2UzYmY0YjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJkYmFkZWE5NTg5OGQxNzlkNmY2NjRlMmZhYWU2ZjkxY2YxYmZlNDc3ZTRkNjAxMjBiOWU3NTFiZDNiOGIyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE3MzgwYmYzNGNkYmJjNGVmODdiMWZhMTc2NWNiYTY1OTFiZGJmODk4ZDAzOGNkNmY2MDg5YTAxYzUxNGU3MzEifQ"
}
]
},
@@ -235,10 +231,88 @@
"version": "repo-file-v1:sha256:fb1177900e93b9a2d3f30d4b728e61381d7d1336226ac22610e85779b8d0dadc"
}
]
},
{
"id": "claim_3b969ef21d1f4b9a9a5de6d84cf1daed",
"statement": "The same-run SwiftData edit regression uses equal timestamps, reversed UUIDs, compacted production restoration, legacy and unknown tool ownership, backing-row counts, staging adoption and late-write attempts; the empty-run regression separately proves live/restored ordering when the replacement clock moves backward.",
"evidence": [
{
"resource": "repo://TFMTests/AgentPersistenceTests.swift#L1076-L1129",
"version": "repo-lines-v1:sha256:efe03eb3ded07d84ffe8704f6ed27d9afb9bb2bfb21c8f53d5fbfa2c747a6552:eyJzZWxlY3RlZExpbmVDb3VudCI6NTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJhZjRjZmQyZjMzYTRkZmMwMDJmZmE2MWVkMDg2ZWU0YWIzNWU3NjA1YTZhNGFlZmM5YTc5YTFkZTMyYzIwYzEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImFmZjBkMGU1OWU0ZjE1YTE3NTI4Njg1NTE2MjkxZDVlNTM3N2ZjZjVmMTIyNmM1Y2U3NjVmZWM5YzM4YWU1YTYifQ"
},
{
"resource": "repo://TFMTests/AgentPersistenceTests.swift#L872-L1074",
"version": "repo-lines-v1:sha256:2a68be1f9c455cfee76bc0c6c557a1d8af1bf909f951786b861e71498a31b67e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAzLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIxYzlhMjg4MzM2YWFlNTM2ZWUyNDBiMGZjMGU5MTI5YzMwYmYzZGZiNmJiNWQwYzI1YThlNTk3ODk2N2Y1Y2Y3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlOGVhZjNlMWRiMjg0ZjZhNmZkNGUwNjZhZTJmYjY1NGFlNjhmZGZjZjNlN2U0ZGNhNGMyZGQyMTRhNDliOWQwIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI5ZDAxODMwNWY5YTk2MzdiODgxYTY4ZWZlZjM3OGU0NTdhMDkxYWExMmIwYzQ2ZmYzZDVmYjgzN2RkOTE1ZGY2In0"
}
]
},
{
"id": "claim_9334c68e96f0408a9c627c888cd2c1aa",
"statement": "Failed/interrupted staging-adoption tests verify one real message/run/replay graph and restore provenance, state, failure and frozen context from a new ModelContext and repository over the same in-memory container rather than proving disk relaunch.",
"evidence": [
{
"resource": "repo://FrameworkTests/AgentReplayPersistenceTests.swift#L71-L112",
"version": "repo-lines-v1:sha256:081bbe5beeb6834585986890a850825852d4c0e5010dcce28caea70d9a958c8d:eyJzZWxlY3RlZExpbmVDb3VudCI6NDIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkyMmZhOTY2Mzk0NWFiMDAxZWNjMWQ4NDY0NzE4OGYwZmZkZDlhNjM3MGEzMWEyOTBiMDlhYWI1NzcxNmY4YWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE3YTJiYWYxMjA1ZDE2OTUzOGVjMWE5MTljMTg2NTc2N2M4YzJkMDg1NmQzOTJlM2RmZDhhNjIwYjQ0OTdjNGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY3MzE2YzY1YWJjMWM2NmY5MWYzZjM4NWM3OTNkMjEzMjNlYjk3ZTkxZjNiNGVmYWI0OTNjMGE4YmY1YzUzZGIifQ"
}
]
},
{
"id": "claim_c9d1bfa40a4f4aa7b0a058a3fbfed8e2",
"statement": "Composer regression covers compacted same-run display-prefix, tool, title, plan, compaction and run chronology retention; mobile exercises SwiftData restore and operations edit to compare live and restored prefix ownership.",
"evidence": [
{
"resource": "repo://TFITests/MobileAssistantTests.swift#L154-L199",
"version": "repo-lines-v1:sha256:d337b352f4c959c9d41ff735d806ee5d7b84f73490eb20bbd0c7e4ed6d69643a:eyJzZWxlY3RlZExpbmVDb3VudCI6NDYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYxMjNjNGMzNzhiOWZiNzhjM2ZjOWNhMzc0YTNhNjQ0OGE5ZjAzMzJiYWY1ZmEyNDIxMGJjMDc0YjlkMmRmNTgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU1ZjljZmVjYTlmZmQyNDRmMzFjNzdjZmNmNjMzYTA2NmZkZWQyYzI3OGVjNWQ2ZmRiZTU2ODM0NGY1ZWM1N2YifQ"
},
{
"resource": "repo://TFMTests/ChatComposerStateTests.swift#L2268-L2351",
"version": "repo-lines-v1:sha256:c62222b56de5a198a7a34c403aeae467a2c6d9500b19185607bbfe80920954d7:eyJzZWxlY3RlZExpbmVDb3VudCI6ODQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEzYTZiMTA4ZmJkYTIyOTRkMjBjNmZiOWVmMzk2MDNiMTI3NzFhOTdmMzY2ODM5YWM3ZjUyNmExYWYxNGI3ZWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ5NzZiYzRlZGFlZTk4NTVlZWFkMjc5MDI4ZmZlMDgwMjE5YjQwMzQzMWM1NDA3NDRkZWYzNjgyZmIyYTdhZDYifQ"
}
]
},
{
"id": "claim_612b95bf7d214bf6b16c67c57ea31156",
"statement": "Application edit tests reject invalid replacements before repository calls and preserve live history after injected repository rejection; controller cancellation after committed editing checks interrupted staging adoption. These fixtures replace the persistence port and do not inject real SwiftData storage failure.",
"evidence": [
{
"resource": "repo://FrameworkTests/AssistantConversationOperationsTests.swift#L228-L266",
"version": "repo-lines-v1:sha256:d504dc650e02ce7236152c633382cef19bd6762a026047c05f7c1ad0785f7a7c:eyJzZWxlY3RlZExpbmVDb3VudCI6MzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEyNWIwMmI1NzE0ZDA2NmZkMzIxNmQyMjMxYmRkZGFjYjM2ZDcwODc3OTE4NmRhYzg5MjQyYWViZDA2ZjQ1M2MiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYjYzYjhkYTE1ZTdkOGZhNDBlNjhmYjhkNjY0YzhjZDQ4NGFlMzQ4NGEyMjEzNWU0NDAwYjA4NjI3Yjg2ZjciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIyNWU4YzMwNjkwMDIyNmYwNDA2OWM5YTZmMTZjNmY0ODE2NzkzYzM5NTNjZDM3YWFlNzQ5OWY2OGQ1YjAyNmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUifQ"
},
{
"resource": "repo://FrameworkTests/AssistantConversationOperationsTests.swift#L290-L309",
"version": "repo-lines-v1:sha256:1aadebda28ab65aaf172c7524dd75bfbc882c73879618892eee83488349e51aa:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImIyMGI5NDg0YjQ4YTE3M2QzMTM2ZjhkYWRiNzdiNTUwYWQ5ZmRiMzU4YjMyMjllNTRjOGQyNjg1NGNkMWVlNGMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc1MjhmNGExMDgwN2M3ZDcxOTRjZTUxNTlmMzNmMjFiZjM1YzYxMzA5ZGNhNDkzNjgyOTViZjBkYzE3Y2QyYTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZkMWY5Njk2ZTM2ODQ2MzcxNzIxODJiOGMzZmNlMWFlMzQ4Yzc4MzJkOGU4OTE0ZDVjZjJlZjU1NDIxNDIwYWUifQ"
},
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L450-L534",
"version": "repo-lines-v1:sha256:fd0683e00df11cd8ca35568565d1b1d43a68ad37ab7bf54e5f68803954f14349:eyJzZWxlY3RlZExpbmVDb3VudCI6ODUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZkYTc3OGQ5NDJjNzRkNGFjOGYzMmM1MTgyMDg2MGFlOGE2MDQ5YWE1NDUwYTE5NjMzMTM4MmNmNWVmNWU1MGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk1NTUyNmNmOWEwOGQ4Yzc1ZTA5ZThhMWZhMTIwODkxZmQ3MWEwMDNhMjkwY2U5ZTEzY2YwOWQ5NjRmYjkxYWUifQ"
}
]
},
{
"id": "claim_9b91e98a29a34c4caa268050b13a5f3e",
"statement": "Missing-credential and selection-during-preparation tests wait for the recording repository's failed snapshot as well as checking live failure because production captured failures publish before asynchronous save; actor waiters handle both already-recorded and future snapshots.",
"evidence": [
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L231-L255",
"version": "repo-lines-v1:sha256:63509c11ab1c2718bead3930614de6427e1e6df47c0e787aeed401498661891c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjY0YzVmZGJhOWRmZTUwNjMwNjlkYTdlN2RiZWVjM2QzZWRiNjE3YmUzMTQxYjBmNGEyYzY0OTEzNWI0N2M2ZDMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIyMzkzYWYzYmRiOTExYzA2ZWFmMjNkYjMxZTkyMmNkNGY3NDc2MmYzNGFmMTE1NTJkNDczYzc1ODhhZmFhZTkifQ"
},
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L66-L86",
"version": "repo-lines-v1:sha256:80d25cc0451a928bc50f91e07a28b411b83c0d7299889938c179b8d5e96fb33b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImY1OGZlNzcyYzJiNDExMGEyYzJhOWQxYTk5MjI3OGY4ZTNmZDg5YzMzNzJlZjZmYjE0Y2NjYmU1NDU3MmQyMWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZkMzMwZjllZDlkNjUwYTVhMDRlNTk4Y2YxNmE2NmZkOTM3NWZjYWIxMzhkMmJiNmE0MWYxNTJjYzRjMjExNDQifQ"
},
{
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L661-L689",
"version": "repo-lines-v1:sha256:74df831f049f3d94b2df3e3684005e41efcfdbae4210f2a76d72f07088772ff4:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI3M2UyMmU5ZjA4MTYzZWY3NDM5ODE2MTc3YzcyODZiZjg0MGRhODFhYTAxODc0ZTUxOTExNDM3NTNhNTIzNTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM4YTQ5OThkMTFmOGNhNTNkOWY1ZWE2OWQ3ZmJmYmE1MGViMTFhMzBhMTdkNDZiNzQzZDZiN2EyNzA5MDhlYzciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVjYWZkOTVhYTdjMWM0MzA0YWEyNTI0OTg4YWNlMTM1NjQwMjU1MGZjYTg1ZmY5ODlhODEzYjNmNTEwNmJmZDciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImRlMzE4ODBjNjRmODIxZTk5ZmMxNGNjNWE0MDY5OTE0MzQzZTIwNGUwYmQ3N2U4NjU5ODhjMzQ1Y2RkZTdiMDgifQ"
},
{
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L765-L793",
"version": "repo-lines-v1:sha256:e87d08aec434dbaca6f03d91f4f5c0cab6e7e04e6040b3e13dc277d1eff4ed2f:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU4MzY5NDdmMWVlZjZmNjIwZWJlZmQzMGE0N2EwNWI4ZDhiZWI2ZTNkYTFlZjkzOTM3MTg5OTZiZTI1NDkxYWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE2ODhmNzU3ODA1NDczNjk2N2U4NzY5MmJiYTg2YjI4MDhmMzI0MTk3NTQ0MDVlYmZkNmM0NWI3MTk4OWQ0NzQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ3MTVmNGViNzI5YTZmMGMwMDk2MWMyN2JhMzFjNmU2ZGQxNWIwNTFkOTRhOGI5NzY3YWQ4Zjg3NGZmODBjZDMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRjNmM3Y2RjOGM0ZWMwYmM5ZGU4ZTY5MThmYWUwYWE5ODQ0MTJiNDJjZTVjMzY5ZWExZTMzMjg0N2Y4ZjIyOWIifQ"
}
]
}
],
"verification": {
"by": "openwiki/0.5.2",
"at": "2026-09-23T00:14:42.075Z"
"at": "2026-09-23T03:34:06.838Z"
}
}
+2 -2
View File
@@ -1,7 +1,7 @@
{
"updatedAt": "2026-09-23T02:48:46.050Z",
"updatedAt": "2026-09-23T03:41:38.907Z",
"command": "update",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"gitHead": "73b40a1b937fc7fa4e24208563cce22e50674495",
"model": "host-agent/codex",
"status": "complete",
"language": "en"
+40 -40
View File
@@ -2,53 +2,53 @@
"schemaVersion": 1,
"pages": {
"/openwiki/architecture/desktop-ui.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:aacd9e53709881d4edac532fd23dfffe4e8ba8cf7a5b611a79bfd846f1128d8a",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
},
"/openwiki/architecture/engineering-invariants.md": {
"pageVersion": "sha256:564964f95e8176182ff915ce6d8834e7717b6a3a3be946666c5b1d1d749906cc",
"gitHead": "73b40a1b937fc7fa4e24208563cce22e50674495",
"sourceFingerprint": "sha256:606589a25f14109f9d01d3e3e814a6bcbf889bb3e8c86ffa63bd3f27ca488827",
"pageVersion": "sha256:902f023527c34c7a6aacb2a481737931b5f30946486a41b279723af0321cc821",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "03a5a83b-2791-4c16-87fa-a3244c996460"
},
"/openwiki/architecture/mobile-ui.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:5a57c9f6cd1214629ea2a75c3ba60386a70d5c2170cdb552f4dea473f0dde193",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
},
"/openwiki/architecture/module-map.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:4139c19be34c8fc47c74c1b05a07851c8e18bdfafe33237f7507fbc542e4b360",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
},
"/openwiki/architecture/native-app-directories.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:f1dc10b8e646cf711a546c2b764e9d898ad017b4ef0f3bdc7f1932e54e746ae5",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
},
"/openwiki/architecture/platform-runtime.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:0e61cbe711eed5c27ef6466c5ce521193641c61d25abf03298b9098834235f2f",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
},
"/openwiki/architecture/shared-module-directories.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:afb1bab3e4c91081f597fea301a3472ef878abc9493b4e6bcc9014ba1aabe4e9",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
},
"/openwiki/architecture/supporting-system-directories.md": {
"gitHead": "bdeb201d19b1d86d1bf1145d6cd6bbfbd95bd4a1",
@@ -65,11 +65,11 @@
"completedRunId": "07775097-b8b6-4b52-9321-61697240352d"
},
"/openwiki/concepts/agent-runtime-and-assistant.md": {
"pageVersion": "sha256:1dba6f651d9536e5ea63b9bd551b7e20cc973f0816613aec3593304b42c8cbfb",
"pageVersion": "sha256:46c6736cc2e227449885be7dd7fbf51a7b98259f7509c85a334881cc20382e90",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "5cf94351-ac48-4e6e-b587-76affa9694d9",
"gitHead": "73b40a1b937fc7fa4e24208563cce22e50674495",
"sourceFingerprint": "sha256:606589a25f14109f9d01d3e3e814a6bcbf889bb3e8c86ffa63bd3f27ca488827"
},
"/openwiki/concepts/commerce-localization-and-product-surfaces.md": {
"gitHead": "58a0cfd1bf9d08057801c740e79bbcb3c1fcc37e",
@@ -79,11 +79,11 @@
"completedRunId": "691ddd1f-2966-4a5b-b437-127adf28ff38"
},
"/openwiki/concepts/persistence-and-secrets.md": {
"gitHead": "2ded2a56a35c168034bdb82043a88bc0466e2088",
"sourceFingerprint": "sha256:5695d0d8460e1bfb0a6bfc3981f4a8012f4c28db0c06cf36df962449676935db",
"pageVersion": "sha256:1235c885f381c01020d2218636f500707c8fc6b3b1e8e4fbd712336ef4deb064",
"pageVersion": "sha256:6f9cbf0a3aa5fea9637709e225bee6cf28af7cdf172609b3c903f75bade148b7",
"completedBy": "codex",
"completedRunId": "aa140d94-d963-45b6-b682-05a1a3802ffa"
"completedRunId": "5cf94351-ac48-4e6e-b587-76affa9694d9",
"gitHead": "73b40a1b937fc7fa4e24208563cce22e50674495",
"sourceFingerprint": "sha256:606589a25f14109f9d01d3e3e814a6bcbf889bb3e8c86ffa63bd3f27ca488827"
},
"/openwiki/concepts/remote-services-and-forwarding.md": {
"gitHead": "bdeb201d19b1d86d1bf1145d6cd6bbfbd95bd4a1",
@@ -156,18 +156,18 @@
"completedRunId": "691ddd1f-2966-4a5b-b437-127adf28ff38"
},
"/openwiki/quickstart.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:89970353463e9a930e9c659614c1e55ef4107801b0721beda98be323539ac450",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
},
"/openwiki/testing/behavioral-boundaries-and-fixtures.md": {
"gitHead": "2ded2a56a35c168034bdb82043a88bc0466e2088",
"sourceFingerprint": "sha256:5695d0d8460e1bfb0a6bfc3981f4a8012f4c28db0c06cf36df962449676935db",
"pageVersion": "sha256:57c765ca650c5a286d85e4b4740dbd3e17d8d481a2fbdae60324abe952962271",
"gitHead": "73b40a1b937fc7fa4e24208563cce22e50674495",
"sourceFingerprint": "sha256:606589a25f14109f9d01d3e3e814a6bcbf889bb3e8c86ffa63bd3f27ca488827",
"pageVersion": "sha256:a1bfef0a62680b258aa4a9db1d84956798dfe6deb3c50df7c2aa29ba2ffa6ebb",
"completedBy": "codex",
"completedRunId": "aa140d94-d963-45b6-b682-05a1a3802ffa"
"completedRunId": "03a5a83b-2791-4c16-87fa-a3244c996460"
},
"/openwiki/workflows/port-forwarding-pool-and-dispatch.md": {
"gitHead": "58a0cfd1bf9d08057801c740e79bbcb3c1fcc37e",
@@ -191,11 +191,11 @@
"completedRunId": "691ddd1f-2966-4a5b-b437-127adf28ff38"
},
"/openwiki/workflows/ssh-session-lifecycle.md": {
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691",
"pageVersion": "sha256:8ed164f2bf48e753c9305fac8b0f7e7754b6e223ed99d68ba71ed6c8ca191334",
"completedBy": "codex",
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef",
"gitHead": "ae38d77013b7502c185781920ebfd4236afb1e6b",
"sourceFingerprint": "sha256:437b5dbe7eee74926b4f7906dc9421b029371a6e9727a372f3728b7e67628691"
"completedRunId": "3212507d-fdea-4335-9994-e4980af3ccef"
}
}
}
@@ -10,6 +10,8 @@ sources:
resource: repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift
- id: openwiki-source-5f99e8af445e073ffe9bc257
resource: repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift
- id: openwiki-source-1c48f72c0c7a3164d7d5c715
resource: repo://Frameworks/TermindApplication/Agent/ConversationModel.swift
- id: openwiki-source-5c91b796f7e6d651aedf3023
resource: repo://Frameworks/TermindApplication/FeatureModels/CommandHistoryModel.swift
- id: openwiki-source-dc7b363138921b0923d2dc2f
@@ -36,6 +38,8 @@ sources:
resource: repo://Frameworks/TermindPersistence/CloudSyncSafetyStore.swift
- id: openwiki-source-fe1dc993163bb9ff61397be7
resource: repo://Frameworks/TermindPersistence/HostPersistence.swift
- id: openwiki-source-28d6772acb1a409d29ff1973
resource: repo://Frameworks/TermindPersistence/SwiftDataAgentRunRepository.swift
- id: openwiki-source-7a9c6d90cba4ebd1d1398673
resource: repo://Frameworks/TermindPersistence/TermindPersistence.swift
- id: openwiki-source-8185a608f0b79f1af097efbd
@@ -110,10 +114,10 @@ sources:
resource: repo://TFMTests/ArchitectureBoundaryTests.swift
- id: openwiki-source-9442022b3dba1be62a55f0f0
resource: repo://TFMTests/TerminalThemeTests.swift
generated: { by: "codex", at: "2026-09-23T02:40:53.789Z" }
generated: { by: "codex", at: "2026-09-23T03:34:06.838Z" }
verified:
- by: openwiki/0.5.2
at: 2026-09-23T02:40:53.789Z
at: 2026-09-23T03:34:06.838Z
---
# Cross-Cutting Engineering Invariants
@@ -506,6 +510,14 @@ factories/Sendable buffer handlers. Timers/workers enter explicit short MainActo
history/preparation work before its interrupted save; stale captures cannot edit or start. Archive/delete cancel pending preparation,
manual compaction refuses it, and navigation alone leaves it running. See [Assistant Runtime](/openwiki/concepts/agent-runtime-and-assistant.md)
for the preparation boundary and existing runtime/recovery limitations.
- History edits validate before persistence and publish their live replacement only after truncation commits. The boundary is the selected
user message in canonical run/message order, not its whole run: retain the same-run prefix and owned tool graph with a neutral completed
summary, remove the suffix and later runs, and prune compactions by removed message IDs. Compacted display history still informs ownership
and opening-title preservation. See [Persistent Data](/openwiki/concepts/persistence-and-secrets.md) for graph cleanup and rollback.
- An edited replacement initially owns a staging run whose ID equals its message ID. The first real snapshot transaction adopts only that
staged row and deletes the staging run; historical replay rows keep their owners. Live running, failed and interrupted projections use
the same provenance and preserve the staging chronology lower bound. Retired run IDs reject late saves/events in the repository instance.
This is not universal persist-before-publish: missing-model/credential failures still project live before their asynchronous save.
- Project tool output once before `toolFinished`: bounded preview and scratch reference, retaining crash/replay metadata and paging offsets.
Later completion never shortens earlier results; `sftp_read`/`scratch_read` report complete lines/truthful offsets.
- Terminal suggestions use latest delivered user snapshot, not focus. Surface availability is partial and does not restrict independent SSH/
@@ -74,12 +74,14 @@ sources:
resource: repo://TFMTests/AgentScratchTests.swift
- id: openwiki-source-7e117096f381ecc32caff068
resource: repo://TFMTests/AgentSkillTests.swift
- id: openwiki-source-78797a18dd3153d23a2c42e2
resource: repo://TFMTests/ChatComposerStateTests.swift
- id: openwiki-source-8d265a8732f0af93c5d4e274
resource: repo://TFMTests/MCPServerToolsTests.swift
generated: { by: "codex", at: "2026-09-23T02:40:53.789Z" }
generated: { by: "codex", at: "2026-09-23T03:40:50.823Z" }
verified:
- by: openwiki/0.5.2
at: 2026-09-23T02:40:53.789Z
at: 2026-09-23T03:40:50.823Z
---
# Assistant, Agent Runtime, Skills, and Memory
@@ -226,9 +228,21 @@ Persisted text, tool arguments, titles, reasoning, and attachments go through re
Tool cards resolve their persisted presenter ID through the immutable presenter registry. Cards predating those IDs use the closed legacy tool-name list and its `builtin.` IDs. Registration and surface-availability changes preserve those identities and the persisted context key; they do not require a SwiftData schema change.
Compaction changes the **model-facing** transcript, not the scrollable display history. Its summary record is persisted before the live conversation applies it; after recovery the model receives a synthetic compaction summary plus recent messages while the user can still read the full original conversation. Editing a user message truncates the target run and later runs atomically, creates the replacement turn, and removes compactions whose boundary was removed.
Compaction changes the **model-facing** transcript, not the scrollable display history. Its summary record is persisted before the live conversation applies it; after recovery the model receives a synthetic compaction summary plus recent messages while the user can still read the full original conversation.
That durable edit boundary is still run-level, whereas the live model truncates from the target message. Editing a steering user message within a run can therefore leave earlier messages from that same run in the live model after persistence removed them. This existing durable/live mismatch is separate from stale-preparation cancellation and is not repaired by synchronous capture.
### Message-boundary edits and replacement provenance
`AssistantConversationOperations.edit` validates an ordinary replacement user message before persistence and applies the live mutation only after truncation succeeds. SwiftData checks cancellation before its synchronous transaction and uses the same canonical order for restore and truncation: runs by start time then UUID, messages by run order then sequence, timestamp, role and UUID. The selected message and everything after it are removed, not automatically its entire run. For `opening → assistant → steering → assistant`, editing the steering turn retains the opening and preceding assistant/tool batch. The retained partial run becomes a neutral `.completed` summary with no old failure and ends at its last retained non-tool message; wholly later runs, including empty ones, are removed.
Tool cleanup follows ownership before time. Known source-message and run-local call identities distinguish retained prefix tools from removed suffix tools, with results and reviews deleted alongside removed invocations. Restore infers missing legacy source IDs from the raw assistant call grammar; deterministic recovered tool-result IDs receive run ownership. The live projection additionally uses retained result ownership and the full visible prefix when compaction has hidden raw messages from the model transcript. Only invocations/cards without recoverable ownership fall back to `createdAt >= target.createdAt`, conservatively including the exact cutoff. This includes legacy rows and modern provider-native events persisted before their source message reaches a snapshot. Compaction records are removed only when their explicit boundary message is removed; nil-boundary fork bases survive, and live compaction marks are rebuilt. Editing after a retained opening does not clear its title, even when that opening is compacted out of the model transcript; live plans at or after the cutoff are removed.
The replacement is durable before a runtime exists: its message ID also identifies an independent, completed, failure-free staging run containing that one user row and no tool graph. Its start time is placed after the latest retained run if clocks tie or move backward, including when the earlier retained run has no messages. On the first real snapshot containing that staged final user turn, `save` transactionally moves only the staged message to the real run, assigns its snapshot sequence, retains its attachments/replay backing, deletes the staging run and retires its ID. Historical messages replayed into the snapshot keep their existing owners and are not duplicated. Adoption preserves the staging start-time lower bound; subsequent snapshots cannot move it backward, and terminal time is clamped to that start when necessary.
`ConversationModel` mirrors adoption on `runStarted`, captured failure and preparation interruption; `runFinished` retains the adjusted chronology. A failed or interrupted replacement therefore has the real run's provenance rather than an abandoned staging summary. The ordering of publication still depends on the path: preparation cancellation awaits the interrupted save and rechecks identity before adopting, while `recordFailedRun` for a missing model/credential projects live first and starts a separate asynchronous save. Neither `!isPreparingAgentRun` nor a visible failed state proves that this save finished. The persist-before-live contract above is specifically the history mutation boundary.
The repository instance retires the edited target run, removed later runs and adopted staging run so late snapshots or durable tool events cannot resurrect the discarded suffix. Truncation and snapshot save roll back SwiftData changes and restore the previous in-memory retired-ID set on error. These rules use the existing schema and Termind's Application/Persistence adapters, without changing AgentKit or its package pin. See [Persistent Data](persistence-and-secrets.md) for the storage contract.
### Restore and metadata
At repository initialization, every nonterminal persisted run becomes `interrupted`; Termind never replays unfinished execution automatically. Restore reconstructs completed tool cards and can recover a durable tool result that was recorded before its next transcript snapshot. If an outcome remains unknown, repair records an explicit unknown/refusal result rather than assuming a call was never dispatched.
@@ -281,12 +295,13 @@ New submissions capture whether they have a memory-session identity before prepa
The focused tests establish behavior that is important when changing this area:
- `TFMTests/AgentRuntimeTests.swift` covers schema-before-approval/execution, approval mode routing, Guardian timeout/failure fail-closed behavior, single-use secret handles, steering delivery, tool cancellation, registry shadowing, and durable-event filtering.
- `TFMTests/AgentPersistenceTests.swift` covers redaction, interrupted-run recovery, replay deduplication, tool-result repair, deletion of the persistent graph, edit truncation, fork persistence, and compaction restoration.
- `FrameworkTests/AssistantExecutionControllerTests.swift` covers capture across a memory barrier, missing credentials, first-send guards and payload folding, plan implementation, edit persistence/cancellation barriers, superseded captures, navigation, compaction refusal, memory revocation, and neutral legacy context.
- `FrameworkTests/AssistantConversationOperationsTests.swift` verifies persistence-first archive/rename/order mutations, activity guards, and that immediate stop prevents a queued runtime's model call. That last test does not establish snapshot persistence for the runtime handoff gap.
- `TFMTests/AgentPersistenceTests.swift` covers redaction, interrupted-run recovery, replay deduplication, tool-result repair, graph deletion, same-run edit prefix/tool preservation, canonical equal-time ordering, empty retained runs, staging adoption, late-write rejection, fork persistence and compaction restoration. `ChatComposerStateTests.swift` checks the compacted live prefix, tool cards, title, plans and adopted run summaries.
- `FrameworkTests/AgentReplayPersistenceTests.swift` checks failed/interrupted staging adoption and reloads through a fresh `ModelContext` and repository to verify durable provenance and replay backing.
- `FrameworkTests/AssistantExecutionControllerTests.swift` covers capture across a memory barrier, missing credentials, first-send guards and payload folding, plan implementation, edit persistence/cancellation barriers, failed/interrupted replacement provenance, superseded captures, navigation, compaction refusal, memory revocation, and neutral legacy context. Repository snapshot waiters distinguish async save completion from a live failed state.
- `FrameworkTests/AssistantConversationOperationsTests.swift` verifies persistence-first archive/rename/order/edit mutations, invalid edit rejection before repository calls, failed edits leaving the live prefix unchanged, activity guards, and that immediate stop prevents a queued runtime's model call. That last test does not establish snapshot persistence for the runtime handoff gap.
- `TFMTests/AgentScratchTests.swift` verifies workspace containment, symlink refusal, inter-conversation isolation, quotas, and bounded reads.
- `TFMTests/AgentBuiltInToolAvailabilityTests.swift` checks exact Termind planning/acting/reviewing sets, the shared SSH schema with mode-specific preflight, and execution spies proving the surface gate blocks only terminal suggestions.
- `FrameworkTests/AgentSteeringTests.swift` and `TFITests/MobileAssistantTests.swift` check snapshot preservation, delivery timing, legacy unknown context, mobile send/steer availability, acting-mode plan implementation, and tool-incapable models.
- `FrameworkTests/AgentSteeringTests.swift` and `TFITests/MobileAssistantTests.swift` check snapshot preservation, delivery timing, legacy unknown context, mobile send/steer availability, acting-mode plan implementation, and tool-incapable models. Mobile's SwiftData restore/edit fixture also verifies same-run prefix preservation and replacement provenance.
- `TFMTests/MCPServerToolsTests.swift` checks the exported acting subset against shared descriptors, transfer tools and disabled calls; `AgentHostProtocolListingTests.swift` checks protocol-neutral discovery, and `AgentToolPresentationTests.swift` retains legacy presentation coverage alongside the persistence suite.
## Change guidance
+27 -3
View File
@@ -4,6 +4,12 @@ title: Persistent Data, Migrations, and Secret Boundaries
description: How Termind owns SwiftData and GRDB durable data, evolves compatible schemas, projects records through repositories, and keeps credentials in Keychain-backed and runtime-only boundaries.
tags: [persistence, swiftdata, grdb, migrations, keychain, secrets, security]
sources:
- id: openwiki-source-685b7f8e7dbcf91b4e2a50e2
resource: repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift
- id: openwiki-source-5f99e8af445e073ffe9bc257
resource: repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift
- id: openwiki-source-1c48f72c0c7a3164d7d5c715
resource: repo://Frameworks/TermindApplication/Agent/ConversationModel.swift
- id: openwiki-source-dc7b363138921b0923d2dc2f
resource: repo://Frameworks/TermindApplication/FeatureModels/ConnectionHistoryModel.swift
- id: openwiki-source-7ca30f0e781e8c2df826b47a
@@ -54,6 +60,8 @@ sources:
resource: repo://Frameworks/TermindPersistence/TermindSchemaV29HostModels.swift
- id: openwiki-source-15e5026028d13d2202844f68
resource: repo://Frameworks/TermindPersistence/TermindSchemaV33IdentityModels.swift
- id: openwiki-source-017f5e2abe9b13df755a5322
resource: repo://FrameworkTests/AgentReplayPersistenceTests.swift
- id: openwiki-source-bf7a64e7c819eb9279e2f9e4
resource: repo://FrameworkTests/CloudSyncLifecycleTests.swift
- id: openwiki-source-40cfadc2320da9a292c64d26
@@ -70,12 +78,14 @@ sources:
resource: repo://TFM/App/TermindApp.swift
- id: openwiki-source-0854be84b166268626a3cb08
resource: repo://TFM/Features/Sidebar/WindowSidebarView.swift
- id: openwiki-source-715de8d16be5a3d06ae915ad
resource: repo://TFMTests/AgentPersistenceTests.swift
- id: openwiki-source-1d1efb20e239b1f2142f6cb7
resource: repo://TFMTests/SettingsSyncTests.swift
generated: { by: "codex", at: "2026-09-23T00:14:42.075Z" }
generated: { by: "codex", at: "2026-09-23T03:40:50.823Z" }
verified:
- by: openwiki/0.5.2
at: 2026-09-23T00:14:42.075Z
at: 2026-09-23T03:40:50.823Z
---
# Persistent Data, Migrations, and Secret Boundaries
@@ -112,7 +122,21 @@ SwiftData rows are persistence representations, not the feature API. `SwiftDataH
Deletion is a durable saga, not an immediate blind removal: `requestHostDeletion` atomically writes a pending-deletion marker, outbox jobs, and the revision. The snapshot hides marked hosts. Later steps remove dependent jump/snippet/history/forwarding references and finally remove host-owned identities, the host, and the marker. This lets a crash expose either the live host or a complete, resumable deletion intent rather than a partial state.
Agent conversations use a separate SwiftData repository with similarly deliberate projections. `SwiftDataAgentRunRepository` stores run snapshots, messages, context/replay backing, tool invocations/results, reviews, compactions, and ordering. It writes only new message IDs rather than duplicating replayed earlier turns, sanitizes persisted text and tool-call JSON, and marks nonterminal runs interrupted when the repository is initialized. Loading orders transcript rows by run and sequence, then restores recorded tool results that were committed before the next transcript snapshot.
Agent conversations use a separate SwiftData repository with similarly deliberate projections. `SwiftDataAgentRunRepository` stores run snapshots, messages, context/replay backing, tool invocations/results, reviews, compactions, and ordering. It deduplicates replayed earlier turns by message ID, sanitizes persisted text and tool-call JSON, and marks nonterminal runs interrupted when the repository is initialized. Loading orders transcript rows by run and sequence, then restores recorded tool results that were committed before the next transcript snapshot.
### Assistant history edits: one message boundary, one transaction
Restore and truncation share a canonical ordering: runs by `startedAt` then UUID; messages by that run order, then `sequence`, `createdAt`, role rank and UUID. Timestamps alone do not identify the cutoff. `truncateConversation` checks cancellation and validates an ordinary user replacement with a fresh ID that collides with neither a stored message nor a run before mutation. It removes the selected user message and the ordered suffix, including whole later runs. When the target run still has a prefix, that run and its retained messages survive: the summary becomes neutral `.completed`, clears its previous failure and ends at the last retained non-tool message. Editing its opening removes the target run only when no prefix remains.
Graph cleanup follows the same boundary. Removed messages lose their replay and context-attachment backing. Within a partially retained run, invocation source-message ownership takes priority, followed by call identity in retained/removed transcript rows; only unrecoverable ownership uses the conservative `createdAt >= target.createdAt` fallback. This covers both legacy rows and modern provider-native events persisted before their source-message snapshot. Results and reviews follow the deleted invocation IDs. Compactions are deleted only if their explicit boundary is among the removed message IDs, so retained-prefix records and nil-boundary fork bases survive. The generated title is cleared only when the opening user turn is removed. On load, raw run-local assistant calls supply missing legacy source IDs, and reconstructed deterministic tool-result messages receive run ownership before compaction projection; this lets the live model preserve the same graph through compacted history.
The replacement is inserted with its replay/attachment backing into a standalone, failure-free `.completed` staging run whose ID equals the replacement message ID. Staging must sort after the latest retained run, including an empty run: when the replacement timestamp ties or precedes that run's start, its run start becomes the retained start plus one millisecond. The message's own timestamp is not rewritten.
The first real snapshot whose final ordinary user turn is this staged replacement adopts it in the same `save` transaction. The staging predicate requires the same conversation, the same-ID user row, a completed run without failure, exactly one message and no invocation/result/review graph. Adoption changes only the staged row's run ID and snapshot sequence, retains its backing, deletes the staging run and retires the staging ID. Other historical rows included in replay remain attached to their original runs. The real run inherits at least the staging start time; later saves preserve that lower bound and clamp `finishedAt` when necessary. Failed and interrupted first snapshots use this same path, not a separate copy of the replacement.
The repository's in-memory retired-ID set includes the edited target run even when its prefix survives, all removed later runs, and adopted staging runs. `save` and durable-event `record` ignore retired IDs, preventing late work from rebuilding the discarded suffix. This is a repository-instance guard, not a new persisted tombstone or schema migration. Both truncation and snapshot save restore the previous retired-ID set and roll back their `ModelContext` changes if the transaction fails.
`AssistantConversationOperations` applies the live history edit only after the repository commits; invalid replacements and rejected writes leave history unchanged. Live running, failed and interrupted projections adopt staging provenance too, but publication ordering is not universal: a captured missing-model/credential failure still updates live state before its separate asynchronous save. See [Assistant Runtime](agent-runtime-and-assistant.md) for that boundary and the distinct immediate-stop runtime-handoff limitation. Shared replay tests restore failed/interrupted adoption through a fresh context; desktop and mobile fixtures compare same-run prefix history and provenance after edits. These fixtures do not inject a real disk-full or read-only SwiftData failure.
## Schema evolution: preserve the past exactly
@@ -6,10 +6,16 @@ tags: [testing, regression, fixtures, architecture, persistence, security, lifec
sources:
- id: openwiki-source-8037e2358a2c4f9b2c722a11
resource: repo://AGENTS.md
- id: openwiki-source-5f99e8af445e073ffe9bc257
resource: repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift
- id: openwiki-source-b347308e8c5cc6c0b0d29b7d
resource: repo://Frameworks/TermindRemoteInfrastructure/Transfers/SFTPTransferContext.swift
- id: openwiki-source-017f5e2abe9b13df755a5322
resource: repo://FrameworkTests/AgentReplayPersistenceTests.swift
- id: openwiki-source-247755d873c5d94b0a364217
resource: repo://FrameworkTests/AssistantConversationOperationsTests.swift
- id: openwiki-source-6ec3fb4cd6a582cdf278bab9
resource: repo://FrameworkTests/AssistantExecutionControllerTests.swift
- id: openwiki-source-bf7a64e7c819eb9279e2f9e4
resource: repo://FrameworkTests/CloudSyncLifecycleTests.swift
- id: openwiki-source-195e2cb735dfac7fb6dbda27
@@ -26,6 +32,8 @@ sources:
resource: repo://TFI/Infrastructure/MobileWorkspaceStore.swift
- id: openwiki-source-b822b041afbf829d09a8555a
resource: repo://TFITests/MobileAppTests.swift
- id: openwiki-source-a154b5d36ec59496392d45e4
resource: repo://TFITests/MobileAssistantTests.swift
- id: openwiki-source-7a29627adf93e3da4a56dd5d
resource: repo://TFITests/MobileCardRenderingTests.swift
- id: openwiki-source-16ec96bd78162e7e62effd0e
@@ -34,8 +42,12 @@ sources:
resource: repo://TFITests/MobileWorkspaceStoreTests.swift
- id: openwiki-source-cfbc34def649c94f760c5695
resource: repo://TFMTests/AgentHostAuthenticationTests.swift
- id: openwiki-source-715de8d16be5a3d06ae915ad
resource: repo://TFMTests/AgentPersistenceTests.swift
- id: openwiki-source-d3d065330c730839f5cc6112
resource: repo://TFMTests/ArchitectureBoundaryTests.swift
- id: openwiki-source-78797a18dd3153d23a2c42e2
resource: repo://TFMTests/ChatComposerStateTests.swift
- id: openwiki-source-c15cd5bef4646aaf64df407e
resource: repo://TFMTests/ConnectionHistoryTests.swift
- id: openwiki-source-53e2b2fd2e661123f63e69e1
@@ -44,10 +56,10 @@ sources:
resource: repo://TFMTests/VaultSyncTests.swift
- id: openwiki-source-a08489338be00125d646c77e
resource: repo://TFMTests/VisibleWindowTestTrait.swift
generated: { by: "codex", at: "2026-09-23T00:14:42.075Z" }
generated: { by: "codex", at: "2026-09-23T03:34:06.838Z" }
verified:
- by: openwiki/0.5.2
at: 2026-09-23T00:14:42.075Z
at: 2026-09-23T03:34:06.838Z
---
# Testing Strategy and Behavioral Boundaries
@@ -82,6 +94,19 @@ Persistence tests are compatibility tests, not just encode/decode checks. `Persi
Agent replay persistence demonstrates the same principle for durable runtime state: an in-memory `SwiftDataAgentRunRepository` must restore frozen context and tool result projection without duplicating replay backing across subsequent snapshots, and deletion must remove that backing. A fixture should deliberately model the timing boundary it protects—for example, recording a tool result before the following run snapshot—rather than requiring a live provider.
### Assistant history: compare live state, backing rows and restore
A message edit inside one run needs a fixture such as `opening → assistant/tool batch → steering → assistant/tool batch`, not just one user turn per run. The regression boundary spans several owners:
- `AgentPersistenceTests.sameRunTruncationPreservesThePrefixAndAtomicallyAdoptsTheReplacement` uses equal timestamps and deliberately reversed UUID order. It restores a compacted conversation through the production store and operations, then checks the retained prefix, neutral completed summary, title, attachments, replay rows, invocations/results/reviews and compaction bases. A legacy prefix invocation has no stored source ID and a later timestamp; its known call ownership must still preserve it. An unknown native-tool-like invocation at the exact cutoff must be removed. Real running/completed snapshots must adopt staging once without changing historical owners, and late old snapshots/events must not regrow the suffix.
- `editingALaterRunOpeningKeepsAnEarlierEmptyRunBeforeTheReplacement` checks an earlier retained run with no messages and a replacement clock older than the retained run. Live and restored staging order must agree. Ordinary replay fixtures give genuinely later runs a later start time instead of relying on random UUID tie order.
- Shared `AgentReplayPersistenceTests` parameterizes the first real replacement snapshot as `.failed` or `.interrupted`. It checks the single surviving message/run/replay backing and reloads with a new `ModelContext` and repository over the same in-memory container to verify provenance, terminal state, failure and frozen context. This is fresh-context visibility, not a disk-relaunch test.
- `ChatComposerStateTests.editingSteeringKeepsCompactedSameRunPrefixAndLegacyToolOwnership` checks full visible-prefix retention even when model history is compacted, alongside tool cards, title, plans, compaction records/marks and run-summary chronology through `runStarted`/`runFinished`. Mobile's `swiftDataRestoreAndEditPreserveASameRunPrefixOnMobile` exercises the same repository/store/operations path and compares live and restored message ownership.
Application error and timing fixtures complement those real SwiftData checks. `AssistantConversationOperationsTests` proves an invalid replacement never reaches persistence and a rejecting truncation leaves both visible and model history unchanged. Controller tests hold preparation at a memory barrier, cancel after a successful edit, and assert interrupted real-run provenance replaces staging. These seams do not inject disk-full or read-only failures into the real SwiftData transaction; its rollback path must not be described as fault-injection tested.
Use the boundary that the assertion needs as its wait condition. Captured missing-model/credential failure projects `.failed` before launching a separate asynchronous repository save, so `!isPreparingAgentRun` is not a save barrier. The controller fixture's `waitUntilSnapshot(state:)` checks existing snapshots or suspends an actor-owned continuation; `save` records the snapshot before resuming matching waiters. The missing-credential and navigation tests retain both live-state and repository-state assertions and wait for the latter explicitly. This does not change production failure ordering or prove durability across the separate queued-runtime immediate-stop handoff.
### CloudKit compatibility: test prohibited uploads, not just decoding
The safety fixture substitutes only the CloudKit transport. It uses the production Vault, Settings and Metrics coordinators, journals, record coding, synchronous batches and final record providers. The same cases run for all three categories:
@@ -151,6 +176,7 @@ In Xcode, set `TERMIND_WINDOW_TESTS=1` in the Test action environment. Existing
| --- | --- | --- |
| Framework dependency or data-owner change | `ArchitectureBoundaryTests` plus affected framework suite | No reverse import, concrete implementation leak, duplicate AgentKit type, or SwiftData model outside Persistence. |
| SwiftData schema, migration, or durable agent record | Persistence compatibility/replay fixtures | Old stores open, records retain intended values, interrupted timing remains recoverable, and deletes clean backing rows. |
| Assistant message-boundary edits or replacement provenance | Agent persistence/replay, conversation operations/controller, composer and mobile Assistant fixtures | Same-run prefix and graph survive, suffix backing is removed, staging adopts once, chronology remains stable, live/restore agree, and late retired writes cannot resurrect history. |
| CloudKit format, upload scheduling, conflict or recovery behavior | Shared lifecycle, coordinator-safety and on-disk safety fixtures | Unsupported IDs never upload, compatible peers progress, restrictions survive retry/reopen, and failed reconciliation cannot unblock data. |
| SSH credentials, prompts, host trust, or agent authentication | Authentication and interaction-policy fixtures | Ephemeral secrets stay ephemeral, prompt scope/order/coalescing is correct, forbidden work stays noninteractive, and secrets are invalidated after use. |
| SSH/SFTP transfer scheduling or pane/session teardown | `SFTPTransferContextTests` with a controlled channel harness | Concurrency bounds hold, background transfer ownership survives UI teardown, cancellation cleans up, and fallback does not invite interaction. |