Keep assistant open chat state
This commit is contained in:
1 parent
267e070b73
commit
a66aaf0793
52 files changed
+928
-1297
No files matched your search
@@ -557,13 +557,7 @@ final class AppModel {
|
||||
let wasSelected = window.assistantLibrary.selectedConversationID == id
|
||||
window.assistantLibrary.delete(id)
|
||||
if wasArchived, wasSelected {
|
||||
window.isAssistantArchivePresented = true
|
||||
}
|
||||
if window.sidebar.assistantConversationID == id {
|
||||
window.sidebar.assistantConversationID = nil
|
||||
if wasArchived {
|
||||
window.isAssistantArchivePresented = true
|
||||
}
|
||||
window.presentAssistantArchive()
|
||||
}
|
||||
}
|
||||
if let error = result.cleanupError {
|
||||
|
||||
@@ -134,8 +134,8 @@ struct AssistantSidebarView: View {
|
||||
|
||||
/// The global Assistant contained entirely in a Workspace sidebar.
|
||||
///
|
||||
/// Its route is deliberately separate from the fixed Assistant destination's selection:
|
||||
/// opening a chat here never takes the user's terminal out of the foreground.
|
||||
/// It shares the fixed Assistant destination's Chat/Archive route, while opening
|
||||
/// a chat here still leaves the user's terminal in the foreground.
|
||||
struct AssistantPanelView: View {
|
||||
@Environment(WindowModel.self) private var window
|
||||
@Environment(AppModel.self) private var app
|
||||
@@ -217,7 +217,7 @@ struct AssistantPanelView: View {
|
||||
.opacity(isFocusedOnWorkspace || exitsAsWhole ? 1 : 0)
|
||||
.animation(
|
||||
Motion.panel(reduceMotion: reduceMotion),
|
||||
value: window.sidebar.assistantConversationID
|
||||
value: window.assistantLibrary.selectedConversationID
|
||||
)
|
||||
|
||||
interactionSurface
|
||||
@@ -225,7 +225,7 @@ struct AssistantPanelView: View {
|
||||
y: !isFocusedOnWorkspace && !exitsAsWhole ? Metrics.Space.xxl : 0
|
||||
)
|
||||
.opacity(isFocusedOnWorkspace || exitsAsWhole ? 1 : 0)
|
||||
.animation(nil, value: window.sidebar.assistantConversationID)
|
||||
.animation(nil, value: window.assistantLibrary.selectedConversationID)
|
||||
}
|
||||
.offset(x: !isFocusedOnWorkspace && exitsAsWhole ? Metrics.Space.xxl : 0)
|
||||
.opacity(isFocusedOnWorkspace || !exitsAsWhole ? 1 : 0)
|
||||
@@ -236,7 +236,7 @@ struct AssistantPanelView: View {
|
||||
.onKeyPress(.escape, phases: .down) { _ in
|
||||
guard
|
||||
AssistantSidebarEscapePolicy.shouldCloseConversation(
|
||||
hasConversation: window.sidebar.assistantConversationID != nil,
|
||||
hasConversation: window.assistantLibrary.selectedConversationID != nil,
|
||||
hasBlockingInteraction: blocksSidebarEscape
|
||||
)
|
||||
else { return .ignored }
|
||||
@@ -276,7 +276,7 @@ struct AssistantPanelView: View {
|
||||
|
||||
private var conversationList: some View {
|
||||
AssistantConversationList(
|
||||
selectedID: window.sidebar.assistantConversationID,
|
||||
selectedID: window.assistantLibrary.selectedConversationID,
|
||||
isInteractive: isFocusedOnWorkspace,
|
||||
menuSurface: .sidebar,
|
||||
onOpen: { window.openAssistantInSidebar($0) }
|
||||
|
||||
@@ -577,8 +577,7 @@ final class WindowModel {
|
||||
}
|
||||
|
||||
func selectAssistant(_ id: ConversationModel.ID) {
|
||||
isAssistantArchivePresented = false
|
||||
assistantLibrary.select(id)
|
||||
guard openAssistantConversation(id) else { return }
|
||||
selectedDestination = .assistant
|
||||
}
|
||||
|
||||
@@ -632,35 +631,48 @@ final class WindowModel {
|
||||
}
|
||||
|
||||
func showAssistantArchive() {
|
||||
isAssistantArchivePresented = true
|
||||
sidebar.assistantConversationID = nil
|
||||
presentAssistantArchive()
|
||||
selectedDestination = .assistant
|
||||
}
|
||||
|
||||
var sidebarAssistantConversation: ConversationModel? {
|
||||
guard let id = sidebar.assistantConversationID else { return nil }
|
||||
return assistantLibrary.conversation(id: id)
|
||||
guard !isAssistantArchivePresented else { return nil }
|
||||
return assistantLibrary.selectedConversation
|
||||
}
|
||||
|
||||
func openAssistantInSidebar(_ id: ConversationModel.ID) {
|
||||
guard assistantLibrary.conversation(id: id) != nil else { return }
|
||||
isAssistantArchivePresented = false
|
||||
sidebar.assistantConversationID = id
|
||||
guard openAssistantConversation(id) else { return }
|
||||
refreshSessionContext()
|
||||
}
|
||||
|
||||
func closeAssistantInSidebar() {
|
||||
isAssistantArchivePresented = false
|
||||
sidebar.assistantConversationID = nil
|
||||
presentAssistantHome()
|
||||
refreshSessionContext()
|
||||
}
|
||||
|
||||
func showAssistantArchiveInSidebar() {
|
||||
sidebar.assistantConversationID = nil
|
||||
isAssistantArchivePresented = true
|
||||
presentAssistantArchive()
|
||||
refreshSessionContext()
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
private func openAssistantConversation(_ id: ConversationModel.ID) -> Bool {
|
||||
guard assistantLibrary.conversation(id: id) != nil else { return false }
|
||||
isAssistantArchivePresented = false
|
||||
assistantLibrary.select(id)
|
||||
return true
|
||||
}
|
||||
|
||||
private func presentAssistantHome() {
|
||||
isAssistantArchivePresented = false
|
||||
assistantLibrary.selectNewConversation()
|
||||
}
|
||||
|
||||
func presentAssistantArchive() {
|
||||
assistantLibrary.selectNewConversation()
|
||||
isAssistantArchivePresented = true
|
||||
}
|
||||
|
||||
func deleteAssistantConversation(_ id: ConversationModel.ID) {
|
||||
if let assistantCommands {
|
||||
assistantCommands.delete(id)
|
||||
@@ -670,11 +682,7 @@ final class WindowModel {
|
||||
let wasArchived = assistantLibrary.conversation(id: id)?.isArchived == true
|
||||
let wasSelected = assistantLibrary.selectedConversationID == id
|
||||
assistantLibrary.delete(id)
|
||||
if wasArchived, wasSelected { isAssistantArchivePresented = true }
|
||||
if sidebar.assistantConversationID == id {
|
||||
sidebar.assistantConversationID = nil
|
||||
if wasArchived { isAssistantArchivePresented = true }
|
||||
}
|
||||
if wasArchived, wasSelected { presentAssistantArchive() }
|
||||
}
|
||||
|
||||
func toggleAssistantPin(_ id: ConversationModel.ID) {
|
||||
@@ -732,9 +740,6 @@ final class WindowModel {
|
||||
func assistantConversationWasArchived(_ id: ConversationModel.ID) {
|
||||
if assistantLibrary.selectedConversationID == id {
|
||||
assistantLibrary.selectNewConversation()
|
||||
}
|
||||
if sidebar.assistantConversationID == id {
|
||||
sidebar.assistantConversationID = nil
|
||||
isAssistantArchivePresented = false
|
||||
}
|
||||
}
|
||||
@@ -754,13 +759,14 @@ final class WindowModel {
|
||||
func sendAssistantSidebarDraft() -> ConversationModel? {
|
||||
let draft = sidebar.assistantDraft
|
||||
guard let conversation = assistantLibrary.startConversation(draft) else { return nil }
|
||||
sidebar.assistantConversationID = conversation.id
|
||||
isAssistantArchivePresented = false
|
||||
sidebar.assistantDraft = ConversationModel()
|
||||
return conversation
|
||||
}
|
||||
|
||||
func assistantSidebarConversationDidStart(_ conversation: ConversationModel) {
|
||||
sidebar.assistantConversationID = conversation.id
|
||||
isAssistantArchivePresented = false
|
||||
assistantLibrary.select(conversation.id)
|
||||
sidebar.assistantDraft = ConversationModel()
|
||||
}
|
||||
|
||||
@@ -970,10 +976,9 @@ final class WindowModel {
|
||||
|
||||
@discardableResult
|
||||
func openNewAssistantChat() -> ConversationModel {
|
||||
isAssistantArchivePresented = false
|
||||
let conversation = assistantLibrary.selectNewConversation()
|
||||
presentAssistantHome()
|
||||
selectedDestination = .assistant
|
||||
return conversation
|
||||
return assistantLibrary.draftConversation
|
||||
}
|
||||
|
||||
/// One machine's SFTP browser, listed in the sidebar under "Sessions".
|
||||
@@ -1417,14 +1422,19 @@ final class WindowModel {
|
||||
}
|
||||
|
||||
private func promoteVisibleSidebarConversationOrSelectVault() {
|
||||
guard sidebarMode == .assistant,
|
||||
let conversationID = sidebar.assistantConversationID,
|
||||
assistantLibrary.conversation(id: conversationID) != nil
|
||||
else {
|
||||
guard sidebarMode == .assistant else {
|
||||
selectedDestination = .vault
|
||||
return
|
||||
}
|
||||
openAssistantFullScreen(conversationID)
|
||||
if isAssistantArchivePresented {
|
||||
selectedDestination = .assistant
|
||||
} else if let conversationID = assistantLibrary.selectedConversationID,
|
||||
assistantLibrary.conversation(id: conversationID) != nil
|
||||
{
|
||||
openAssistantFullScreen(conversationID)
|
||||
} else {
|
||||
selectedDestination = .vault
|
||||
}
|
||||
}
|
||||
|
||||
/// Closes one pane, and the Workspace with it when that was the last one.
|
||||
|
||||
@@ -48,9 +48,8 @@ final class WindowSidebarState {
|
||||
|
||||
var isPresented = true
|
||||
|
||||
/// Global Assistant panel navigation is independent from the selected
|
||||
/// top-level destination. `nil` is the history + composer landing screen.
|
||||
var assistantConversationID: ConversationModel.ID?
|
||||
/// The contextual Sidebar keeps its own draft, but its open Chat/Archive
|
||||
/// route is shared with the full Assistant through `WindowModel`.
|
||||
var assistantDraft = ConversationModel()
|
||||
|
||||
/// What the focused pane is, for whichever composer this column is showing.
|
||||
|
||||
@@ -33,7 +33,7 @@ struct AppTerminationTests {
|
||||
app.registerWindow(window)
|
||||
#expect(window.assistantLibrary.conversation(id: first.id) === first)
|
||||
window.openAssistantInSidebar(second.id)
|
||||
#expect(window.sidebar.assistantConversationID == second.id)
|
||||
#expect(window.assistantLibrary.selectedConversationID == second.id)
|
||||
app.unregisterWindow(window)
|
||||
|
||||
let cleanup = app.shutdownForTermination()
|
||||
|
||||
@@ -133,6 +133,23 @@ struct WindowStateTests {
|
||||
#expect(window.assistantLibrary.selectedConversation === conversation)
|
||||
}
|
||||
|
||||
@Test
|
||||
func closingTheLastWorkspacePromotesTheVisibleSidebarArchiveFullScreen() {
|
||||
let workspace = Workspace.sshSession(
|
||||
host: Host(name: "Server", host: "server.example")
|
||||
)
|
||||
let window = WindowModel(workspaces: [workspace])
|
||||
window.sidebarMode = .assistant
|
||||
window.showAssistantArchiveInSidebar()
|
||||
|
||||
window.close(workspace.id)
|
||||
|
||||
#expect(window.workspaces.isEmpty)
|
||||
#expect(window.selectedDestination == .assistant)
|
||||
#expect(window.isAssistantArchivePresented)
|
||||
#expect(window.assistantLibrary.selectedConversation == nil)
|
||||
}
|
||||
|
||||
@Test
|
||||
func assistantFeatureOwnsConversationLifecycleOutsideWorkspaces() {
|
||||
let window = WindowModel()
|
||||
@@ -201,7 +218,7 @@ struct WindowStateTests {
|
||||
|
||||
#expect(window.selectedDestination == .assistant)
|
||||
#expect(window.assistantLibrary.selectedConversation == nil)
|
||||
#expect(window.sidebar.assistantConversationID == nil)
|
||||
#expect(window.sidebarAssistantConversation == nil)
|
||||
#expect(!window.isAssistantArchivePresented)
|
||||
}
|
||||
|
||||
@@ -218,6 +235,7 @@ struct WindowStateTests {
|
||||
window.showAssistantArchive()
|
||||
#expect(window.isAssistantArchivePresented)
|
||||
#expect(window.selectedDestination == .assistant)
|
||||
#expect(window.assistantLibrary.selectedConversation == nil)
|
||||
|
||||
window.selectAssistant(conversation.id)
|
||||
#expect(!window.isAssistantArchivePresented)
|
||||
@@ -233,7 +251,7 @@ struct WindowStateTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
func openingSidebarConversationFullScreenKeepsAssistantSidebarSelected() {
|
||||
func openingConversationFullScreenKeepsAssistantSidebarSelected() {
|
||||
let conversation = ConversationModel()
|
||||
let library = AssistantLibraryModel(
|
||||
store: AssistantConversationStore(
|
||||
@@ -246,6 +264,7 @@ struct WindowStateTests {
|
||||
#expect(window.selectedDestination == .assistant)
|
||||
#expect(window.assistantLibrary.selectedConversation === conversation)
|
||||
#expect(window.sidebarMode == .assistant)
|
||||
#expect(window.sidebarAssistantConversation === conversation)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -445,6 +464,7 @@ struct WindowStateTests {
|
||||
|
||||
#expect(window.sidebarMode == .navigation)
|
||||
#expect(window.selectedDestination == .workspace(workspace.id))
|
||||
#expect(window.sidebarAssistantConversation === conversation)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -518,7 +538,7 @@ struct WindowStateTests {
|
||||
window.activateSidebarMode(.assistant)
|
||||
|
||||
#expect(window.isAssistantArchivePresented)
|
||||
#expect(window.assistantLibrary.selectedConversation === conversation)
|
||||
#expect(window.assistantLibrary.selectedConversation == nil)
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -579,7 +599,7 @@ struct WindowStateTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
func sidebarConversationNavigationIsIndependentAndDeletionReturnsHome() {
|
||||
func sidebarConversationNavigationSharesSelectionAndDeletionReturnsHome() {
|
||||
let workspace = Workspace.sshSession(host: Host(name: "Server", host: "server.example"))
|
||||
let conversation = ConversationModel()
|
||||
conversation.composer.draft = "Hello"
|
||||
@@ -589,10 +609,12 @@ struct WindowStateTests {
|
||||
|
||||
window.openAssistantInSidebar(conversation.id)
|
||||
#expect(window.sidebarAssistantConversation?.id == conversation.id)
|
||||
#expect(window.assistantLibrary.selectedConversation === conversation)
|
||||
#expect(window.selectedDestination == .workspace(workspace.id))
|
||||
|
||||
window.closeAssistantInSidebar()
|
||||
#expect(window.sidebarAssistantConversation == nil)
|
||||
#expect(window.assistantLibrary.selectedConversation == nil)
|
||||
|
||||
window.openAssistantInSidebar(conversation.id)
|
||||
window.deleteAssistantConversation(conversation.id)
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:b9ac495e361094b701333dbc6741fb9eb235201a3428a88baa539e85b899368f",
|
||||
"pageVersion": "sha256:2982b1391ab0cc4693ecb8b635762eee92406f0dc4e73d3f8a0d9fbbaebb213e",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_5a53c5a47b7445f7a7b6f8865297a805",
|
||||
"statement": "TermindApp shares its AppModel and persistence container across main WindowGroup scenes, constructing a fresh WindowModel per ordinary/restored scene (or a demo-configured model for a debug screenshot launch without a request ID); RootView holds the model in @State and provides it to environment and focused scene commands, while the external-authentication Window is excluded from ordinary scene-opening commands.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/RootView.swift#L12-L27",
|
||||
"version": "repo-lines-v1:sha256:83688e26829f58520c3a1708b0dba404afc769843fb45588034eaa933bd07381:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI0YTU0NzRjYTQyZGYyYjU5YWQ4MzRlZTEzYjFiNTczYTlhNzkxOWM1ODg1NDZjOTg4MWI5Nzc5MWMwZTliODEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ4ZjE0OGYxNWFlNTBkMmE3MjZlMGRhYmNhMWI2NWQ0NzVmNTYyYmI5YTlmZWMxZmVjMWEzM2EyYzdjZDIwYjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZkMjk5MDMyMTk5YjM3NTAwZDdiYmRhMTQ4OGI1N2YyNmFjYzUyYjgwZTA1MmQ2MzAzNmZkNmRiZGIyNzMyN2IifQ"
|
||||
"resource": "repo://TFM/App/RootView.swift",
|
||||
"version": "repo-file-v1:sha256:b541d1995a8473c132e0e7aea10c0b56bc96d12cf1d003ffaa0f6bdf1f605eb9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/RootView.swift#L190-L209",
|
||||
"version": "repo-lines-v1:sha256:f02230c1b5e2bf5f434b78334c147ac1c4d41d0886ec8c79fb3019e4d3ebeac2:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBhZDFjODhkMzAwYTM1MWU4M2RhYTc0YzdkYmQ4NmNlMDk1NDNjYWM4YWNlOWE3OWNkZWE2NTA4YjAxNTc5MTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyN2Y2Nzg2ODRlNDYxODQyZThlMDcwNTdiNmFlMDg2N2NkYmEyMjkwZGViM2VkODk1YzIwNTAxNDZkMDhhYTIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI4MGZkOThlZTkwNGMwZjRjZmRlN2EzZGNlOWQ3NDNiMzExOTAzMzhkNzFkMWRiMTdhMTg4NzlhM2QxMGFmYzIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBlMzE1MGI0MzY3YWExZTg4ZDZlOTQxNmMzZGQ4NDRlOTc3MmMzMjhiNTljMjY3NjdmZGRkNDA4MGUwNjUwMWMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L168-L212",
|
||||
"version": "repo-lines-v1:sha256:eb20fcc10fa3cc0f5740fa0fbbf0746859c1e4b7b431188ee4e3672fc48bae73:eyJzZWxlY3RlZExpbmVDb3VudCI6NDUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYxMDk3ZDRjZTdkZDAyOWU5OGI2YWFkMjViMDFiYzEzNzhjOTdlMzA5YmRjMDY0YTM0ZTI2NTQ4MTFmMTgxYWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQwMmQ5OGU3M2M3ZmQxZDQ4ZjUzNjdjZmY5NGFlNGYzNDlhZTYzZmIyMWRiYzkwZmYxYjZhNDViYjNmOWQ5MzEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdjZGEyMmE4ZWYyODNjOGFmOTJjZDlmMmY2ZTA4MzdkODg4MjdjYjBkZGM2OWNlNDFkMTAwZDFiOTdjYWM5MmMifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -39,16 +35,12 @@
|
||||
"statement": "WindowModel separates destination, sidebar mode, page selections/searches, presentation routes and focused workspace state; user sidebar activation can restore Assistant's prior destination, while History is disallowed for focused Telnet/serial sessions.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L10-L134",
|
||||
"version": "repo-lines-v1:sha256:a80b64c725fea3488f4035cb51832f0484d31c2d86c662e6070075493d05a428:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAyLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI2MmYyMTRhYWM2NzNhYTY3NjdiZDhlZGM4MDI2ZmM1YWY4OGIzODExYTc1MDM1MGZlNGNmYWY5ZmMwZTBiNzMyIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJjZGEzMTJmZTE1NTcwNDM5MzM0YmM5MDBkYjQ0Mjk1MzYyZjM4OWY1YzZlZDhlNDE1YjgyMmMwZjdmMDQyYzQ4IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIyNzY2YWJkZGRkYWYzY2JmODc1MTU4MGY1Mjk2NDNhNDE3M2M5YWE0NzQ2MDYyNjhkOThjZDNhYWQ1YjQ2Zjc1In0"
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift",
|
||||
"version": "repo-file-v1:sha256:e2f23f2dff6d1fba8ec85ae36c7e68960694da2a669507bdeb6e4f57ff3e5463"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L15-L112",
|
||||
"version": "repo-lines-v1:sha256:5f84807a4eb3379b2ae4b1841e09ecb705650709c818098c52f8d4ee3e1a622e:eyJzZWxlY3RlZExpbmVDb3VudCI6OTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjgwOTJkZGExNzNhMjQyOTg1N2E4ZTE0NjQzODVlOTU3MDFjZTM5MDU5ZDFhYzhjNGIwYjMzY2RhMmE1ZWEyMDQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE2ODZlODYxYmYwOTRlZTkxYTNlOGZjMTUxZWQ2YjUwNzc4MjRhM2FiMzg0NGVlNDk5NjI2ZWVhNmRlYWYzOGMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L191-L268",
|
||||
"version": "repo-lines-v1:sha256:f5718d1b71ad7c7def6b624cde665c906c9802551770e7f53d160988ddcb29cf:eyJzZWxlY3RlZExpbmVDb3VudCI6NzgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4ZjlmNWVkNjdiMGJlMDE1ZjczN2JmOTQ3NmFhMzMwOTJiM2I1NmM4NDRiMWUyMDYxZWY1ODY1NTNmMDk3ZmYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVmNDY1NmRkY2JkMzQ5ZjUxNWNlMGVhMTk3ZmI3YmRmYjUxYzNiOGM4OTk1MmUyZTQzZWRjNTA0ZThlMjU0NWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY4OWI1ODU5NmY1OWExZjU2ZDIyOGEyMzlhZTI2MzMyMDU3MDg3YTc3MjFiMmZlYWRjYTMxYzI5MWViMWRjZjQifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -75,22 +67,22 @@
|
||||
"statement": "WorkspaceContentView renders stable-ID split leaves and fraction-based branches, previews divider movement locally, keeps a dragged source mounted while omitting it from preview geometry, and disables hidden-workspace shortcut owners.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceContentView.swift#L176-L285",
|
||||
"version": "repo-lines-v1:sha256:5134b0bd318bd899fa1579a853f15b51469662b047f32ff3a55dbccd6ff29e7c:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEwLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJhYTJkODRhMzFkYTc0M2EzMzg3ZTNiNmJkYTE5OTc1Njg1ZWVkN2U0YzQ1MGM0MWJiOWMyYThkYzIwOGQ5NzU3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJlNmIwNDQ5MTQ2OTcyMmU4MzYzYTk0ZTQwNDQ1MzhlMDEzYTJhMjE3ZTM2YjFlNTY4YmE2MGFjYjdiNGM4ZjJlIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJkMDg3ODhjMDM5NzhjMGMzY2I1Nzc5ZWI1ZTZlYjE3ZGU3OTE3OWYyOTYxZmY0ZTFhNWYyYzk1OThmZDkwNTRkIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI1ZGEyNzI3NjZmMDhhODkwYjdlM2Y3NTk3OWFiOGIyNjNiNDNmYWUxN2VkZTcwMTcwNGVlYjAxYjhiMGQ0ODAwIn0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceContentView.swift#L48-L112",
|
||||
"version": "repo-lines-v1:sha256:de3f598a948f020128b7e0148afc9a3163fc403e3912d2c1f9da49b9e8adebf2:eyJzZWxlY3RlZExpbmVDb3VudCI6NjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY0NDkzM2JlYmY3OGIxOGFkNjc4Mjk0MzM1NjdjYzk4MWNlYjdiM2FlOGIyZTRlNjA5NjRlOWYwNDQ4MjJmNTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMxZjM2M2EwMzVkZGQ0Yjc3NDMwODE4YzExOGI3ZWUxMTJmYjk2MDQ5YWRmNThkOTIxMDgzMWM1YWNlZGY5NGEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI2Y2E1NzUwYmI4OWNmMDJkYjkzZGFmNjY1NDk4MDI0M2NmY2U1Y2EzNDY5Nzk5ZmE0YTk0ZmE1NmQ5NWQ0MTEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMwMTM0MTQ3MjQ1YTAyNDFkZGVmNjlhNTFiZmIwNzYzMDI4MzNkZWZiZTcxNWI0ZDNjMmRjM2E3ZGQ2NzBkOTEifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceContentView.swift",
|
||||
"version": "repo-file-v1:sha256:13d650fa687f2e9cb5e519fa50bbab9bcea7a98ae2f58c2ce5a50819d0ef199e"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "claim_64dc4408c2b440c6af34f6b948dac351",
|
||||
"statement": "Vault list/editor children retain identity across the split breakpoint; a covered list keeps its cached size and editor transitions animate position and reserved space rather than resizing the form.",
|
||||
"statement": "Vault list and detail children retain identity across the split breakpoint; a covered list keeps its cached size, and detail transitions animate position and reserved space rather than resizing the form.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Vault/VaultWorkspaceView.swift#L88-L190",
|
||||
"version": "repo-lines-v1:sha256:a665d654beeccc4e628ca99f55b42a632582346d665de97099bef8a725330cb2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAzLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJkYmJhOTI1YTIzZDJiZDAwZjU2ZjIyMjM1MWM3NGUwMGQxNWRkMDI1N2E1NjMyZmRlYWNmYjA5NjI1YzE0ZDNlIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0MTJjYTM0NWNjZjc1YmY5YzA4MDZiY2U2OTViZThkZTgwOGI3OTk4NDI1MWE3YTU0ZDIwMmNmNjEwMWRkNDUxIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIxOWU3NjM1NWNmMTE5OTQ4MGMzZjk5ODM2YjE0ODZjODQxZDg5MWZhYWQ5MDRjNjA4ZTA5MzAyMmQzNzU3YWVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MCwiZm9sbG93aW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1In0"
|
||||
"resource": "repo://TFM/Features/Vault/VaultWorkspaceView.swift#L141-L180",
|
||||
"version": "repo-lines-v1:sha256:ea3408eba17a8ad62fcab847cf2d9db371f73c9e4bee3e1d8c7d387f60251ad1:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU3ZGMxYTQyMjViOGRjNjZmZTk3NDJkZDYwZGM4ZWJmNzAxZjI2ZTNiMzczYzMwODMyM2YyMTQ5Y2U5OTQ3OTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg5OTAyYjBmMzY1MWQzNzlhMWNhNDU1NjA3ZGVhOWJlNTliOTgwNDA5ODBhOTE2YWY4OGNhMWZiNGQ5ZTFjNDQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Vault/VaultWorkspaceView.swift#L89-L138",
|
||||
"version": "repo-lines-v1:sha256:75f1b7baa38bae0fc7b8aeb25d8a6fb039ea80c60be7771c34e72178432cdf9e:eyJzZWxlY3RlZExpbmVDb3VudCI6NTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRiYmE5MjVhMjNkMmJkMDBmNTZmMjIyMzUxYzc0ZTAwZDE1ZGQwMjU3YTU2MzJmZGVhY2ZiMDk2MjVjMTRkM2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijc3MGQ1ODBmMGQzN2Y1MDA5MTExN2IyMTI2MTk2ZWZkMGUyMmViNzVlODJhOTAzYWVjZmE4MWU3YTYzODUyYjgifQ"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -99,26 +91,26 @@
|
||||
"statement": "ManagedCardPage supplies typed sections, stable item IDs, externally owned selection, capabilities and business views to a reusable renderer; drop geometry yields stable-ID mutation intent while resource-specific actions and presentation remain with the page.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/UI/Managed/ManagedCardPage.swift#L76-L223",
|
||||
"version": "repo-lines-v1:sha256:8d6e900fcbca332884d1b6ff34680001cac1f4cba34796e5fcd17076575572fa:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQ4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJhYjFhZWZiMjdjMWRjMTdjMWE4ZjlmYWZhMjYxZGMyNjEyZTIyNGJhMjlhNmNmYjMxMTkyYWQ3NzY4NDQ1YTQ3IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0MTJjYTM0NWNjZjc1YmY5YzA4MDZiY2U2OTViZThkZTgwOGI3OTk4NDI1MWE3YTU0ZDIwMmNmNjEwMWRkNDUxIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlYTRiYWYyYTFlZTkwZWE1MTg1ZmFhOWJlMTZhNmJjNGViYjkzOWI1Y2FlMWUwNDdkNTg5YzljOWQ2Mzc0ZjljIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI1NzJhMzc1MGQ1NmY2N2I3MGNiZDIxZTZiMDRjNzA4MDU1YzU0MDRkZjU0NGU2MWVhNTI5NTU0ZDg3MThmOGNhIn0"
|
||||
"resource": "repo://TFM/UI/Managed/ManagedCardPage.swift",
|
||||
"version": "repo-file-v1:sha256:4dd8898a11a11ac393678c5ed5f49b5c33572705cb8031ae5cb7e33f2c37499c"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "claim_1361b995f8e646c6a534186edcd83dc7",
|
||||
"statement": "The workspace compact Assistant has routing separate from the full Assistant destination and composes transcript/interaction regions with explicit terminal context; Escape cannot fall through from a blocking interaction into closing the conversation.",
|
||||
"statement": "The workspace compact Assistant shares the window-local Chat/Archive route with the full Assistant destination while composing transcript and interaction regions with explicit terminal context; opening in the Sidebar preserves the foreground workspace, and Escape cannot fall through from a blocking interaction into closing the conversation.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L142-L227",
|
||||
"version": "repo-lines-v1:sha256:e96c4ac72148f4e34e9ccbf9fe17ed3b7df5343281431eeba19e4ceb1b85eaf2:eyJzZWxlY3RlZExpbmVDb3VudCI6ODYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMyY2NmOTY5ODZiYTMxNzJlNzA4YmQzZWY1YTMyMzBmN2Y1N2QzNzg1ZmU2YzhmNzdjNGQ4MzdkZjc1OWMzOTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJkMWMxYWE3ZmY5NDI4MTg1ZGFiMjIyMmU3NWI1N2U4Zjg2ZGFmMTJkZjZkNWI5MzMwYTI0YzQ1ODU0NzdjMDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZkY2E2ZmY0MTYzODU2MjUyOTU1NzNiYjQ0ZGRjZGM5ZDZiYmZkOWQ2OGRlYjVkZDRkNjA5OGNjZWRiNTFhNjUifQ"
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L135-L183",
|
||||
"version": "repo-lines-v1:sha256:33fb75cda488502729c72a5eb7a916368c885b12bb4ddb3a392081ee374104c5:eyJzZWxlY3RlZExpbmVDb3VudCI6NDksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlkMzk3NGRkNmVjNTc2NTdhZDkzNGFmZjFjZjk5NDQ2ZThlMjk3MjQ0NWUyZjgwNWE4OWEyODVlM2Q4ZDUwY2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkwZDlhZmMzODEzNzEwOGU4M2I0MmIyMjQwYjI1MDI0YTQ1Mzc1MzA4MTA5ZmQ0YjlhZDk5ODZkZTk5NzU0YjYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L7-L14",
|
||||
"version": "repo-lines-v1:sha256:a3755412e818d877b2c9c59bc75105e21157bb4519e47f13f4ee6fd2764de97b:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZmFlZDhjNWNjMzg0MGRjMjMwYTRiNGY3MTExN2UxZGE4MjRmZmJmYjA5ZTZjMWVmYWY4M2U1Mzc5MTNkNjkzZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNTcxZGE3NDM0NTdjMDNhMjQwNDRhMTk3NTQ2MGE2YzQ4OTllODBiNzUyOGUzMDRkMzE0ZDY3ZmU1NWE0MTYwNiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMWMwMDRmMzdkODZkOTFjYzUyZGY1ZDhiYjAyYjU0YmI1ODk5YjA1MWYzY2M0YTU5ODk2ZDFiNTZjYjQ1NGNiMiJ9"
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L189-L245",
|
||||
"version": "repo-lines-v1:sha256:175f0ca35ef8554da106f04060ad1db3ddbb55e06d22406696bcc9d6bf3b211f:eyJzZWxlY3RlZExpbmVDb3VudCI6NTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMyY2NmOTY5ODZiYTMxNzJlNzA4YmQzZWY1YTMyMzBmN2Y1N2QzNzg1ZmU2YzhmNzdjNGQ4MzdkZjc1OWMzOTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJkMWMxYWE3ZmY5NDI4MTg1ZGFiMjIyMmU3NWI1N2U4Zjg2ZGFmMTJkZjZkNWI5MzMwYTI0YzQ1ODU0NzdjMDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJiODlkNTljMjE3MGEwZWFmOWY0NDc2YmVjMjRjOThlYjdlYTRiMWNlYTY4ZDQ5MmQ2OGNkNzAzOGZkNDE0YmQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L89-L96",
|
||||
"version": "repo-lines-v1:sha256:b2fe9ba7bbc30e22c4c7c13247a4e7f913020f78afc2693088e31914f9c554ac:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOTExZThiNjJlMzNiYzQ4NDFjODZhNTJiYmZkNDI0YWU0MWUwYmJlYTgyNDIyZDEwZTBkMjBiOWYzMDVmYjQwYyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMmExYjk3MzdkZTU1NTExMGY1NWJmMmZiNjdlMTc5NWU1NTgwODQ3Y2E0MzliNGIwZGZiYzdlNWJmYzRlNWI3MSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOGE0ZjU3YTVlYzJkYWUxY2Q0ZmY3MDczMDE0Zjg4YTM0NWJiMzVlMmJmNDFjNDMzMzc4NjE2ZjAzNjM2OGM2MSJ9"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L633-L674",
|
||||
"version": "repo-lines-v1:sha256:1eaca71dcd1d3cb4d04d368a711b73975a872a780134bec5665a19e3066be6e3:eyJzZWxlY3RlZExpbmVDb3VudCI6NDIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhkODg0YjQzZmM5ZTY4YTA4M2IyMmY2MTY3MmZiMmIzZjY2ZTcwMTcxYmQ4N2UwYTU4NjAwZWNmZGQzY2EyYmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJiYTExMjkzMzdiMWJmNjFiNmJkNmEyNjllMDc2MmUyNDg4OWQ0NmU0MmYyNzkwZjY2OWUzMjk1ZTJkNTVkMzkifQ"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -155,24 +147,16 @@
|
||||
"statement": "TFM Welcome projects only this installation's recent connection events and uses their local timestamps, while the History sidebar searches the synchronized all-device timeline and caps displayed matches at 100.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L878-L895",
|
||||
"version": "repo-lines-v1:sha256:21be749246950d4a070db63a1246e321b0b9cbde28bf1bd0c8201b0140ce26b4:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEwZjViNDcwYmMzYjEwN2M5MjUwMTcyZGNjMTU3MjczNTUwZTE4YjcwMDYxNGRlYzkwNDFkYzIyZmZmNzE3OWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBkZjRkYjc1MzQ1NWNlYmI5MjcxNjUzYzY2MGMxZjNiYmJlNDFjMzE0YWY5YWVhMDE3NzY4ODY4YWYyODQ3NDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMwYjIxMmYzZGRiODMwZmUzMmM4YmJlNDE1NDRmN2Y4ODUyYTkzNGEwMzI0YmMzNDUzMGMwZDAyZGE5ZDg5NDcifQ"
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L1224-L1244",
|
||||
"version": "repo-lines-v1:sha256:92f6ca52d5862b6ac1daf4550d6a55c31cac569e353b5709a09a5a15bb0e08de:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE1MjFiZjdjNDZkMTJkOWVhZDU4YzY5ZjMzMWQ1Y2M4NmE4ZDdiOTBjMWM1NTllZThiNDBkNDk5MWRkMzUwMjEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk2YjQ3YTY5ZTg0Mzk2ZTg1Y2JhOGRhNTM2MjBlMjE2YzNjY2JiODA2ZDdmNjc2MDkzMGFhMjc4MjBiNzhhYjUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg2OTE2ODZlNWJmYzdiNWQ4NTZiNzcwMTNmNjkzNWUwNGEyYTdhMmI1NDRmNDQ3MTFiYjQwNGExMDZlY2I4MzIifQ"
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift",
|
||||
"version": "repo-file-v1:sha256:e2f23f2dff6d1fba8ec85ae36c7e68960694da2a669507bdeb6e4f57ff3e5463"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L786-L792",
|
||||
"version": "repo-lines-v1:sha256:a89d5d90ca621038753469ce401c92c24921c2515141ca78fc72195b90062176:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNDM0ZmQzMmQzZjgwNTA3MTc4NmY5MjIwMGZhMDhjOWZjMWRkZmRkZTk4ZDk0MjkyMzZhYTkwNDcwYjA1MTkwZiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMTllNzYzNTVjZjExOTk0ODBjM2Y5OTgzNmIxNDg2Yzg0MWQ4OTFmYWFkOTA0YzYwOGUwOTMwMjJkMzc1N2FlZSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYzkzMmI2ZmJjYTcwYzM4M2RmM2Q5OWNhMjEyODM0ZTIzMmE2NzFhYWVjOGFmOTM1YjZiMWUwNjFhZTRhY2U1OCJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceContentView.swift#L1101-L1108",
|
||||
"version": "repo-lines-v1:sha256:b06b264b0f53578b0e4d329e0fc601d3227ac60da98df096f5d43c9c7aa9018f:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZjk4NmU4YTBlNmIyYzViYWRkZDI5MTZmZDFlN2U2Y2Y3Yjk2ODcxNGI1ZTUzNWNmY2VjMGMzN2JkMGVlYjU2YSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTUyMmM0MmNkMTljNmQwM2Q4MDhjNDUyNzIwNTUyODI1YjdlYTFjNWI0OTFiMjE4NTExY2FjNzQxNWNmOWQ5YiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiN2RlZDU3Y2RmNjI4ZTdiY2ZiN2Q3NjYzMmE4ZDcxNDg3MzRjMDQxYmM2NTAyMGRkODk2YmVmMTg4YTdhMjIxNCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZTgyYTRjY2RhODM4NTlhOWVmMTc5N2IxNWU4MjRjYTgxOTBhYTA4MDU0ZTliYjM1NTRiNjE3MzVmZDBjZjMzOCJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceContentView.swift#L1396-L1408",
|
||||
"version": "repo-lines-v1:sha256:d4bb3faa4a906b5c4dbc0e5efa8939528f74556414d4af6632d39e58b9fecbf2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIzYmUyNjAxMjMwZWY0MWRmYmIwMDI2MzNkODA0MjRhMTliMTY5ZGE2YWU4YjgxOTFlYjRlNzM2ZGJmYjBmYWYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdiMDgwY2M5Y2U3NjNlOGNkYjRhNjdkNmZiMWNkMDRlYTc2OTAwMDIxMzkwZmY4NDE3NTZiYWQ3NmQxM2JlMGQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY2NjE4NmUwZDBiZDI4NzIwOWQ3ZTU5NzM1ZDUyMjVmYWVmMDAxNjNkM2I1ODAzMDdlNzI0NmZhNzc0MzUxNGUifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceContentView.swift",
|
||||
"version": "repo-file-v1:sha256:13d650fa687f2e9cb5e519fa50bbab9bcea7a98ae2f58c2ce5a50819d0ef199e"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -213,42 +197,42 @@
|
||||
"statement": "On macOS 26+ the native NavigationSplitView owns the Sidebar background with no extra glass overlay; older systems use an AppKit visual-effect fallback. The mode rail uses one glass capsule with a neutral moving highlight, selected accessibility traits, a key-window focus outline and Reduce Motion-aware animation.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/RootView.swift#L33-L47",
|
||||
"version": "repo-lines-v1:sha256:7477fccf1fdb5be27730274cc5816b615e7cf9555a753112c0c99bd77fda4bc7:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFmMDhhOGI4NmMyMTkzOTMzMWNlMmRlNzQ4Y2MwMjQyODI5NmExNWUyOWUwMTJmOWI1YjI5YmE3NTQ5MDViOGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjUxMDM0ODFjNTdkMGYwZGMwZjc2Y2QyY2M4YjM2MDRjNGU4Mjk2ZGE0MTIyYWRkMTllODE3NDVkYzdlMzMxYTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU5OGYxYTA0YmVlNzFjM2NmYzJiNDcxOWU2ZmQ5MGM5NmY0N2E5MWU0ZDJmZGU3ODgzNTNjMDM3MDQ2NmY5ZGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUxMmQ1NmZkOTU2YzBiNzRhYjBlMDdlZDU5ZjJlM2QwY2NkNTUwNDhkNmQyMGIwZTU5ZGQ4ODVkMGU4NjA4MzQifQ"
|
||||
"resource": "repo://TFM/App/RootView.swift",
|
||||
"version": "repo-file-v1:sha256:b541d1995a8473c132e0e7aea10c0b56bc96d12cf1d003ffaa0f6bdf1f605eb9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Design/DesignTokens.swift#L447-L463",
|
||||
"version": "repo-lines-v1:sha256:279c40cc0192345ce03939e3f215bf70c3dbfffa7b28f80fe9c31b3ce766b042:eyJzZWxlY3RlZExpbmVDb3VudCI6MTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgwN2M1NjJkZTJiYWE4ZmNiNDJlYjk5ZTI0NjcyZWJiOTAyNWZiZjI3MWU5MGJmMTI1NWFkYWJiZjQwYjcyNDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJmODMyZTZhMzJkOTBhNDc5MzNhYjEzZWE4MThjNWNkYjg1ZjlhY2ViMzYxODhhOWJhNzE1MGJkNzc4NDlkYzUifQ"
|
||||
"resource": "repo://TFM/Design/DesignTokens.swift",
|
||||
"version": "repo-file-v1:sha256:a399d6e4ba072f0f792abfd92a40ce867133ae9d91121d5a9562bca54cb9cce5"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L38-L94",
|
||||
"version": "repo-lines-v1:sha256:cfbd8237ba2ca4f4797b4bba5216aced08897e568ba2875816a470bcd4ae3da3:eyJzZWxlY3RlZExpbmVDb3VudCI6NTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZjNzM1YTQ1NTZjMmZkNjgzMmVlZTgyY2Q4Y2MyYzM5MzA0YTAxNjdmNWZkMTVlNTgwYWI1MzRiNzQxMmUyZDAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFlNThhYjBjNDdiN2Y5OWVkOGM1OGM1Yjg2Njc2NWU3MDQ4YTZlZWI2YmJhODExYzRmNzcxMDk1ODZlMzQ2MWUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImEwYmUyNzE1MDFmNzVhZWZlNjgxNzFmMTU5MjZlMGUzOWFkYjM4NmQyZjMxNjU2YzM0N2UzOGJlNDhiMDY4YTMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJiODlkNTljMjE3MGEwZWFmOWY0NDc2YmVjMjRjOThlYjdlYTRiMWNlYTY4ZDQ5MmQ2OGNkNzAzOGZkNDE0YmQifQ"
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift",
|
||||
"version": "repo-file-v1:sha256:e2f23f2dff6d1fba8ec85ae36c7e68960694da2a669507bdeb6e4f57ff3e5463"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "claim_b0456a62ec814a4597959476eb560bef",
|
||||
"statement": "Assistant full-screen and compact surfaces share one window-local Archive flag while retaining separate conversation selections; native blank-area menu checkmarks read that flag, but sidebar Show Archive preserves the foreground workspace and full-screen Show Archive changes destination. Compact open/close clears Archive, and the compact archive can explicitly open full screen.",
|
||||
"statement": "Assistant full-screen and compact surfaces use the window-local selected conversation and Archive flag as one mutually exclusive route: Chat/home/Archive actions update both surfaces, Sidebar actions preserve the foreground workspace, full-screen actions select the Assistant destination, and closing the last workspace promotes a visible compact Chat or Archive.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L1212-L1220",
|
||||
"version": "repo-lines-v1:sha256:0349ae49bfc8fdec17e0efc8f55785ca048e0292ef691b180df44958e76afe89:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiY2Y1YTNhN2U1ZmQ4NTUxZTgxYWQ0ZGE0YThmM2RlMzM0MzQwOWYyN2VlYTE4OWNjNTdkZjY2ZTYzODM2OWFhNCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTUyMmM0MmNkMTljNmQwM2Q4MDhjNDUyNzIwNTUyODI1YjdlYTFjNWI0OTFiMjE4NTExY2FjNzQxNWNmOWQ5YiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZmQ5YjI3NDRlMTc0MzY5OWFiZWRiYjc1MGQ0ZGYwNTMzNjA4Y2FjNGIwZjA5OWEzNTYyZDdjMTg3ZTg5NWE4ZSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjRhMzY1YTkwZWMxMWU5MDQzMjc1MmNmOTM3NmVjNWVkMzZiODBiYTVlOGU2ODU0ZmNmOTg5NzBkMzA0NDQ2OSJ9"
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L16-L50",
|
||||
"version": "repo-lines-v1:sha256:51fadb1bc9a3ab8c7a7870ce75e2ec530476b9ef3d7c1a0ff6aaf332b9aba385:eyJzZWxlY3RlZExpbmVDb3VudCI6MzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdjNDM5YTE4M2ZlMTJlOGM1N2I4NjFjY2FiM2E0ZWFlMzM3NDQ5OTU5NjYxODcyZjEzZGJjMzgzMjEyMGVlZWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlhNWY2NTk4ZTYzNzgwODdkZjQ0ODlhZjc5MjY4MjgwZmVhYTllNzgxMDk3ZGQzMjhjYmRjODAwMmVmMGFlOTkifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L16-L51",
|
||||
"version": "repo-lines-v1:sha256:544e8c7302b1637b1bca13ec85eaac8a0cada814c0062dde16d23324f9ecc4bd:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdjNDM5YTE4M2ZlMTJlOGM1N2I4NjFjY2FiM2E0ZWFlMzM3NDQ5OTU5NjYxODcyZjEzZGJjMzgzMjEyMGVlZWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFjMDA0ZjM3ZDg2ZDkxY2M1MmRmNWQ4YmIwMmI1NGJiNTg5OWIwNTFmM2NjNGE1OTg5NmQxYjU2Y2I0NTRjYjIifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L1424-L1437",
|
||||
"version": "repo-lines-v1:sha256:8a5da0f821cef0cd14db4edfcf550a3b7eaffd9f55cb7a738aafdc7f4bf46a11:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIzODdkYjI1MTY5MjhhYzMxYjY5MWZkY2Q1OGU3M2Q4ODMzYjUzNzBhZGQ2NTRiNWNkNDg0ZjU3YzEwYWI2MTkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZmYjkyOGM5MmNjNjM0OTk5NzYwMWMzMDEzYzc2YTVhYTM1OGE5MGFjNjIxNTMwMWQyYjk1MDBjYTQ4ZDZmN2YiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNmYzgwNDZlY2JkOTQyOGVmYzVjMDEyNGY1ZDRhODM5ODEyNTQyNDNiYjY1NTM5MzliZTI1MDVhMGE1NGY3YTEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L633-L660",
|
||||
"version": "repo-lines-v1:sha256:c05d9d7cd2c895e83e4ba078c2135b4b99ab87fa9df4b98e0465c0f6ef17310e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhkODg0YjQzZmM5ZTY4YTA4M2IyMmY2MTY3MmZiMmIzZjY2ZTcwMTcxYmQ4N2UwYTU4NjAwZWNmZGQzY2EyYmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIzNTFjNDQ4YzUzOTEzYWIyMDVkZGQwZDFmODVkNGFjM2NmOTg0NjBiODdiZDYwMTgzZmUwNGM0NTEwM2Y5MGIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBiYjI4M2MwMDEyYzI5MzFjNDk4NDZhMTEwNDVjZGFkNWE1YzUzZGVhNDdiODE1ZTFmN2Q4MTU4Zjk4ZTJlZGIifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L633-L674",
|
||||
"version": "repo-lines-v1:sha256:1eaca71dcd1d3cb4d04d368a711b73975a872a780134bec5665a19e3066be6e3:eyJzZWxlY3RlZExpbmVDb3VudCI6NDIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhkODg0YjQzZmM5ZTY4YTA4M2IyMmY2MTY3MmZiMmIzZjY2ZTcwMTcxYmQ4N2UwYTU4NjAwZWNmZGQzY2EyYmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJiYTExMjkzMzdiMWJmNjFiNmJkNmEyNjllMDc2MmUyNDg4OWQ0NmU0MmYyNzkwZjY2OWUzMjk1ZTJkNTVkMzkifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L91-L98",
|
||||
"version": "repo-lines-v1:sha256:95c6fd8182584ff7be20043a661d8cdebaa3dd3439eb9185ed127041261bc575:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNmU2NWIyNTU5ZWZmOTJmMGEzYTA2MTgzNThiYTIzMTVjZjU5OGNkZDU5MTU2NThmM2I4ZDBjOTYyOTU1NzZkYyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMWE2OGZlNWRiMGUzYTU4YWE0ZmE4ZjlhMDY2OWRhNGMxM2UzM2U4YjA1NmM5YjIyNjg2N2Y5ZTY2YmM5MDUyMiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMjc0YjcwNzBlM2FjOGQ3OThhOWJiNDcyM2FlOWQzZDcyNjYyMjllNDkxY2IwNTRlOTJlNjc3ODU3OTQxY2YwZCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYzE0NzRmMDE5Y2U2MjliZWY3NzQ0ODNkODMyMzE5ZTNhYTdhNmUyZWMyNzQyMTAxZDBkYmU3MzA0ZmIzZjI3OCJ9"
|
||||
"resource": "repo://TFMTests/AssistantConversationMenuTests.swift#L10-L41",
|
||||
"version": "repo-lines-v1:sha256:c18da3c5110d579d13bbfcbd45b7c1df42d7b16121c21396f11d423d1a49b506:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRmM2U5MzFkMTU4OWY4NzViNDRkNDkzZDAxZWQ0OGI1ZmEzYjMxYjZiNzljMTAyNzY0ZDgxMTFmMDg5ODQ0MGQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJlZmE1NjgyNzlkNDQ0ZjkyZmY0MDg4MGI3NDFiNTQ0OWViYzk1MzlhN2RjM2JkODJjMjU3MmY0MzgyZTZiNGUifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AssistantConversationMenuTests.swift#L9-L40",
|
||||
"version": "repo-lines-v1:sha256:7196e06e9dc8a27ab84f9e882ab334752ea92d105ede6662f4caa406f3348cb3:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBiZTY3NWZhODQwMDAyZjE2ODExNjhkODFkMWNhMTJjNDIzMmFjMzY2YzdjYTU1NThlNWNmOWUwMDVmOTQyY2MiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMzZmY0MjE3Yjc1YmQwYzMwZWVhZjlhN2NlMDczZTA3NWVmZTZlMWY2NWRhNzZkMzAzMmFmNmQ5Y2RhOGE4MDIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjYxY2U4ZjAyY2Y0NzE4ZTA4OTNkNzFlNTJmNzc1YjM2NDQ5OGJhMWYwNjkwMWQxOWE1MWE2NzllYmU2ZGFkYjAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAifQ"
|
||||
"resource": "repo://TFMTests/WindowStateTests.swift#L93-L151",
|
||||
"version": "repo-lines-v1:sha256:607c2ae7bf7cc54137e08ff69506196279b4f6568d1de691d391b48a1495c11d:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRkZDcxZDdjMDMwMzljNTI1YzZhNGEyMGQ3YjY4MzhmMjQzZTMwY2I2YTdkMzNlNTE1ZmMyNThhMDE0YWQ2YzIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ3ZDQ5NzY4MjdlZmY0MjA0ZGQ3YmU3YmI2NjIzZjhhZTg4YzNkMGNiNTE2YjEyYzQ1YTBmOTA4NjBiMjI1MDMifQ"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -257,16 +241,16 @@
|
||||
"statement": "MainWindowCoordinator requests a UUID-valued main scene for moving a workspace and leaves the live workspace in the source until the native destination registers; registration takes and opens the same workspace in the destination model rather than closing and reopening its session.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L1333-L1347",
|
||||
"version": "repo-lines-v1:sha256:da353e4f93aafdf617967c1f193fac28aa52e7c78a72a9496406e7cb28643add:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg1MGRmNGNiMDJlZjZmZmY0MGVjMDk1Y2RjMWRmZDQ0ODZhZmVkMTNkMWZlNTkyMTgwMzQ0NzUyMzBjNTk4Y2YiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA1YTkyZGE1ZDMxNjBmNGNhM2UxYTgxNzkxMzgwZGRmZWZjNzU0ZjQ0Mjg5YmNiYWMyZGI3MDczNzYwOGE1YjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFhNmQ4OWYyNDA1OGY0ZWVmNzExNzA4ZTc4ZTBkOTllZjZhY2RmM2RhYzVlZjJiYzdiYTcyMTlhZTk1NWQ1YTkifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L613-L618",
|
||||
"version": "repo-lines-v1:sha256:eb93dac75da2ca026ed325b2ea360204f635a2f0bb96579dba65983ee5e01498:eyJzZWxlY3RlZExpbmVDb3VudCI6NiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZTZiMDQ0OTE0Njk3MjJlODM2M2E5NGU0MDQ0NTM4ZTAxM2EyYTIxN2UzNmIxZTU2OGJhNjBhY2I3YjRjOGYyZSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTkwOWE1M2E2MThkMDI4ZTFkMzAwMGMwYTdhYmNlZWNiZTVmYjM3ZjRlNTExZWZlNDY2NDNmYWQ2ZTY2ODcyZiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNzNiYjU5YTQ4ZDg3NjhlYjVmNWQ3ZTNiNTNiYTIzYjQ0OGQyMmUzNzNlMzNhMjViNWJmZjkzNjFhYTEzNDdhOSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNGM0MmEwYTUwZjc0MWMxYmE3MDEzNDMyMzMwNzc1Njg3NDI1ODRlMTM4M2RmMWRjOGJlOGE4NjAyMGFjNGY5ZSJ9"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift",
|
||||
"version": "repo-file-v1:sha256:d313a5cd993d79e7820782ec1317c58bf4bd5483e03f9019245667f260b210f4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Platform/MainWindowCoordinator.swift#L139-L197",
|
||||
"version": "repo-lines-v1:sha256:19cdd2415ed0718be3cd7bddebdd4730f6e57c91d93dc56c7b0c5058e42236e8:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZDUzYmFhYzE4Nzg1MmI0MzFjMjMyZTA1MTYwNjFkNDk2ZjdhMjE1NmVlNGJmN2RlYTY0N2ZjNjY0OTg2NmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFmNGVkYjE4NDBiNmE1NzQzNDljYjhiNGEyYTJjMGY3YTk1YjAwYzg1NDhiZDAxZDgwNjdhMjc0OGQwYjA5ZjQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjgwODZmMjNhZmUyY2EzNDFlNmMxYzg0NmU5ZjVmMzk0Y2NlM2M2ZmU5OTcyMWRmNDU4MTEzNGE3OGIzNjRjOTgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxZmMzMjQyOTY2NzdmNGE4OTRiNjM4ZWZmY2FkZDZmN2E2NzliODgzZjgyMGE3M2JlMTU3NzI4OWJjMDZkNGQifQ"
|
||||
"resource": "repo://TFM/Platform/MainWindowCoordinator.swift",
|
||||
"version": "repo-file-v1:sha256:5225124cc24e1d8c5858385ce4e7d8c924938fdd6ea6102f195f98ebdd98e40c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -293,24 +277,16 @@
|
||||
"statement": "The Navigator's workspace inline rename starts with the full localized displayed title before the native field receives focus; commits delegate to WindowModel, which rejects unrenameable workspaces, trims names and stores split-workspace names on the group but single-pane names on the pane.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L1473-L1503",
|
||||
"version": "repo-lines-v1:sha256:94d3d9aeab1a6c1adeb0bd781287fd4fc7d23300fd29af1bc8c061b11cf8ffc2:eyJzZWxlY3RlZExpbmVDb3VudCI6MzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI5ZWZlY2QzYTViODY5ZmZmYTZlMWZjODg1MTVjNzEwZjhiZTUwMGUxMTkwMzIyNTZmZjczMzdhMjgyMDU4MjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjYwNWZlM2RmMTc2NjQ1NjYxYjk3MjBiMWFiMGM2OTgxOTJhN2IyOGRkNjJiMzA4OTA3NWVlNmViZjRjYzgyMzYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxY2VhN2JlYmU0Y2RkYzcxYWViY2NjZWNhYmFlOTRkZGM5NWYyMmY3NGVlZTYxMWIwMmNiNWUyYjJiZjg3NjgifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L337-L353",
|
||||
"version": "repo-lines-v1:sha256:2a55777bcb0eec1c64042a775fbf26aa722956873948a19184682013f935954c:eyJzZWxlY3RlZExpbmVDb3VudCI6MTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFjYjRjMjQzNTM4YzI0ZmNjNGJlMmE2NGU3ZDEwYjc5MDZiODhlMjU5YjZjZmFhOWQyYTU2ZDFhN2Y5OGFmN2QiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk1MzI4MjRjNjkxYjc3YTQ1MDdhMjQ4ZDZlZjIzYzI0ZDc0ZGQyMDQ0NGEwNjc3NzgyN2E3MTU5Yzc2YWY1ZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBmYzVkOGVjN2Q1M2E5MTkzMzI1NjYzZGMwZTdjYmZiZDgzZTg3ZGY3N2UxYzk2NmI2NjU3ZmU2NTc4NDBlMGQifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift",
|
||||
"version": "repo-file-v1:sha256:d313a5cd993d79e7820782ec1317c58bf4bd5483e03f9019245667f260b210f4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L447-L455",
|
||||
"version": "repo-lines-v1:sha256:9c46af93272d913c6a3a16e546e146a9242243a366ac0e48331482a97980e882:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzZiZDExNjdmMmYzY2UwNTZmZDZmODc5YWIxMzMyNGI0Zjk4Nzc4M2RmOWJlY2Q5NGMwNDFiYjAwYzRjZmI5NCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYWY3MTQ0MTIwY2EwZWVkMzE0ZjA3NTIwODc4M2FjYWM1YjI3ODg3YmM3ZTEwYTE0MDNkMjlkYjExNzhmZGI5YyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMjYxY2Q4YzNiN2MxMWZiNmJkMjQyYTJhZTU0OTczOTI4NjBiODliY2MwOWJhYTdjZmJkNzc2Mzk0OGExMTY0OCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMmI4YjBjNzlhOWNjYjEzZGEyYWI0ZGYyMmM4MjAzZTg3ZGMzNTNlOWVhYWMwYmIxOGI3ZDRhYzRlYmExODgxMSJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/WorkspaceNavigatorRenameTests.swift#L89-L97",
|
||||
"version": "repo-lines-v1:sha256:0fc39b77342c244e81470d358a1d67076f1f743003c383f218be0a3009aca381:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNGY4NjM4NTcwMzRlYzU0MTVmY2I3YzliMmM5ZDA4MzIwNjMyZjlhZjU5ODkwNjE0Mjc4Y2I5OTYyMzYwMWJhNCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYWFkMTU4MDNlYzMxYTU4ZTBkYmNmYTkzM2Y0ZGMyYzhlOTk5NmE5NDBhMTJkZDMxNWU1OTY1YmIzODJmOTI4YyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMzFjZWVjOWU1YmYzNGM0YzllNDljN2FiMzI0ODE0ODY4NTkxNGU4NWRiZjkzODIyMGY2YTMzN2U3N2FhOTQ0ZSJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/WorkspaceNavigatorRenameTests.swift#L9-L32",
|
||||
"version": "repo-lines-v1:sha256:cfbdccc4f0bd874f1bf5c03e0fe623bde5aadbc9aab80a5866685fa3e6ac2950:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU1Y2RiZGUzMzQyNDE0YzU2NjcyYTRmZjdlMDNmYjZkMmI4OTMzNjY1ODVhOGI2MGFjMTkyYjg5NDNhNjJlMzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc1NTJjOTcxMTBhMDM1ZjNkYjQ2MWIzM2VjZmQ1MzAwNzk5ODMxZWJlYjdlMmEzOThkMzJiY2ZmNTJlYjFlNWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZjNGY2MWQ0YWEzNzkxMTQ4YTUyNGZmNzA2YWE5YTg2MjQwMDZkNGNhMTIzZWM3NWU4YjQzOTRlYmZkYjdhOWUifQ"
|
||||
"resource": "repo://TFMTests/WorkspaceNavigatorRenameTests.swift",
|
||||
"version": "repo-file-v1:sha256:fab4870002f3a38207f95499279b345c427db9d26929c8ccefcfcefb6b7ddef4"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -319,24 +295,16 @@
|
||||
"statement": "The Navigator overlays an AppKit-compatible workspace layout drop receiver above native List rows; it uses live window drag state and measured row frames to preview insertion, excluding the dragged workspace when calculating its mutation index, then reorders a workspace or detaches a pane only on a valid drop in Navigator mode.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L1154-L1166",
|
||||
"version": "repo-lines-v1:sha256:9998c91d1d7004b0a89c1479e7e6be4e31c461f493bcfda14a15209746173e14:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwYThhM2ExNzBiOWM2OWY1YmQ5NzQ5ZjA2MGYzODIwNTg0YmYxYWMzM2U0ODBlYzVkYTMzYzBmMzlmZmIzNGEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE0NDA0M2I2YTFjZjU1MzZhY2ExYjViMjg5NWY1ZWFiODUwYjg4NGU3YmJmYzBkNWMyZmViNzg2NDA4NzBiNjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBlM2QzMjBjMjliMDA2NGVmN2U3NjA3NjY4N2RhNDhiZWZhZmE2YjdjOWY0ODRlYTc3MThkMjZjYTY5MTU4OTMifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L1460-L1471",
|
||||
"version": "repo-lines-v1:sha256:6d208ced125d8ee92bede8c6cc1fc9d2e3a783390f397b9597820cb59d3e76e3:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM1N2I3NDQ5YTRiYWMxMDJhNzc1ZDBmZDdhZTU4YTYyMGEwZmFmZGU1NTNlZDYyYjgzMTA5ZjQwMjNiZGYxYjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM2M2RiZDZjMDhiMTJhMTEzYTVjYzUyYTg2MmI4NzA4ZjVlZmI2ZmRhMWM1NTU2MzQ2MTBiMTBmOWM0NjI4MzMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMwMGE5YjAwNjFiMzcxYjRmMzJiZThhYzI2NTQwNTJhMDI5NWZhYmM0MDgwNDk5ZDUwOGVhNjE4ZmFkNmUyNzkifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift",
|
||||
"version": "repo-file-v1:sha256:d313a5cd993d79e7820782ec1317c58bf4bd5483e03f9019245667f260b210f4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L215-L300",
|
||||
"version": "repo-lines-v1:sha256:a093210dd716e3f4a599c63bbbf234847585ca0d26b8012f6c859beca609a506:eyJzZWxlY3RlZExpbmVDb3VudCI6ODYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU0NThmMzc1OWM3ZDY1YmMzZGE3ZDY1Y2I2NDc1ZGMxOTY2ZGE5N2YyYWMzYmQwMWU0MGIwNDhlMDFkMGRkZTAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcwYzY4Yzg0YzZjNjNlMDQwY2E4NzRiMzkxN2JkMWQwNDY4ZTllMmU2NmNkYjNiZTZjZTBmMTEyYjlmZTc4MGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzNzVhMzVjMjgxM2Y4ZjgyY2JkYjQyMTdiOTZiZjdhYTJhM2RmNGMxMDMzMmY0NGM4YTkzMzJiZDY1YTk0N2UifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L23-L65",
|
||||
"version": "repo-lines-v1:sha256:a7cbc6b0b6121f16bdecef2e8a1dcf8e3e91b079155aa73c3cb9c35e62024017:eyJzZWxlY3RlZExpbmVDb3VudCI6NDMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNjYTMxYWJhNjZmMjJkMGM4YWViMDU5NDRjMzczMGI5M2NkNWE0NmJkNDU0NDBjZjI2OTU4ZTNjNzZhZTA5ZTciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ0NGE3ZGE5ZWRkYjJiN2I0YjhkMGQ2NzZjNmI4ZDhjYjY1NjY2NmYzMmQ5MTZhMzU4ZDIwNTI1MTE2NDdlOTIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/WorkspaceNavigatorDropTests.swift#L210-L302",
|
||||
"version": "repo-lines-v1:sha256:2b121eae49ca13c02687dcaa64b06609d3d014e1cc8db3514211dc6736ac99fa:eyJzZWxlY3RlZExpbmVDb3VudCI6OTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY4ZmRiMWE0ZmJiNDNlODMyMWI3MmU0Y2Y1ZmI2MDViMzJjMGRhMDlmMDVjZjQ2NjRkOTk1ZWFhYWZmZjk3YjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJmOWIwMzZlYTA1M2VjNTc3Mzg3MTM0NTM5YTAwNzQ3NWQ1NGE3MDgxZmQ3YTE3NGMxZTQ2MTljMGUwZmJiYWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM4NmI0NDc2YjRiY2U3YmU2YWFkOWRjZmNiMTEwMjZhNzY0OTQ3YmRmNGRjNzQ2NDk1ZmVjNDAyYjc4MDA4M2QifQ"
|
||||
"resource": "repo://TFMTests/WorkspaceNavigatorDropTests.swift",
|
||||
"version": "repo-file-v1:sha256:6bd8d3af948ec115f4e6a5d29aff75335fa161fdef441a23e405cf4b6e082020"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -367,16 +335,12 @@
|
||||
"statement": "Workspace Navigator expansion is a persisted presentation preference, independently of workspace ownership: selecting a Vault or workspace destination expands its section, and its row menu routes selection-sensitive pane actions through the window model.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L13-L21",
|
||||
"version": "repo-lines-v1:sha256:0119f0738039c9a8de6bbd2fa113f0fae4f84a64d939206fbf56218631307858:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMzM4ZDdjNzcyZTllNTA3YmFmZWQwYWNmMzk2NDlkMWUwNTAwNDdmNTdhYzZkYmI1NTE4ZDE5NGQ1ODljMWM0MiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMDc3MDVlMWM0NjRjMDRmZDdjOGE0NTIxNTliNWUwMmMyMWNmYTRiMzI2OWQ4NzEwMTMxNTdmYTczZTU2MjkxNiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZGFkODQ0MzM5M2NhNjA2ZTFjNzRmZjhkNmUzOTRiMzhhNTVhNDAyYTk4NmE3N2I5ZjIxOTI4NWVlODBlYTc1ZiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiODY5MTY4NmU1YmZjN2I1ZDg1NmI3NzAxM2Y2OTM1ZTA0YTJhN2EyYjU0NGY0NDcxMWJiNDA0YTEwNmVjYjgzMiJ9"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L521-L653",
|
||||
"version": "repo-lines-v1:sha256:4b8c972e35e30d61882503efd4fb3130fb6fe606f8e72bf1f032227e07f44e12:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMzLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI4NTU1YzkxODExYmNmMGVlNjEyY2IyODI5ZDA4NTZmZjBlNTg4MzY5ZjM2NDFiM2Q2MTNiMGNkNDhlYjEzNzU2IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI5OTliZGVmZWVhY2E2MzQwZTAyOTBkYzg2ZTg4OWM4OWQ1ZTE4OWFhNWJhNDRiNTg1YjNiNzA3MzRmNGE2MmQ4IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MSwiZm9sbG93aW5nQ29udGV4dEhhc2giOiI0MTJjYTM0NWNjZjc1YmY5YzA4MDZiY2U2OTViZThkZTgwOGI3OTk4NDI1MWE3YTU0ZDIwMmNmNjEwMWRkNDUxIn0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L59-L67",
|
||||
"version": "repo-lines-v1:sha256:f207ff2c8d5cfa18b88454ff571f6b743e835306445fd638cce7420dc2396dc3:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYzU2NDUyNDhkODhiZGJlZDQyN2M2NGE1ZmEyMjFlNWI1YzcyOGFhYjA1NGJkOTMxMjI3MGQxMzc0Y2M4YmU3NyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNmMxM2E0NjEwM2VlMTJjNjQyMWZmMTEzYzVmMmVjOGQ3N2U5ZjA0NTVkZWYyODY4N2NjNzQzYTZkMTYxMzk0MyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNmUxYzM0ZjM2ZTliZWZlNmYzNTFkNTBjOWMzNzM4NDA3ZTk5YWUyNzYxYzRkZTc0ODBhOTFjY2U2YWM1NGUzZSJ9"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift",
|
||||
"version": "repo-file-v1:sha256:d313a5cd993d79e7820782ec1317c58bf4bd5483e03f9019245667f260b210f4"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -385,12 +349,8 @@
|
||||
"statement": "The Snippets sidebar filters shared host-library snippets with a sidebar-local footer and can insert into a live focused SSH/Telnet terminal; executing a risk-classified snippet requires an additional confirmation. Its persisted package-folding state is distinct from the full Snippets page's expansion.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L197-L255",
|
||||
"version": "repo-lines-v1:sha256:76b9b922cfec03a2fef27dcb44e80e758ee095eee0272311fe5fef4cbe41333c:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjczNzBhNmFmYzRjYjI5NGJlNWI4NTlhNTU3NGRhNDhkNGIyYzhmOTY3ZWI3NWNmYjE5ZjIyODYwNjA0MTdmMDMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMyOGZhNTE0NGY3YjJhNDE3MjUzZTlmMTRlZDE3OTliYzliOTA4MGJkNDExNGU3OWViMjI2YmE0NmNjYTViNTcifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L520-L693",
|
||||
"version": "repo-lines-v1:sha256:7b0b4141e0cdfc83f2251f8e4e95ac566375022b9a5492a3c1f4ac360e638f09:eyJzZWxlY3RlZExpbmVDb3VudCI6MTc0LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJiNzE3YWY2MGVlZTU5YTJhOGJjMWE4N2RkNzlkMDM5ZmI4YjQzZGQ3Y2Q4YmJiYzVmM2IxODFmNDZlMDkwNjRmIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIwOWRkNGI3YjQ0YTg4NjQwZmVhYmIwMjk5NGFjYTg4ODM5ZDc2NmQ1M2JjYmJmZjQwNzQ0MTBjMDFiNTk1YjgzIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI0YmExNzE1ZTAyNDdiMmYxNzZkYzY1MTM5ZDFkNDQ5YWIwZmJmYzg0OTE0ZGVkZGViNDQ3NTczZTA1YzUwNmFiIn0"
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift",
|
||||
"version": "repo-file-v1:sha256:e2f23f2dff6d1fba8ec85ae36c7e68960694da2a669507bdeb6e4f57ff3e5463"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -399,24 +359,12 @@
|
||||
"statement": "The History sidebar projects SSH command history, SFTP browse history, or connection history according to the selected workspace's focused pane, while Snippets and History use AppKit ListViewKit-backed rows with separate footer search and blank-area menus rather than changing the titlebar Find target.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L309-L431",
|
||||
"version": "repo-lines-v1:sha256:d845dfbd8a915f9f2789556b59bd3df536b4ff664b82c9da52b26da1051a34d5:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIzLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIxNjhjMmU4N2Q4ZTEyMTA1YjZkNTFmZjdjMmQxNjUxYWFkZDcwMjY1ODIwNmQwZmUxMzNkZjM0ZDM1OWQ4ODY1IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0MTJjYTM0NWNjZjc1YmY5YzA4MDZiY2U2OTViZThkZTgwOGI3OTk4NDI1MWE3YTU0ZDIwMmNmNjEwMWRkNDUxIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIxOWU3NjM1NWNmMTE5OTQ4MGMzZjk5ODM2YjE0ODZjODQxZDg5MWZhYWQ5MDRjNjA4ZTA5MzAyMmQzNzU3YWVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIyMjFhMzQ0MWM2MThlYTk1NWEzMjVhMmViNGFhMjEzNjk5Njg5MWJjMmI4YmM2M2M1MWEwYzliMDIwZWUwYTQyIn0"
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift",
|
||||
"version": "repo-file-v1:sha256:e2f23f2dff6d1fba8ec85ae36c7e68960694da2a669507bdeb6e4f57ff3e5463"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L533-L567",
|
||||
"version": "repo-lines-v1:sha256:ec0c5c55c65e3900b48f42d3a12737f488e6a620498034a28bf46b4d47d02a5f:eyJzZWxlY3RlZExpbmVDb3VudCI6MzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg1NGE5NjIzNGFlNWVhYWRjNjkyMTlkOTQ2NzYxODI0MWRhZGRkMTgzZTdjMjM1ZDk4MzU4YTRmNDE0YjViMzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRlOGQxZDVlNjk5YzI0ZjNhZTk0Yjk2MzZhZTk1MzE0Njc3Njc4Mjk1ZjQ0YTUxYmExNmZjMDhmNGE3MTViNjQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L768-L779",
|
||||
"version": "repo-lines-v1:sha256:5d4ca3aa9b8065880638441e6fde5ad930ed84cd12cd2c2846958e5f3e54aabb:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNjNzI4NzFlZDg1YWRiY2U3NDE3ZWU4NzNmNDNkMDNhN2Y2MmE0N2ZlYjQ1YTgwODhkZDUzMGY0NTUxYTU0YjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdkZGIxYmZhZGQ3YzM1MmU3NTYyYTQ2Y2Q0YjRlYTQzZGVhMjM0NWI4M2ZjM2YyZmM5MTU0OTY2MTNiM2JjYmIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L819-L867",
|
||||
"version": "repo-lines-v1:sha256:499b81e496685ef41d3631bd61ea31504805447a4faf163e7dc65e259e66d8d0:eyJzZWxlY3RlZExpbmVDb3VudCI6NDksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVhYzZkNDA4ZjA1NDA5NTFkYzZhOTc2MDU3ZTQxNDBmMTZlNDE2YzhmNTg1YzI3ZDYzMTY1YTRlODIxNDI3NGMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYzNDhjMDVhZWRjMDRiN2QxYjc3Mjg4NjY2YTJkMDM1MWUyNTUwZDJmYmJjOWUxZmQwOGU5ZGExMzcxNzkxYWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ2YzEwMzVhZjA1NjA0MDliMGE1ZTE5NzE5Y2VmYzg3Nzk3ZDdlMmI4ODE5MDQ3MDBhYTc1YTkwNmRlYmE2ZmYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L411-L439",
|
||||
"version": "repo-lines-v1:sha256:eed3ad51297132b5578d6e00015c3c5f253c32323524b6e8f36154ac32cdf779:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg5Zjk5OWM1ZTg1NzJjYWI0ZDEwNGRlNjQ5MmE0OTVkZDA0ZTI2NDliZTUxMjczNTRmNzQzMDBjOTBhY2U1OTkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjZhOGYxZTlhYjU4NWQ0Zjg3ODkwNDAwZDRiZDJjZWY2MGMzMzhmYzlhNWFiMjQ5YjUwY2E4YTQzOGQ2NzllYzIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE0MmU2OWU3NjA1NDhhNjA2MzNhOWY0ODk3Mjg5N2Q3MDkyZjU4ZTg4Nzg0NTczNWVhMjEzYTI2YjA0MzIwYzgifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -425,20 +373,16 @@
|
||||
"statement": "Toolbar creation actions derive from the foreground destination rather than the sidebar mode, while Vault Navigator row menus reuse per-page creation verbs even when that page is not in front.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L106-L125",
|
||||
"version": "repo-lines-v1:sha256:ec41d820128a79e3ce0a4c46df499dc79b647fcc6731df5b4116d73fcfed6bdd:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI0M2U1ZGEyYzA1YWY5Njk2ZGRhODAyOGVmMzRiOWZmODNkNjY2MTcxNjM0MWJhM2UwYWRjOGNiNmFmODMyODYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhkYjMzOWMxN2Q0Y2M1NGU3MGM0ZmNmZWNiNjExYmI5ZTdkMzYzZjI1YjE4ZTA5MjNhMWQzMDZjYzk1OTI0ZTUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZjZThkMTM3ZmE0NGFjNjY0OGIzYTRhNmY1NmY1MGJhYmE2NzczNDE0NWQwNDc0YTRlNTU1Njk3ZmQyNmJlYzgifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift",
|
||||
"version": "repo-file-v1:sha256:d313a5cd993d79e7820782ec1317c58bf4bd5483e03f9019245667f260b210f4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift#L609-L668",
|
||||
"version": "repo-lines-v1:sha256:19b5e0fa97c2f57e3a66eb966ce5153b68d7c77ffdde088afdc59505248c8538:eyJzZWxlY3RlZExpbmVDb3VudCI6NjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg0MjE4MDk4ZmNmOTI2YzdmZGNkZTk4YzEzZmY0NzliYTUyZmQ3NzAzMzIyZDRhN2ZjM2M0ZGU1OGIyNjlhZDYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjIxMDcyYmE1MTk1N2I0YTkwYzI2YjA3OWNiNzY1MzBlOTZiMDE3YWQ5MjAzMDI3MTM2Mzk0NDM3OWRmZWEyYmQifQ"
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift",
|
||||
"version": "repo-file-v1:sha256:8ede24734501a15d123f6d1578103ea2386d2a44c797e4723b1dcdfa15455944"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift#L700-L822",
|
||||
"version": "repo-lines-v1:sha256:21098cd1daf2b3ea6d24dc402154d342313c63ebcebbb0fda0dfcef895c87666:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIzLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI1YzEwNTMxODk5MjIzNTgwZmVkNDc1NmRlNzM2ZmI1MGQwODRiOGI3N2M5MDMwOTMxZjMxMTFlNTI3NTI5YTZlIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI4ZDMwOWRjNjUwOWZhMjMyNDJmZGU2OWRhODA2NDhjZDFiNWYzOTRmYzU3OGQ2ZDFmMDBkOWJiNDE1ZTkyYWFlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIwOTA1ZDdhM2IyNDViOTRhYmQ3NDY1M2RhZWM3MWIxMzI2YWM2ZTRjNjExZDEzNWY1Y2VkZTY3MjA3ZDI1ZTVkIn0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/WindowToolbarFindTests.swift#L135-L153",
|
||||
"version": "repo-lines-v1:sha256:7d37b7b61770aa9ea4aca8a2ea0dfc730f96a23a1de5b7d900f224bcbaa7be88:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjYxNGE1YjAyY2Y2NDVhNzI1ZTI4MWQ0ODAxMjJjZmQyN2I4YWQ1ZTUzZDQwYjA1ZWFhNGFkZjUwZmYzYzc5NGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE2NWRjNGJlN2Y1ZTg4Zjk2ZjQyYmEwNDIxNTdlNjE3YzU0ZjY1ODlhZGU5Mzg5Mzk0MWFhNWZmMjIzZjhiODcifQ"
|
||||
"resource": "repo://TFMTests/WindowToolbarFindTests.swift",
|
||||
"version": "repo-file-v1:sha256:ee0232b462432a5304fd160612343fa59118593139800cb10283210d4bae4420"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -469,28 +413,20 @@
|
||||
"statement": "Find commands target the focused window model, which suppresses pane keyboard claims before activating terminal search and focusing the toolbar control; Welcome redirects focus into its content field and unsearchable destinations do nothing. Toolbar focus ownership is released on explicit user exit so panes may reclaim the keyboard.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindCommands.swift#L125-L125",
|
||||
"version": "repo-lines-v1:sha256:38a484f4ed7c48f24c8ded5e0d28a17aedf0356fbc4137c45ff956fb4906cf93:eyJzZWxlY3RlZExpbmVDb3VudCI6MSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMzhhNDg0ZjRlZDdjNDhmMjRjOGRlZDVlMGQyOGExN2FlZGYwMzU2ZmJjNDEzN2M0NWZmOTU2ZmI0OTA2Y2Y5MyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMzhhNDg0ZjRlZDdjNDhmMjRjOGRlZDVlMGQyOGExN2FlZGYwMzU2ZmJjNDEzN2M0NWZmOTU2ZmI0OTA2Y2Y5MyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMmVkYjY1NmVhNzNmNDQ0MGY2OTAwNTg3OTM5YmMwNzk4OTQxMmNkYzAyYmZjOWIwMjE5MjRiODBhYjBkOWJkMSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNWVlOTZjNzFlMjRiZmVmZjlmMGMwNTMzMDZiNDIxYTlmMzcxYWQyMzkyMmRmMzVmMmIyN2JkNzc1NTY5YzkzZiJ9"
|
||||
"resource": "repo://TFM/App/TermindCommands.swift",
|
||||
"version": "repo-file-v1:sha256:cb907484b84cf467c27a3e6a5e595544469fb3fb26046554040b5883efa09ace"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L370-L473",
|
||||
"version": "repo-lines-v1:sha256:8c5e4335ed75c5db166bd682da042bba99aa59fa2f9a8dc06d7ad37abda3bdd4:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA0LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI5MWFkN2M1ODNjNDVlZDZiMmUzMTk1OWRlMDRjOTg3ZTA5YTdkYTExZWMxOGM3YTlmZmFiNDY4MzYxMGZkYjViIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlODRmYmFmMjYzM2M4ZTg0MDkxNWY4YWVjMjZjNDMyMWY4NWRiNjg0MDA5YzJmOGRlMzgzNWZiNDU1MjBkY2M1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI1OThiM2ZkYTVkMjcwZjY3MmVlOTM3NmJmN2RiOGZlZTJmNDhiZWEyN2FhNDliYjEzYzVhNmYyYTAzNjIzZjE3In0"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceContentView.swift#L555-L589",
|
||||
"version": "repo-lines-v1:sha256:5b49bc13f4df56b004b908909ef82094b29f7cc275af61ae0fee28d5adaf467b:eyJzZWxlY3RlZExpbmVDb3VudCI6MzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYwMjA0MzJkYzQ3NGFmN2VmY2NlYmMwZTQ1ZDAzYzIxYmM3OTY0ZWMzZWY5NDE2Zjg5NmRlMDVlNmM0ODAzMzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZiZTM2MTE2NDk5NDM3MWMxOTlmNzg5NWQ2YjBjNTQ5NGU0ZTBkNDBmZjc0YzY1Zjc4Yjk0NGFhNjhjOWEwZGUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM4MDU1NTIyN2IxNGM1ZmEwYTQ0NTA1NjhmM2U0N2RmNzAxMDg1NjFlZDU4NjM3ZTZiODlkZDc5ZmVhOGE3NzgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY4Zjg3NmQwODViMzQwNjE2MjkwNzMwZGIwNTNlYTJjM2M5NmVjNDQxOTFjOTk4NDc1NGI4MjFjOWU5OTNjYTQifQ"
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift",
|
||||
"version": "repo-file-v1:sha256:8ede24734501a15d123f6d1578103ea2386d2a44c797e4723b1dcdfa15455944"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift#L262-L351",
|
||||
"version": "repo-lines-v1:sha256:5535bdd6a0c2aa10458639db09aff2e136fe57e90a36a884b905b6b6cc612eed:eyJzZWxlY3RlZExpbmVDb3VudCI6OTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MTUwYWRjYjYyYzQ2MTMxYzczYzdjODQ3MmI1ZDZiZWI0OGY0ZjRkZTAwNzUxMDk1MzQ2MzBmNWVmMDZmMjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRhOWY4NmQyOGU3ODRmOWZkMzFmYjcyZDE1ZjYwY2JjZWFhZmRkNjY5Y2JkNWI2ZGE3ODg4YTAyMzMyMWViYjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlmMjk0Njk2OGZmNzUzZDk3ODM0ODZiODE4NzRmMzViMWRjNmFhNDM2MTc3ODVlNDZhNWVkMzlmNTU1OTQwODkifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/WindowToolbarFindTests.swift#L106-L133",
|
||||
"version": "repo-lines-v1:sha256:f5abcb028167903c4b022c1b67ec39b17b66210be38f18d8e5a3e3d56b91a574:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYyMzkzODU4NjhhODkyNGFhMDc4Y2QyNDQyNGVhZmE1N2NkYTQ3OTZkMmRjOWFhOTY0NWJiZTVlZWI5MzJmNDYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU1ZmNkYzA4MmRkZWRkMTFkNDhmNTI1ODdiMGI4MDFiOWI1NzBjYmFmNGU5ZDFhNzUzMWJlZTJmOTNhMzUxZDciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjExOGNhYjZkNzgwMjk5ZWY5NzVkMjRhZTFjZGYyMzVkNTE5OGY1MzYyNjA3NWNkZGU0YjY5OGQ3MzE2MzlmMWEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/WindowToolbarFindTests.swift#L53-L67",
|
||||
"version": "repo-lines-v1:sha256:239e773209810ab34d76ac380e7ea9db58844733b42bb7117103e750b82cd74e:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU2Njc2MjJiODU3ZWI1ZDAyYTQzN2YwNGFkOWY0NDE3NTU3YjIxYTc2ZDZjNjA3NjNlNmRhODRlZmI2MzBkOGYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcxNDVmZDFkMjk1OTMwMzE4YTI4MzA3YzU0ZDFjNzdkYjBjZTRlNGE4ZWFiMjZjMzZhMTU2ZjA5ZjcwNGFhMWUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU1ZmNkYzA4MmRkZWRkMTFkNDhmNTI1ODdiMGI4MDFiOWI1NzBjYmFmNGU5ZDFhNzUzMWJlZTJmOTNhMzUxZDciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAifQ"
|
||||
"resource": "repo://TFMTests/WindowToolbarFindTests.swift",
|
||||
"version": "repo-file-v1:sha256:ee0232b462432a5304fd160612343fa59118593139800cb10283210d4bae4420"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -499,16 +435,12 @@
|
||||
"statement": "On macOS 26+ a background search host contributes system searchable UI without rebuilding the persistent split-view branch; earlier macOS uses an explicit toolbar search field or compact Metrics popover, retaining native field identity and reserving toolbar height even when no Find is offered.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/RootView.swift#L70-L114",
|
||||
"version": "repo-lines-v1:sha256:b75444b20f9972ed77527c11bc67da1e702630dcfd40325b2404ada9e632bb72:eyJzZWxlY3RlZExpbmVDb3VudCI6NDUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY5MDFkZDM3NjU2Yzk2MTY4Yzk2ZTUxYzMyNTZiMDdhZWIxZGU0NzY0Yzk4N2VjNmQ3ZThmZTVjMmQ0NWNjZjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNlNzE0MzFmNGM5NzhiOWU2ZjQ4OTJiM2JjN2RiZGY4NTdjZjMwYTdiMzBkNmQwYzY1ZjNiZDE5MjQ4YjhkNjciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjcyZDc4OTQyMGU5ZjY2Y2MyNzdjZDliNTNjYTUxZDFhODgyNDA2MDAyNmVlZTU0NTgyNGJmNWQyNWQ2NDJjZjIifQ"
|
||||
"resource": "repo://TFM/App/RootView.swift",
|
||||
"version": "repo-file-v1:sha256:b541d1995a8473c132e0e7aea10c0b56bc96d12cf1d003ffaa0f6bdf1f605eb9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift#L421-L605",
|
||||
"version": "repo-lines-v1:sha256:09502a00c98ff9986bd6a8459680229069daf2b7db8f0d2dc183e5e73f084108:eyJzZWxlY3RlZExpbmVDb3VudCI6MTg1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI4MDgzNDc1NTE1MTk2ZTVhMzRjODg1YmM2YTUxYmVhZTA2NTU2YWQ5MzIxMWQ1ZmVlZWM5MDFkMzNkYjFjZTAzIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIxYWZlZTU1NmI0NjE5ZjBjMmIwY2NkMzU2YmQ4M2Y5YzVhN2UxMjU5MzhiYzcwOTUzODIyMzdlMWU3YmVmYjQ2IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIxOWU3NjM1NWNmMTE5OTQ4MGMzZjk5ODM2YjE0ODZjODQxZDg5MWZhYWQ5MDRjNjA4ZTA5MzAyMmQzNzU3YWVlIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIxOWU3NjM1NWNmMTE5OTQ4MGMzZjk5ODM2YjE0ODZjODQxZDg5MWZhYWQ5MDRjNjA4ZTA5MzAyMmQzNzU3YWVlIn0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift#L43-L52",
|
||||
"version": "repo-lines-v1:sha256:60e875315d65ba9344420d6e411894a420a10b0990d3f7c6aa57a984803bf20d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcxZGNkYzJiY2FlNmU5ZGMyNWNmNDExNmYyMGY1Y2M4MWEwMTY1MDdmYzc0MjY1YzFhYTJhN2MzMjZiMzFiY2IiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNjY2YwMzlhY2M0MmJlYzQ4ZTMxNzllMWU0N2ZkOWYzNjkzODgwM2EyMWFmZmQzZjlhZGRkMTM1NjU4ZjliM2MiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ5YmZiYjUwZTliODgyOTI1ZDY4YzJmYTZhOGQ1NDBhY2Y2ZWM1YWRiOGU4NDk0MjEwODg4NGM5ZmNkZWRlZGQifQ"
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift",
|
||||
"version": "repo-file-v1:sha256:8ede24734501a15d123f6d1578103ea2386d2a44c797e4723b1dcdfa15455944"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -533,6 +465,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:b3cf2c3e75779877055fc98f5005afa3c2c3ca927da6b0232fbf035d108cfe52",
|
||||
"pageVersion": "sha256:01dff4e055d1d84f2ae10051b53bc73764eeb76dc2728ac14e0298625517d395",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_72f9329a158e418cbf0fd6394f82815e",
|
||||
"statement": "Shared Domain, Application, Infrastructure, Remote Infrastructure, Presentation, and Persistence modules have enforced dependency responsibilities, while TFM and TFI own platform UI, adapters, composition, and lifecycle.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md#L3-L14",
|
||||
"version": "repo-lines-v1:sha256:ebfbb4e4dd7e3beb5093f7d76de4ba789e0b467bdd86cf37e4cc42c6f70d7f22:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY3NmYxY2NlMDU0ZTZlYjE0YTIzZTg4MDI2Mjc0ZmI0YzA0ODM5YTcxYjY2ZmZjY2VhYzkzOWUyZGM0ZjRhYTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJmNGQ3NzU3NjdlNzBiMGI3ZDE3YjNhNTkzNmM2ZDY2NDc3YmE3NzZlMTNmYzM5NmEyOGMxODY5MzQyMjQwODIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjoyLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNhZGU5Y2M2MTdlODVmZTg2MzFjMWQ2ZjhiZTAzZTViZDE4NmQwYzhjOTI1ZjY0ZGIzMmU0ZGI4YTBlYTY1NGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImRkMzUwNTE2MzRmYzcyMzY3ZGVlYTFhZTI4NzFkMjk0MTY2ZDNlNDM5MTgwOTdiOGUzMTVlZmE3OTU1ZDM5YjcifQ"
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:ca356c025f911101bbaf63a9a34b72736291043ed0fc0daa8dbedec972eac6b1"
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -25,16 +25,16 @@
|
||||
"version": "repo-file-v1:sha256:ad0b99e06c0a0817f6980a6a682f016a27d45d86fd8c378ab1036ae910712cd4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift#L19-L33",
|
||||
"version": "repo-lines-v1:sha256:78cdd316a915930837af24416a90eddddd5619a5c74f1c6ea36d13500cec5f90:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNmODI0YzlmYjRjY2M1MWYzMjAwNzJiNmNjNzQ2YWVkZWU2MmQ3YmNhZGY5NDI4MmJjMjdjZjNkMjc5ZWQ4YTEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQwOWRlZDA1YTMwZTBiMDk1ZjI3NWRkNTcwMzRmNzU2NTgzNjBjOWQ4ZWIyNTg3NjNjNGI0MDMwYmM5ZGRjYjEifQ"
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L30-L39",
|
||||
"version": "repo-lines-v1:sha256:8adecd981086eaed1cad0903e82917b4d86a8e9d6e35d0314bcbb752f450f95d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFjMjU4YjdiNGY1YjRhZjg4NjE4ZDI4NGJkODg1Y2VmYzNiMmQxOWRhMTk5OTlmN2ExNDI0YmQxMDliMjNjZjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZTg1YmI2MTQ1ZGM4ZDE4OWJhMzEyOTRhNDk4Njc0ZjU4M2RlZjE4ODIwM2JiZDJlZWVhYWQyN2Q3OTNjYmEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjRhMzY1Mzg4MWY4OTIzZGEyYWJmM2JhZDNmMmJhYjNiZGI4YTM2Njk1YjY5MmY5YjlmNmExMWI3NWQ4MjkwZjAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQxMmJjZjU5NmJmOTk3NWM2Y2ZhOTU1NWJhZjAwMjBiZmM4OWFkMjA1N2U2YWNmNzQ3NzJjZTJlNWIxMDQxMTAifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:ca356c025f911101bbaf63a9a34b72736291043ed0fc0daa8dbedec972eac6b1"
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -44,7 +44,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
@@ -52,11 +52,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:0029784efe4588e87c3dc18317fdfaad46bed6b3a32bcf72dd0dd9b1c9da256e"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:6156e0821962b295b33e546540b8894537b1e053c788ff50b30e276d5ab3b092"
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -153,24 +153,20 @@
|
||||
"statement": "Mobile stores ordered connection-free Workspace descriptors, cold-launches them as Recent without connecting, and publishes one live instance before its first on-demand connection across scenes; finite background expiration suspends live transports, and foreground reconnects only live Workspaces with resume intent, not unopened saved descriptors or prior commands.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L647-L697",
|
||||
"version": "repo-lines-v1:sha256:21f59b12deb183823816db3e0f32890c5383be16343e6cc30957fb0e11101477:eyJzZWxlY3RlZExpbmVDb3VudCI6NTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZDY0ZTIzNWJjNzZlYTM1MDI3NmE4MGZlMGM1NjM0ZTYwZDFkZmUwN2FjYWQ4NTJlMTFhMWQ2MjkzM2ViMTAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhkZjI2Yjc1ODA3NjRhMzA3MzcwNDAxZTZiZmI4NWVmMDBlMDFiOWY5MDA0M2RjNWIxY2I2ZDhkZGU1Y2Y2NzYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImMyMWFjNTE4NDc5MWIzNWNkZTM4MDkzNDU1MTVjMGFjMDEwZjA3MGVhZTAyMTRjZGY0MzIwZDE4NzI5N2M3MDEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQwMTYwNjlmZDYzNTRiM2JjOWZiMDlmNTY3MzEzMDA5YmRmN2IxYmExNGZkNWFmMzBjYzU5NGYyN2M5YjJiNDUifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L748-L767",
|
||||
"version": "repo-lines-v1:sha256:009a2acb4cd53659b0f5811f41e299f4d746f4be8f1f4352ff30ad7118fd662b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxODI4YWZmNmM2MDJhZDBjNDkzM2FhYjA1ZmQzZTgzOTVmYmI4ZjY3NTI1OGU4NzBiMmE4MGY5MjhjYzhmZWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVhNzhhMmQzMGFkYTcwNjU3OTM0MDdhOGM1ODY5NmMxMmM3NjAyZTc0OTVlM2IwZmE5MDRmMDE3NmI0YzY5NmEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUxNmNkYmM5MDJkOTFjMzE5NWYwNWM4NzZmZjcyYmM3NTdiNDdlZGE3ZjYwNmU4NTRjNDMyNTgyOTRhMDk3MGIifQ"
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift",
|
||||
"version": "repo-file-v1:sha256:c2f5bd4b56b1c901b8f139b34372452037e6c95315e1dc3e50b08f3215f5d748"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift#L1097-L1101",
|
||||
"version": "repo-lines-v1:sha256:a6a1d35a0ae426d90a8b6ecf552cd2c38bc70c537be939bbd2b6446fdc7d92be:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZTJhNTAwYzZlZDg2ZWUwMTFjMTk4ZDc1NGFmNzI3NWM1MzEzMDUyZGZiOWNkYjIwM2E3NzEzYjllMzQ1ZDA5MyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiOTk5YmRlZmVlYWNhNjM0MGUwMjkwZGM4NmU4ODljODlkNWUxODlhYTViYTQ0YjU4NWIzYjcwNzM0ZjRhNjJkOCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMTZkYzM4MjAyM2ZkNDY0OGRiNDNmZmE2MWM1YmZiNDdmOWI5NmNlMjJmMWY0YjY4ZjFlNzNkZjc4OTE3ZWUwOSJ9"
|
||||
"resource": "repo://TFI/Infrastructure/MobileWorkspaceStore.swift",
|
||||
"version": "repo-file-v1:sha256:ea46bc5d91b8f0cbbdf562a56e1383dc1d7732ba249b109dd676a54369acf9c6"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Infrastructure/MobileWorkspaceStore.swift#L4-L67",
|
||||
"version": "repo-lines-v1:sha256:b13777ca2b68bbd24b7633bb0fb32e6e884a5469c4b3d6eb06974d2561ece073:eyJzZWxlY3RlZExpbmVDb3VudCI6NjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxNDkxODZkNzI0Y2I5MzM5MjJhN2U0MTQwZTVkMzhiNGI5MGQ5YzQyZjQxZmY0NDIzMzZjNjVkNWNhMGRlZDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlkZWFmNWM3MTU4ODdiMWVlNmNjZTNjMzk3OTIyNTUxZWUwYjJjOTIxMjJiYmM2MmExZDMzYzE1M2JmMjBiNTQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE1OGQ0YTkxMDc0MDU5ZjBjOGQyMTM2ZjliZjgwODM0NjE0OGZjOGNmYjM1NDNkZGNiYzc1MGU3NTc2ZTcyNjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoyLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM3OTRkMDJhODEyMTk0NGQxNzZkMjY1ZTliYjljYzU5ZjZhYjg5MGJjYWRmOGFlZmRlYmRiYmI0ZjJlYTg0NDQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAppTests.swift#L1532-L1601",
|
||||
"version": "repo-lines-v1:sha256:95d9405507e382bde006ede06de795e41c83dcceaa0a8f55ce36fb006d9939f9:eyJzZWxlY3RlZExpbmVDb3VudCI6NzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVhZTdlMWFhMzAzZGM0N2UzZjM1M2VjODFhMGQyZTMyN2Y3ZDgwOTI2NzQxYmIyMzA5OWJhY2NjYzlmZDg3YjgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRjMjM0YjM5MDZjN2Y1NTE2NzhhMmZkZjNkNzFjMjIzYjQ5Y2YwMWU1N2RkZjQyMjdjNjNiYWY1OTRjNjVjMDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjAwYTY3MGRlNmM5NGQ5N2RlODBkN2RmMjk5MWJjOWI5MTM2MDg4NWVhZjE4OTJkYTk2MzUxZTNmNjA3OWIwNWYifQ"
|
||||
"resource": "repo://TFITests/MobileAppTests.swift",
|
||||
"version": "repo-file-v1:sha256:4e595e215d00b798a3c7d026a88d5236ac57d2cfdec406883eb289dabd289f03"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -269,20 +265,20 @@
|
||||
"statement": "Terminal font family, size and follow-theme-size stay device-local; shared binding-driven controls use an 8–36 editing range with a macOS slider and iOS stepper, while app-owned catalogs include families with any loadable monospaced member and sort using the current locale.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalFontFields.swift#L4-L48",
|
||||
"version": "repo-lines-v1:sha256:d946b0d140f4be2ae38b11c355aefd32af955306e8f2bebbaa199b678bc32420:eyJzZWxlY3RlZExpbmVDb3VudCI6NDUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ3N2M2Mjg1YTU0ZWFmNWZiY2ZlYmViODY4ZDcwMmFkYzlkOTg1NWRlYjE1ZGE5ZjRmMzUxOGMzMDFlYTE5YjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI0Mzc4ODZmYjRiM2M2YmI3YjlhMjk0ZWM0MDhlZGRmYjVlNDA4OTc5MTA1YjQxZjIzMmQxM2I5ZTc5Y2VlMGEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQwOTI0MjQ5ODI3MzE0ZDkzMGUzMWYxMjlkZjg1NWJmYTg0MDFiMWI0NGZkNzc3MmEyZjA0Zjg3ZDE4MWIxMzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUwY2ZjNWYyNWEwNDY4MDhhNTBiZmRjYzUyNDBiZjY1NWI5NmY3MTEzMTNkYjhlMTM4NmVjMTllZTQwM2EyMDkifQ"
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalFontFields.swift",
|
||||
"version": "repo-file-v1:sha256:fe42abfe804da005ade77a8873f0196fc7c539b34d6397fcc1f1b71766d11749"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalFontSettings.swift#L5-L26",
|
||||
"version": "repo-lines-v1:sha256:fc9a9007589065d414dbba46a453c433655d9de41d7ef11bed251844ff58a524:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRmMGJkZmVhMzIwMDQ4NzRkZjU0MjY4MDg4YjAwODhlNzRiODFiYzliN2JlYzZiMWI3Njk5MzgyZmVlZjgxZGEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVkZGI4NTc4MDBhNWQ3MjQ3ZmYyM2M1Y2Q1ZTUyYzU0N2JiZjRiYzM2NWI5YTc0MjY5OWVlMzNkYmIyODkyYzAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalFontSettings.swift",
|
||||
"version": "repo-file-v1:sha256:e59c85ba12335af1a05e03b26a4ddd4d9ecfc6573952dad2b4961831e017437c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Platform/TerminalFontCatalog.swift#L10-L17",
|
||||
"version": "repo-lines-v1:sha256:b59ed0ca803c29f9017000aa1149e030c31c07dc8f43215635f8eb36e0ef0114:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiM2I2NjIyZWE1MTRkNWI2NWNmMjNkYWM3OTkyMGUzZTNhYTliYzNlMzg2YzIwOGU0ZDBjOWM0MWQ5OTVlZjc4OSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjEsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSJ9"
|
||||
"resource": "repo://TFI/Platform/TerminalFontCatalog.swift",
|
||||
"version": "repo-file-v1:sha256:458044744f770958bc9ab87d9824ecffe182f5cabfeaecef8156906ae8a9f96b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Platform/TerminalFontCatalog.swift#L10-L18",
|
||||
"version": "repo-lines-v1:sha256:17fc005c6ceea378586b85f22ef87ce5db92fab9049f42734e5bdd914a825d76:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiM2I2NjIyZWE1MTRkNWI2NWNmMjNkYWM3OTkyMGUzZTNhYTliYzNlMzg2YzIwOGU0ZDBjOWM0MWQ5OTVlZjc4OSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjEsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSJ9"
|
||||
"resource": "repo://TFM/Platform/TerminalFontCatalog.swift",
|
||||
"version": "repo-file-v1:sha256:c1792c30b77feda7f8f0f61b0c8c632b29e85f9d6debc5bb10a271d4924aee45"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -291,20 +287,20 @@
|
||||
"statement": "Unavailable and wrong-appearance saved theme names remain selectable without appearance-time persistence; both apps use shared filtered and sorted options and display a fallback while rendering applies the appearance default, custom commands, and finally local typography.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalAppearance.swift#L59-L96",
|
||||
"version": "repo-lines-v1:sha256:027f0ed8e913904d8d367d68727682c10d4a5667e15c63e5b18e1c6a8eb05f9a:eyJzZWxlY3RlZExpbmVDb3VudCI6MzgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImY2Zjk4ZDgxZTQxMDU0OTYxY2E4MmVlNDc4ZDY4ZWUyNTUwN2I3NGNmNzBjMzliMjMyOGZkZjQyZmJkOWFjZjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImRmYzUzMjljZTc1ZGEyMmZhOWIzODhiMDVmZmQ5NjhhZTg5YmQ1MzRiOTg1ODFlOTFlOTg1OWUyYTE1OTAyZTEifQ"
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalAppearance.swift",
|
||||
"version": "repo-file-v1:sha256:c2028ccf99f366328201299e762fa706e35c04c72aa8434b6bb44608e0761ca9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalThemePicker.swift#L13-L44",
|
||||
"version": "repo-lines-v1:sha256:e7f239057b5dd80a08bb8aeb24a13f8e36078fba15d196240b4286eec2aa7de8:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhhY2YwMDY0OTRlMDNmMjU5MjFhZjEyZDg0ZmQ4YTdhZWVjZTA2OWRhOWM4NDFjMTAzODIzNmIzMTVmZDllOGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjY3YjdmYTg3ZjIyZTQ5Mjg5NzU3ZGJhOTQ0MWE5Y2MwMDcwODdjYzEzMDQ0OWZhNjQyNDhlMzIzYTNiMjVmNWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalThemePicker.swift",
|
||||
"version": "repo-file-v1:sha256:5f480c53b4436421893d8973b28150d18a61262d3ce85e0ecf278ea06f901b0e"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Settings/MobileTerminalSettingsView.swift#L50-L68",
|
||||
"version": "repo-lines-v1:sha256:87ce0945f50c6927408568200b7041f7967d904453c8f769964f1220a4c35e46:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJmM2UzN2Y2NzljZDY2NzAyYjcxZjNmOThkN2IyYjYyZTAwMGEzM2FkYjQ4OTE1NDdjNjZhOTJkNDEyNGIxNzkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZhNzI3YmI3Zjk2M2NkYjUxODYzYzkyNmEyNGFmN2QxM2Y2NzllNjZjNTYyYTA1OGY1ZDJlMGVlZjA1MmI0NTIifQ"
|
||||
"resource": "repo://TFI/Features/Settings/MobileTerminalSettingsView.swift",
|
||||
"version": "repo-file-v1:sha256:cfb01c8d066071c9afa9d47891ed093923acb2a0217b29755e356ec701663546"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/TerminalThemeTests.swift#L145-L187",
|
||||
"version": "repo-lines-v1:sha256:511024300ee294432e3aac81e2781a321cd890a6abf22746371ab22aca03e96e:eyJzZWxlY3RlZExpbmVDb3VudCI6NDMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNhZDAxNjAyODg0NTdmMGYyZmVlMzM3MGUwNDBjOWEyYTU1ZjI4ZWI1ZGUyODkwZTcyMmRkMWJkMGEyYzllYzMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM1NDExNGUzNjA0MDA4NjlmMTk5ZjFmMWY0ZTc5M2FjMTNhNWY5MzE0YjljM2M0NmI0ZjE4MTRjMDY2MGExZDcifQ"
|
||||
"resource": "repo://TFMTests/TerminalThemeTests.swift",
|
||||
"version": "repo-file-v1:sha256:486afc2bf3721fee357282fdd83470fcd029c99f029f17b66f3c4f634305e662"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -449,32 +445,16 @@
|
||||
"statement": "On mobile local Host deletion proactively closes live and unopened Workspace descriptors and cancels associated Assistant, transfer, forwarding and Metrics runtime work before requesting durable deletion and starting the outbox; remote Vault removal separately closes saved descriptors and clears local history. Desktop requests durable deletion first and then projects the Host and clears local history, with registered outbox and Host callbacks handling runtime cleanup.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L289-L308",
|
||||
"version": "repo-lines-v1:sha256:63e3cb34ad0a6d1c4cee4ed6e3ccf865545b2728b1f2395572d0b9dca0375631:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEwM2M0NWRiMmQ0ZTMyMDIzOGNmOTkzMWJjMDJlMTg3NzZlMjVmNmNmNGZhY2MwZjcwYmE4M2Q3MzYxYmJmYzMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg3MDAzMDk2ZDkzZTMyMmY3NDZlMWZhZjQxZjY1NTcyMWY3ZDc5MmRkYWM3NDIyNzA5ZTMwOTg2MTgzZDA4MWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg3MWEwNzY5OGM3ZjA3ZjI0NTY0NjVmYjA3MDVhNWNjMTM4M2U1NGU4MDYyOWFjYjAxNGEyYzczNzg3MzA0OWYifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L501-L523",
|
||||
"version": "repo-lines-v1:sha256:04d6de73c3e6546f20ba5a5e31b40a0c6a0f1c7a158074ac4ffe3145f6a7194a:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYyYmY0MThkMjk2MDkwOWQ0M2E2OWUyNzZmNWRmODc3ZDhmM2QzNzIwYTYzNDUxOGE5NGViOWVhNDA5MzMyN2MiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlkYWU1NGY5ZjkwYWVmNTQ0ZjBhZTQ5MDAxZjQzMmY4NTUxYzZiZjU0OWZlMWYxM2E0YjEyYTQ1MDVhYzUzMmUifQ"
|
||||
"resource": "repo://TFITests/MobileAppTests.swift",
|
||||
"version": "repo-file-v1:sha256:4e595e215d00b798a3c7d026a88d5236ac57d2cfdec406883eb289dabd289f03"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L603-L634",
|
||||
"version": "repo-lines-v1:sha256:2b17d09836cd982b03982416cec87456a70533270eee87d5a3e6d89488bea78f:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNhMjA4N2I3YjllNTQ5ZjEyNjNhNmJiMWY3M2JmYzYxZGFlM2I2ZGIwODdjMWQwYjFhODk3MmIyYTVlNzNjOTkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYxNzMxNDIwMjQzNGQ0Yzg0MjI5MGRkYmY3M2RkNDg5ZTM2YmI4M2UzYTIyOTY2MmI2YjI3MWQxYmNiYWZjMDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjI5ZDFkZGZkOTM3OWY5N2QyNTllNzJiNGU3YjNhMTMxYmNkN2U0NWNiMGVmZGVjMDA2NmRiMTc3MTdkMzYzYmIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAppTests.swift#L1763-L1788",
|
||||
"version": "repo-lines-v1:sha256:6f98578160eea0b5dbcc04123f099deb6402e4b0826fc28180b04437bc74b82d:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY4ZmRiMWE0ZmJiNDNlODMyMWI3MmU0Y2Y1ZmI2MDViMzJjMGRhMDlmMDVjZjQ2NjRkOTk1ZWFhYWZmZjk3YjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjEyM2FiYjcxYzNjZDlkMzhjMzA1NjA1MTVhMmUwNGNkMmE0MzliNGFmMmViN2QwYjc4NWFmYzA5YjBkMmUzNzgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY1YzMzOTk5MzgzYjY1ODI0YTVkNDZjZjVkODc4MzUyMDJkY2QyNTZkMGYxMjNjNWYxNjJjNzQ2ODBiYTg3ZmEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L256-L318",
|
||||
"version": "repo-lines-v1:sha256:bda235f6436ad7ec5a918c8ad516f292203a30ed2735e16ee07668141edfefd0:eyJzZWxlY3RlZExpbmVDb3VudCI6NjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI4M2E2MjQ1ZDczOTAzYzVmOWVlNzdjNjFlMjllMGIzYmZiMzNmM2Y3MmVlZTIwNDVlMWI4MWE5MjZhMGYxYmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYyZjg3YjNkNjcyYmM2ZTk0MTA1NDlkYTYzZDBjNmUzYjk4NDRkOTE2YTkyNDY3ODllNzdmOTg5Y2RkODMyZWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImY5YTVjNDU4ZWJhZGU4ODY2N2VlMTE3OTczZTEyMWViMmM1YmExOGMxNTFlYWIyZGUzOTRmMzhhOGMzOWZkMGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJjZjk5NjAzYzM1OGMzN2Y2MjMyZDA0YzhmOWFlN2RkYzlkNzBlYWY4NGMwY2YyNjVkYzNkOWM1NTg1NzViNjcifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L363-L393",
|
||||
"version": "repo-lines-v1:sha256:de71cfc5d70c8197e0411e417521d0834d1b984ab96a02fc0f982e4e9c3aa7ed:eyJzZWxlY3RlZExpbmVDb3VudCI6MzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM1MGQxYmQzNDkyNzgxNDM5ZWJjMjVmNGNkYzI2NTE2Y2QyZTc4YWRkOWYyZWIxNWJhOWFjMjcwNjI2MDIxOGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM2YjU5ZDI0NTYzNmJhNDBhNjIyMGI5OThkN2I4ODg5NGFjMmYwOWRiMDUzYjIxNjkyMWY1NzAxNDE3ODViZGUifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L663-L678",
|
||||
"version": "repo-lines-v1:sha256:6def89de94cd728ecd8c553c53f5fee8a40e237e9d24cccaa78514811e430795:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZDUzYmFhYzE4Nzg1MmI0MzFjMjMyZTA1MTYwNjFkNDk2ZjdhMjE1NmVlNGJmN2RlYTY0N2ZjNjY0OTg2NmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkxNjBkNTI5NzhjYzA0ZjJmODhjOTA2YjgzMTIyODQ0NDZlZWZmNDA4ODkyMmZmNDVlYTMzNDQxNzdhYmU0YjkifQ"
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -623,16 +603,16 @@
|
||||
"statement": "At desktop termination the app rechecks unuploaded remote edits and lets the user cancel; accepted termination runs an idempotent shutdown that fences new Assistant admissions, cancels captured preparations and stops stored conversations before joining their drains, runs MCP/SFTP stops concurrently, and closes Agent background commands and connections after drains while retiring other app-wide services.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L724-L778",
|
||||
"version": "repo-lines-v1:sha256:4088a1395f839fa08e6e42d1dc28faa30416dc463f43b9354b941ebf4e582043:eyJzZWxlY3RlZExpbmVDb3VudCI6NTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRiNmE1OWU3Nzg2NmU1MGRiZDYxZjA5ZmQ1YWM2MjQwN2Q0ZGVlNjdkNGIyNTJhNDExYzRhZTEwZWNmMWQwNmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjUzODNlN2M2MmI5ZmI0ZGU3YjNjNTc3ZmFkNjNiOTYxMGRlZTcyNmI4NzljYzZjN2M5ZjYzNTljOTU5YWEwODQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYzNmM5MGE0M2ZiOWQ0NDg2NzI0NmE0MzY5ODk4YWZkOTFiOWUyYjM0OTZmMjU3OTg1YTk0MDFhZjY4ZDI1YWYifQ"
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L383-L415",
|
||||
"version": "repo-lines-v1:sha256:0b48fe4bc83deb8ff877360273e4f5a25c243a95938f6b0edd9a23f7dcdeab91:eyJzZWxlY3RlZExpbmVDb3VudCI6MzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImIyMmJlMTBlOWQxYjNjMGE2OTYxNzZmMGYyMDQ3MGVhODMzN2FmYzI4MWZmMTIzYmNmMmRmMjkzMTNkMDIwMTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4NWYxZjhkMWY1ODkwZmNjMTE1ZWMwNWRlNGU3NzA1ODdiOWRjNDlkZDhlM2IxNTViYmUwYzI4NWI2ZWQyYmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjliOGJlZDVmYjA1YjU1Mzk2MGFiMDVlYTU4ZjI2ZDA5MGQ2MDY1NTE5ODkzZGNmOTllZmQ5ZTc1NGQ3Y2VhOGMifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppTerminationTests.swift#L13-L160",
|
||||
"version": "repo-lines-v1:sha256:5c3808df71f1f1675477a2e643e235ae655add9ac160ca922e25ae5ae9db2c16:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQ4LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJiYTY1OTc3NGZkY2U5ZGY1ZmRhZDNkNjAwOTNhZWY2NGY2ZjlhOGNiNTIyNDdkNjUyN2Y5N2IxZTYwOWJkNWM2IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ZDJkYjMzNzM2OTA5ZDMxM2M0MTE0NGE0Mzc2Y2U0MDk0YjJhZmU0OGI2MmI3NTY0NDEwMDNhNjUzZjgzNzNiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlODdhMWNiNGE5NjU0YWJiMDdkY2I3OTE3NDgxZjZkMGEyODgyMzZlY2JhZWU2ZWIwY2Y4NDBmYzQzZDM3ZTc2IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJlOGVhZjNlMWRiMjg0ZjZhNmZkNGUwNjZhZTJmYjY1NGFlNjhmZGZjZjNlN2U0ZGNhNGMyZGQyMTRhNDliOWQwIn0"
|
||||
"resource": "repo://TFMTests/AppTerminationTests.swift",
|
||||
"version": "repo-file-v1:sha256:61e14261971e275798d4cde5275e5c3e0dc0d5552beace53b81e1ed3842358eb"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -657,6 +637,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:1804e1b56dad3aff397363c08ac6c2af77f136d8fee3b4d6e8a2b80fa040f948",
|
||||
"pageVersion": "sha256:60126295756822200145e81f286554dbb9bfafd08b019f04aed82b04d9a8c067",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_fbb919f62a2d4ab88aafcc4c1186731b",
|
||||
@@ -8,11 +8,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileFeatureRegistry.swift",
|
||||
"version": "repo-file-v1:sha256:9a3729942bda41a96a9caadaf877f6cca201ac30289c3d273ea3ca2a8d50c1d4"
|
||||
"version": "repo-file-v1:sha256:fd447af3f35bb38e151b34b2bd314e949d15f460f5ad89d7515e01ae1f88098c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:5391ee5b542127ba539cac32e1f3d49c335e78f9c09aa06499c6c61fd00e42fa"
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -40,7 +40,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
@@ -48,7 +48,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceListView.swift",
|
||||
"version": "repo-file-v1:sha256:f3209667a7bc50005bac10a013a881940663e225a9844359d831eb71873a33cd"
|
||||
"version": "repo-file-v1:sha256:f930f9694ed5d428ece5550b01f8a5b62436c6e2ba565e71c69e3fdc0a4657da"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -103,12 +103,12 @@
|
||||
"statement": "Mobile workspace switcher style and tab visibility follow toolbar placement, while SSH, Telnet and SFTP have distinct toolbar actions and per-action connection/capability gates.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/DesignSystem/MobileToolbarEnvironment.swift#L3-L10",
|
||||
"version": "repo-lines-v1:sha256:c2c2c6cc83fb13a43da977780d588d98f9a511a89ae9829800d1bddd3072d00b:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzg1ZGJkOGUyOTJhYmExMGNkYWNmMmJmNTkzYjg5MzRhZDllZTI2MTAxYzE3YzVlMGRiYzM0ZjcwODA2MGM3MyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjIsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMzU5NjVmZThmODlkNTQ5ZTZhOTFjZjliMjEwZGM1NzA4YTBkODU5MTkxYjk5NDI2ZjlhMGMzMGRjNWQ2ZTlmYyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiM2RmNDc2ZTkyYjVhYWU0NDY4OTFhNzZiNGJmMzE4NDRjZTgwY2MxNTg0NmFlM2ZmOWI4N2U5YTE5NzZiOGYyMiJ9"
|
||||
"resource": "repo://TFI/DesignSystem/MobileToolbarEnvironment.swift",
|
||||
"version": "repo-file-v1:sha256:34f7bdc5c7213650ab9834ca6a55266bacb7f792b615a7e0ad8af022d2e92cf6"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceView.swift#L136-L251",
|
||||
"version": "repo-lines-v1:sha256:0c59640ed6d27d6c81930878a17245c46e01668167c58d2d07ebae792ed531c5:eyJzZWxlY3RlZExpbmVDb3VudCI6MTE1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJhNjJmNmU2M2U0MjE3OTlkODZiZTU1OWVmNzFhNDAzMzJjYzM2M2JhNmM2NzlhYTk1Mjg5Njc5YjZjMTVmOGFlIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI1YjNmYzQwMDRkNTU5YWM3ZWE5MjVlZTljOGYzMTA4MmUwZTFkODI2Nzc4OGM0MTBjMjQ1MzEyY2MxMjZjZGZhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI4NjE1ZjdkYWRmOGM3ODMxMmJkMTE4MmIxODgyNzQ5NmQ4ZmM2YTY3MWFiM2Y4MWM1YzcwOWY4NTBkNTE3YWRkIn0"
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceView.swift",
|
||||
"version": "repo-file-v1:sha256:581f46fd0bf35b780a3bef34663dd8db63ad36ce5decec0c887fb6675846da23"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -117,8 +117,8 @@
|
||||
"statement": "MobileTerminalSurface owns its native terminal beyond SwiftUI navigation; added Find commands preserve ordinary terminal key handling and intercept Escape only while Find is presented.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Platform/MobileTerminalSurface.swift#L6-L69",
|
||||
"version": "repo-lines-v1:sha256:3624f801251beed293020479cdb34a78602161708c16e117e725216ec47b3618:eyJzZWxlY3RlZExpbmVDb3VudCI6NjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZlMDFlMWE0NWVhYmVhMzQ0NDkxYWU2MzhhZmFhZTdkOTIxMDFiNWViNWY3ZjVkY2QxOTg5NmE3ZDc4NWI4Y2EiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ5ZGYyMTVkM2NjNmU2YWIwOGZmMGZhZWNmZDc1MmIzNWQ4N2M1YjdiMDMzODU5M2U5YmFjYjk4MjFkZmIwYzAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
||||
"resource": "repo://TFI/Platform/MobileTerminalSurface.swift",
|
||||
"version": "repo-file-v1:sha256:5e5e6b2bccb3c873dc0211ea9588b54b388ba89bc83abe52886e514bf4e31e6f"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -159,12 +159,12 @@
|
||||
"statement": "TFI aggregates scene phases before entering background handling; background expiry suspends workspaces, stops forwarding, pauses transfers and expires Assistant work, while an active scene refreshes the current device name, resumes retained workspaces and restarts appropriate services.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L512-L544",
|
||||
"version": "repo-lines-v1:sha256:b0fa484bcb19ae7f887f203d3b438c9bccc7b5936706cd85d285e53c0f9b31d2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjExYjYwOWM3ODJiMmM2NDVhM2M2ZDFmOWMyMDA3YzdjMGVlMWI5MTI1YjJjOGIxOTU0YTFlMTVjY2UxM2VkYjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjExMGVhYzUyYWE2NjM0MDczNjQ0MjU1MTg2YTc5NGIxMjdmYzQ5MTA2NTRmYTNhMjBiOTgzMjMxOTIxZWU2ZWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI0NTg0ZDFiMmZhZDA3YjA0ZTIwZTVjOGE2MTM3OGEzNDFjZGJlN2E4ZDgwMzAwZDQ2NzJlNjhhYjcxZTFjZjMifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift#L49-L74",
|
||||
"version": "repo-lines-v1:sha256:427a1b65cef9a08c166a810c9819f16094bdadda3efd6d064bf1010c9467c8c8:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwNmIyOTNhY2FiZjI2YWJjZmZmNDhiYzNlZmVkZTIzZmEyMDFiYjA3MDMzMDMxYzcwOWVkZDc2NmQ1YjQ2NWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRkNGM4YzM4M2UxNWUxNjA3Njg3NDNkZjUwZTY1MWE0N2YzOWY5YTcxZWJjYzMwOGMwMTFlOWQyZTRiMjE4Y2UiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM2MTlhZGM1NjcxMTNjZmI2YWE4YTM2ZmI4N2U5ZWI3N2FhZGFlNjU4MDc3ZDRlODQ0NGNkNGM0NWM1YTFiNWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ1OGE3YWU2OTU4YjYxMGZmMmRhM2Q1ZDM0MjdjMWYyZDZlMDQ2NzRmYzdkZjEyNzgwYThhMWU0NzFkODVhNjAifQ"
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -198,19 +198,19 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:ae5726d2034f41e3797ec0cd94009bac394fe28681d3b939aa0ba8dda3d8dd28"
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceListView.swift",
|
||||
"version": "repo-file-v1:sha256:f3209667a7bc50005bac10a013a881940663e225a9844359d831eb71873a33cd"
|
||||
"version": "repo-file-v1:sha256:f930f9694ed5d428ece5550b01f8a5b62436c6e2ba565e71c69e3fdc0a4657da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Platform/MobileHomeScreenQuickActions.swift",
|
||||
"version": "repo-file-v1:sha256:876e36822c6894079fa98043df42e98d7044a2b7658eacb3a4e049075d41cf88"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileConnectionPickerTests.swift#L142-L168",
|
||||
"version": "repo-lines-v1:sha256:34ffbbbe2fef5d46ef7874361f9eac02fc08dd4fc8e0fd8ebcb72467cb717449:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5NjQ5MzRlNTAwMzZlMDJhNjAzMTAwODk3MDdkZDE5YmNmZWFkOGYwYWI2Y2QxMzM5NTk0NzU4ZDhhZDc5OWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBjOGQ0ZjUxZGVmNWU1ZmI1M2MyODMzMTE3ODI5ZDA4YjhkN2ZmODQ0MmY1ZTc4MDM3NDAyYTk3YjA5ZDk1OWEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjY0YzMyNDlmNDI2MmUyOGE5NzRiZTQ0ODI2MjhmZmIyMGE4ZDRkYjZkNWExMWVmOGViYzg2MjRmZWJiZGNiMjkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZhNzU2NzMzYTg1NmYyMTA1MGQxMTFkNGJlN2QxYmI3ZTg4ZDVlY2RjZDljYmFmYTgzMWYyMjZmODg5OTk1M2YifQ"
|
||||
"resource": "repo://TFITests/MobileConnectionPickerTests.swift",
|
||||
"version": "repo-file-v1:sha256:5fa61b5614ce53928bd77c0e7b5254a41d8acc68a7bfbde0e5a9cb2b8f4f3791"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -220,7 +220,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceListView.swift",
|
||||
"version": "repo-file-v1:sha256:f3209667a7bc50005bac10a013a881940663e225a9844359d831eb71873a33cd"
|
||||
"version": "repo-file-v1:sha256:f930f9694ed5d428ece5550b01f8a5b62436c6e2ba565e71c69e3fdc0a4657da"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -230,11 +230,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceListView.swift",
|
||||
"version": "repo-file-v1:sha256:f3209667a7bc50005bac10a013a881940663e225a9844359d831eb71873a33cd"
|
||||
"version": "repo-file-v1:sha256:f930f9694ed5d428ece5550b01f8a5b62436c6e2ba565e71c69e3fdc0a4657da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceView.swift",
|
||||
"version": "repo-file-v1:sha256:5bbad71afa88faa5c9d4351c6f05d4efee6ae1baa952172f64a55293091ae9e7"
|
||||
"version": "repo-file-v1:sha256:581f46fd0bf35b780a3bef34663dd8db63ad36ce5decec0c887fb6675846da23"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileWorkspaceMenuTests.swift",
|
||||
@@ -248,7 +248,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAdaptiveLayoutTests.swift",
|
||||
@@ -256,7 +256,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAppTests.swift",
|
||||
"version": "repo-file-v1:sha256:b2c528520ad5272155355404f91af52e490c6f17780a845d9e8a596c523484ef"
|
||||
"version": "repo-file-v1:sha256:4e595e215d00b798a3c7d026a88d5236ac57d2cfdec406883eb289dabd289f03"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -265,16 +265,16 @@
|
||||
"statement": "Vault Host deletion delegates to MobileAppModel, which disconnects Assistant Host connections, closes matching saved and live workspace descriptors, invalidates edits and transfers, stops/removes forwarding rules, removes Metrics selection, requests repository deletion, projects the Host out of the library and starts outbox processing; an error reports failure without rolling back already performed cleanup.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L501-L523",
|
||||
"version": "repo-lines-v1:sha256:04d6de73c3e6546f20ba5a5e31b40a0c6a0f1c7a158074ac4ffe3145f6a7194a:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYyYmY0MThkMjk2MDkwOWQ0M2E2OWUyNzZmNWRmODc3ZDhmM2QzNzIwYTYzNDUxOGE5NGViOWVhNDA5MzMyN2MiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlkYWU1NGY5ZjkwYWVmNTQ0ZjBhZTQ5MDAxZjQzMmY4NTUxYzZiZjU0OWZlMWYxM2E0YjEyYTQ1MDVhYzUzMmUifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift#L33-L41",
|
||||
"version": "repo-lines-v1:sha256:29fe38e80d38f839f9350f937690a306a9c071692df9534840c43900050d0303:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYWE2NDM4MjE0NDZmM2M1YjM4ZTFkNWVlODg4ZDYyMGRhYzIzMzJlNjRkYjFkZDg1NjRmZTA2YjJhOGYwOWUxNSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZDJjYTExYmUzMjE5YjM1YTE0NGUzYzI0MmVmN2VmYTg3NzhiOTY2ZjdmZmExMTYzNzJmODJjMmUwOTAwZThkMCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZDg2OWE2YjcxYTU5MDY3NjgxZmQ5MTllYmU1OGRmYzM4NmQzMjdhNGE2YmUwMWIwYjRhZjBiYWQyZWJhZjczNyJ9"
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift",
|
||||
"version": "repo-file-v1:sha256:8a9a00fed4426631856719583ac4fe07542c1b12d159913a3936b39342dcee8e"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L487-L497",
|
||||
"version": "repo-lines-v1:sha256:3de511e40bf5994c7b503811d139b77afba88252dd203b9b4ecbe93d69823f14:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZiYTYzZDkzNmVmZmQxZTZiYjIxMjI0YjA1NmFmNjdiM2Y2MjNiNzNkNDVhZjhkN2FjZjc2NWM0Nzg1YmVhNjIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjkzNGY1ZjMxOWNhZjRjY2NlOWJkZGFiZTgzY2UzODFlZmQzYTE5YmVlNDFmY2I4MGM0MGQ4ODU4ZDM0OTI0OGYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMwM2U1ZDFjM2QxMzE5ZGQ4Y2IwMjY5YThiODk2NGQ2NzE2MjI2MWM5MzFhOGQ2NWU0NzczYjNlNTFmM2RiOWEifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -327,16 +327,12 @@
|
||||
"statement": "Vault owns navigation into Keychain, Port Forwarding, Snippets, Known Hosts and History; Vault search builds cross-feature links with forwarded query for item matches and routes Metrics matches to its separate top-level tab.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileFeatureRegistry.swift#L50-L81",
|
||||
"version": "repo-lines-v1:sha256:f4396e91b9ec448a100b829e1d4f124c4355e45bc4aef3218ce17c504cb804ac:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI0ZjYyOTRkZWVmNTliYzUwMTMwOWMzOTRiMWYwOWU4ZGM4NzRiNmM0ZTRjOWJkNmNmM2ZhYTY5OGQzNjQ2OTIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIxOWQ3N2VhMjJkZjJjNzYyMWE2YTE0NWQ0NjhiYmFiZmE5MThjNjdiY2YzMGNmNTFiZTBkZjk4YWUxYzcwMDkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNhNGZkNGYwNDcxM2MyYWU1MzMxMjc5ZWVhNjRkYWNlMDg0NmRlZDU0MzRhMGJmMWU2M2YzYWFjZDUyZmZkYzAifQ"
|
||||
"resource": "repo://TFI/App/MobileFeatureRegistry.swift",
|
||||
"version": "repo-file-v1:sha256:fd447af3f35bb38e151b34b2bd314e949d15f460f5ad89d7515e01ae1f88098c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L314-L439",
|
||||
"version": "repo-lines-v1:sha256:d9df5125147b279f04dbd4788a152eec8eb3f0d19132d19b6127c50af7825fcb:eyJzZWxlY3RlZExpbmVDb3VudCI6MTI2LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJhYWU3OTg2N2ExOGI4OTY0YmQ1ZTU4YTE1NWQzYjBkNDM0MTY3ZThkMmY1OWM2NTBiZjgwYWNlNzAxNjk2NjI4IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJjNTkxYzhlZDM5MGUxMDJjMGQ0Y2UxNDAyMzVhOTc1OTc3ZmNiNTUyZjZjZmIyYTk3MjNkMzE3M2EyYzM4NGQzIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiJmMDMxMzUzMjFjY2YwZGNlNWYyZTA5OTlmYmJjNGI1NGQwNGZhM2I3NTBiNjY1YzVlZjhmMTkyMTY2NTkzYzFkIn0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L516-L660",
|
||||
"version": "repo-lines-v1:sha256:5715a91baaefebff6fe4cd93266c94265f6901d5636ece2f16d5b6954ff3bbce:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQ1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJmMDIwNDMyZGM0NzRhZjdlZmNjZWJjMGU0NWQwM2MyMWJjNzk2NGVjM2VmOTQxNmY4OTZkZTA1ZTZjNDgwMzM0IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJlNmIwNDQ5MTQ2OTcyMmU4MzYzYTk0ZTQwNDQ1MzhlMDEzYTJhMjE3ZTM2YjFlNTY4YmE2MGFjYjdiNGM4ZjJlIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiIzN2E4OTVkMjFhNTdjNzI0NDg3ZDk1YTRkMzg2MDkxZjE3NGIwYWRhNGIwZTBmMWYxMjNiY2E4YTM1ZmUxNTQyIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIxMTA3YTA2NGVkYjM0ZDZhOTA1YTk2ZGI4YTM1MGQ4MmM5MDcyMzAwZmM2YjFlZDU1MWU2ZDQ5MDU4YzFkNmY0In0"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -345,16 +341,16 @@
|
||||
"statement": "Vault History list actions belong to MobileConnectionHistoryView rather than the Vault landing page: it projects all-device events with a 50 matching-row cap and device-name search, shows disabled-protocol events without opening them, deletes individual events, and clears the entire history after confirmation.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Application/Workspaces/MobileConnectionHistory.swift#L76-L123",
|
||||
"version": "repo-lines-v1:sha256:488a1079cc7f87c309ff776b53cc6443379f5af2e3f68dd3a2baf012bb1aba22:eyJzZWxlY3RlZExpbmVDb3VudCI6NDgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU0YzlhNWMxNWQyOTA0NDZiOWM0N2Y0OThmZTUwY2NiYWY5NWExYzBkOTNlZjAxOTgxYzZiZDEzOGM5NjU0MDgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNhN2JkMmM0MWNhNzg3NjBjYzJjNDM4Y2QwNWIxMGZjMjZjNWJmZDYxZmQ4YTYwNGJmNjQ3YjgxZTY1ZmMxMTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://TFI/Application/Workspaces/MobileConnectionHistory.swift",
|
||||
"version": "repo-file-v1:sha256:ea1bf279a07d2dc0fd61e841777fc8e490a6d09fb2a7f36256ecc26a1c8ca541"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L46-L140",
|
||||
"version": "repo-lines-v1:sha256:e71709eafcf3da8bdbde97098cae7414aeae3a7d48267bf33ed9c64c1f755de2:eyJzZWxlY3RlZExpbmVDb3VudCI6OTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNmODhhMjRjZmVkZmU1ZTIzYTM1MDVjYTU4MDZhNDdlNDJjOTViMmZjNDQzMTRhMjA1NTcwMjkzNDE5YjQ4YWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjJhMTQ0YTlmNjlkODllZjM2OTRlMzRlNDhkMzFkMDQ4MDJiMzYxMzRkMTk0MjI3NzFkMjc2ZjgwMThiMGQ4ZWQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileConnectionPickerTests.swift#L124-L174",
|
||||
"version": "repo-lines-v1:sha256:d9cdd264b984c5fa6dda30359ada80013c32b668389d0afea21a127bf4881313:eyJzZWxlY3RlZExpbmVDb3VudCI6NTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY1ZjUyOGNlZDhiOWZkYzBkMjg2MjZlYjJkYjQ3ZWI2NDg1NjQ2YWRhNzUwYjhkZmJjNDc2ZmY1NjQ4NmE3NjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImMzNzMzNmYzZDQ2ZGE1MDU1MWJmN2IzNjRlOWU5MDc1NGYzMTFiZTQ1NDU3MWVhOWUzOGEyZTdmZDlhMDYyODkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhiYzk4MzRkMzRiMDNlOGQyMTNkMDBhYjdkMTE4N2JmYTNhMjljZmY1ZjdjZGI5ZGQwOWRiZmZjYTkwMzI5ZTYifQ"
|
||||
"resource": "repo://TFITests/MobileConnectionPickerTests.swift",
|
||||
"version": "repo-file-v1:sha256:5fa61b5614ce53928bd77c0e7b5254a41d8acc68a7bfbde0e5a9cb2b8f4f3791"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -363,24 +359,20 @@
|
||||
"statement": "Vault Host cards activate the scene's preferred terminal workspace on primary tap, while a capability-filtered context menu provides explicit protocol connections and separate edit, duplicate and deletion actions; new Host/editor presentation is scene-bound.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileFeatureRegistry.swift#L50-L71",
|
||||
"version": "repo-lines-v1:sha256:c9ceba61fc95d5c217de3f2bade1d1eb111799bc7d8f430bd74dddaddd99d0c3:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI0ZjYyOTRkZWVmNTliYzUwMTMwOWMzOTRiMWYwOWU4ZGM4NzRiNmM0ZTRjOWJkNmNmM2ZhYTY5OGQzNjQ2OTIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1MjJjNDJjZDE5YzZkMDNkODA4YzQ1MjcyMDU1MjgyNWI3ZWExYzViNDkxYjIxODUxMWNhYzc0MTVjZjlkOWIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIxOWQ3N2VhMjJkZjJjNzYyMWE2YTE0NWQ0NjhiYmFiZmE5MThjNjdiY2YzMGNmNTFiZTBkZjk4YWUxYzcwMDkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdiMDA3YzAzODVlMDEzMmNkOTJmNjRmZDAxODg4MjZkMDFmMzc4MWNjNjU3N2I1NWZiMTY3YTQyMzZhYjg0NTcifQ"
|
||||
"resource": "repo://TFI/App/MobileFeatureRegistry.swift",
|
||||
"version": "repo-file-v1:sha256:fd447af3f35bb38e151b34b2bd314e949d15f460f5ad89d7515e01ae1f88098c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift#L78-L81",
|
||||
"version": "repo-lines-v1:sha256:72699cc8d65faa86d18075b1f1cd656984a00050309defa8987bd8d9c33a61bf:eyJzZWxlY3RlZExpbmVDb3VudCI6NCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiM2M4ZDg4OGJmZjUzZTYwYjQxNmE2ZGYxOGRhYWIzNmYwM2UzOWQ4OWJhYWIwOTkwM2Q4OGVhYWZmZjc1NGRkZSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiODM4ZGEwOTQ3NGI4NTc4N2I3ZmJjMmViMWY0NTNmN2UwYThkMzJhZWE1MWRhNmFiZTlhZjZjMjgzYjJlZDYxYSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMDQ5MTdhZjFhZWVhNTY2YzIxOWQ2OGY2OWM2OGEzODIzNTdhMDgyMDI1ZGM5MWQ3YWY3Yzk3OWQ0Zjc0MjAwOCJ9"
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
"version": "repo-file-v1:sha256:3279e1780ccbe60d036b141a306261ed99fe10dbee0ec890671bb7573997b6ea"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L16-L44",
|
||||
"version": "repo-lines-v1:sha256:3fadb0523a363711191ac025b2a2be70dca696c5d1189ef587e89c1687da7ecb:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZkZmUzZTM2OTM5MTg5ZDg3NGU0NzlhZjFlYjJhNjg1OTY4Y2M1MDg0YTM2MDYwMTcwM2E3NjU2ZmZmYTdjYWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNhMGQ4NTMzZDViNDMxOTM5YTVlZGI0MzY3N2Q3NjYyYTU0NWM2MWIxNjNlOWI4MzFjZWI3ZGZhZGRmYzVkYzYifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L767-L834",
|
||||
"version": "repo-lines-v1:sha256:a07e0e245c8f4f406d84b4fef5566cdc859fd6f1122354eb1b71ee859d8c361c:eyJzZWxlY3RlZExpbmVDb3VudCI6NjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAyMTExNDcyZWQ0MmE0NDkxZjc5OTQ0MzNjMTM5ZTBlY2M3ZTczZmZhZjI4ZTZlYzIzZDI3OGIyMmRjZmYyMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjkzOTgxNDU1ZTQyYTZiNzRiOWU5N2ZiYTY0MjM2NTQxM2Q4YTNlOTJkY2JlNjU5NjY1ZDUyODA0OGExZmU0MjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYzYzUyYWM5YmUwN2MwNzljNTRhZDgwOGMzNDEzNDMwMjFmYmM4M2NiZDVmZDk2ZGNlZTk4MGY4YTI2ZTU4YzMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift#L33-L68",
|
||||
"version": "repo-lines-v1:sha256:1ea05d84f5bbde850a612da2de508f4c2c278de3fd5ce0ee1710e12e4ecfa25d:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgwNzEyOWY5ZDgxMzg1NTc0NWI4NDZhM2Y5MDNhZDRlOTk2MmIwMTJiMGVmZjdhNGM1MjI0ZTAyNzVhZDBjYjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI3OTE4NTE4YmYyODg1NTFhYWVkOGRlMzU5YTQ1NTQwNWUxOGMxYmRjMjEyNDgzMGI5NjA4ZmJjMjU0MGI2MWIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE0YWIwODlkMDRjOTQxYmEzYTg2NGI0ZjEzODE5NDM5ZmNhZjk1MTgyNjk5MjdlZTZkYjQ3Mzg5OTNjNDc2ZWQifQ"
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift",
|
||||
"version": "repo-file-v1:sha256:0288f63f82aaa2fb09baff8ab6bcb8cfcb1a3c6cf6f119777e26380c2723620d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -389,24 +381,20 @@
|
||||
"statement": "Vault Host sections preserve nested and empty groups and persist collapse state in the library while search still finds Hosts in collapsed groups; group deletion can either ungroup retained Hosts or delete the tree's Hosts through the app deletion path.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L525-L532",
|
||||
"version": "repo-lines-v1:sha256:846f167cc88f879c3f24575b32488276b1c6993d16e5adfee0a9cedc112cce7f:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYjQzY2Y5ZDU4Yjc4MDU3YzEwOTg5MmVjNDFjNTYzNDY5NTE4ZjE1NGEzNzM5MzBmOTJlMmRmZjlhODNmMDdjNSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiOTk5YmRlZmVlYWNhNjM0MGUwMjkwZGM4NmU4ODljODlkNWUxODlhYTViYTQ0YjU4NWIzYjcwNzM0ZjRhNjJkOCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYzJjMDFiYmMwOTgxYzlkMjJkNzM1MmU4NjIxZTg2YTg0ODg5NTQ1Mzk3YzJmMjg2NGZiZmZhYzQ5ZTc3ZTY1ZiJ9"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L441-L513",
|
||||
"version": "repo-lines-v1:sha256:456cfc3a140a45f1536ca95bdf7f347179c129b50a48912515b2528bd411b911:eyJzZWxlY3RlZExpbmVDb3VudCI6NzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRlZjlmZDM3NWY1ODkxYTc2YTE5Mzc2YzI0NTZiNGYyMzM4MmVjODJkNWJiNTkzMDEyZTNmOWZkZDNhY2YzYTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJjZmUyOTY2MGQwMWI1MTk0ODgzMDkwNWE3ZDQ1ZGQ0NDUzMGNmMWMyNGE0ZTk2NWI0OGMwMDY1OGQzODBmYTciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJiODlkNTljMjE3MGEwZWFmOWY0NDc2YmVjMjRjOThlYjdlYTRiMWNlYTY4ZDQ5MmQ2OGNkNzAzOGZkNDE0YmQifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L663-L760",
|
||||
"version": "repo-lines-v1:sha256:0a7beae712af175e3c91d44d76c441c66a033e3dd2e46f0923329b0aa7773cf9:eyJzZWxlY3RlZExpbmVDb3VudCI6OTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJhZWI3OGJkZmVlNGM0NWMxNGZhYmIyNGE5ZjI4MDhjMGZjMDlmNDdiNjc2YjZhODJmMWM4MjBhYWFlNWJjZjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjcwN2QxMWQxNmI4Zjk3OTFiZWRkYmI4ZjYxMDhhMjE1N2Y2YmZhMzUxMzhhMjZiZDUzODQ5ZThhYmU4NjkyMTIifQ"
|
||||
"resource": "repo://TFITests/MobileCardTests.swift",
|
||||
"version": "repo-file-v1:sha256:667200b9f2a179409df921dc6d6471f4ff081a98c462dfc0dda8fe9a08d35f24"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardTests.swift#L113-L148",
|
||||
"version": "repo-lines-v1:sha256:780d54c2aa93b53dd841b7eaa1bf2ef298287443ecf655933e16024be9a46172:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFiMjBmMWIwYTE1MjBlYjU0OWM1ZTQxM2NjYmQ3ZjRkZmViYjAwOWQzNDNhZDM1MDM3ZGUwMzBhMDgzNDlmMjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVlMjAwZTI0ZDg0M2FjMzhiYjkyMTc2ZjRlMzZlOWEzOTNkOTM4ZjJlNGFhYjU0ODFhMzAzYWU2YzQ4YjQwYjAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU3MjBjMTRlZjEyZDI5MGRlYmExYzJlYjkyYzYwOTYzMzBjNzkzZDcyOWJmNzRjOTRhNzUwNDY4MzU4NGNmOGIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift#L101-L134",
|
||||
"version": "repo-lines-v1:sha256:6768055581f07f3dec6f401580626fe226d088bd5546fcd882b3e72d40b26c20:eyJzZWxlY3RlZExpbmVDb3VudCI6MzQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNmZmYyODVjMjI3N2YyNTA4NWMwMGJmOTc3OGQ0OTgzMjdiZDFhMDBjM2NiOTM0NmU3YzBkZDliZTNmZDE5NWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA4NTc1ZWNhZWViZWYyZTk4MzQ1MTBhMjE3NmE1OTBkNWU1ZGZjZWFiZjE3NThjNzBmNzg1N2UyNTA1YTQxZWIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY5ZjNiNTgzMTZkZmQxZDVkMDg5ZGVlM2EyY2Q5ZDEzMjFiNGJlZWJmNmEwNGJmY2E1MWQwMjViYWMyM2E4ZmIifQ"
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift",
|
||||
"version": "repo-file-v1:sha256:0288f63f82aaa2fb09baff8ab6bcb8cfcb1a3c6cf6f119777e26380c2723620d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -429,16 +417,16 @@
|
||||
"statement": "Mobile Host cards display at most two tags without changing standard card height; card and forwarding-card layout behavior is covered by measured-height tests.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Design/MobileDesignTokens.swift#L3-L15",
|
||||
"version": "repo-lines-v1:sha256:9f66d7f273710c4d50f062728e5df6c899c58d89f5d9ddd241c7c92f90e87a40:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc2M2E0MDYxMjcxNjkxZGY5ZTZlNzNhNDc2ZjY2MGZiNDAzZmE3OGYwNDBjNDVjZTBhMmUzM2ViZmFlYmNlMjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjoyLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBmODVkNWEwZjU0NTg4ZWEyNzdkOTIyZjAwMzZjOGFiYjMxNDg0YzQ4Y2UwNzY0MjZjMjdjMTA5NWVmZDE4OTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://TFI/Design/MobileDesignTokens.swift",
|
||||
"version": "repo-file-v1:sha256:4d999706a477b00862193c014002b15cdfe098297c294833e4a8622382a2b880"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L776-L805",
|
||||
"version": "repo-lines-v1:sha256:b450a12dafd975a16cff62a0e87313c4ed0135ae1696c5bf1946ec4099b4af1b:eyJzZWxlY3RlZExpbmVDb3VudCI6MzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAzMzhmZDQxYzFmNWI5ZWQyYmY4YTQ3N2QxNWQ3ODYyNjVmODE4MmZiOTA3N2QxMzM3Yzc5NzM4ODU5M2I2YzUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY2NjgzMDMxZjE3ODk4NTBhNmU4M2UwNmEyMGM5YzFhZDNmNzM5ZjcwYWRjYTZlODQxM2M3YzBmMTgzYmJmNmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ4ZTM2YTk5OTllOTZjN2FmZjllMDIxNmRiZDcwMGIxMGNmZDVlYjM0ZmIwZGMyNjI4OWRkZmIxZjIxYTk4NzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE0NDVhM2ZjOTQwNWI1YWZlMmU3N2IwZTQ4MzJkZTQ1NjY5ODM0YjRkYzA2ODBhMGZiZTBiNWY1YzM5MjQ4MmYifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardTests.swift#L49-L85",
|
||||
"version": "repo-lines-v1:sha256:7992d7f52bb45d306c7c6d3e7005c7ee0c6505ae4280e37208e49b027818dae9:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY0YWEzZWRjOTBjNjc4ZmVhNTgwNTlmMTExODRhMzk0Nzk0NTc5ODNlZmE1OWMwZmUxNGQwMzM0YTc3ODBkMjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBjMjI2NjIwNTE5ZDBhODVkM2NkOTQ3Y2M2YTc1ZTY5ZWEwZTVmZTNkYjY4MTBhN2Y1MTI0OWNhMWE2Y2VlODkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNkNmNlNjA2NDBhNzAyZjg1YjM4MzgxZTc0OWQzMjc3ZWJiNTdjYTVhNGMxMDNhZTYzNGFmM2UxYTE2ZTU4M2QifQ"
|
||||
"resource": "repo://TFITests/MobileCardTests.swift",
|
||||
"version": "repo-file-v1:sha256:667200b9f2a179409df921dc6d6471f4ff081a98c462dfc0dda8fe9a08d35f24"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -447,24 +435,16 @@
|
||||
"statement": "MobileHostEditor keeps a Host and Host-custom credential draft local to the sheet, uses shared presentation sections with SSH/Telnet-specific controls, validates host, enabled protocols, ports, identities, proxies and environment before Save, and delegates durable Host and custom identity persistence to HostCustomIdentityDraft via the library.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/FeatureModels/HostCustomIdentityDraft.swift#L229-L289",
|
||||
"version": "repo-lines-v1:sha256:f4da79b6a808be0ecc0884ee5fed0550c9f7505698591cd214d062e4e35c818f:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFlMGY0M2FlNGYyYzcwMDNjZDk1ZTc3ZDc0NmQ1YjNhMDE2M2U2MTVlMzVhODEzODI3Mzg0NGRhM2VkM2ZjOWYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ2ZjM4Y2E4YzJjOGYzMGZmYjkzOTZkYWZmMzdhMGM1YmNmYzI3NjcxMmI1YjM3NzM0NzM0YTg2MTNlZTEzMDQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://Frameworks/TermindApplication/FeatureModels/HostCustomIdentityDraft.swift",
|
||||
"version": "repo-file-v1:sha256:072f2ec5b033ad57fa92e1ea95df08044cf9e91329e1337d9351c606187ea444"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/FeatureModels/HostCustomIdentityDraft.swift#L6-L10",
|
||||
"version": "repo-lines-v1:sha256:7dbe0b61f6e150c1022868b905224e61ced4ad7f0749a5e41252fc1bcae14b9a:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiM2I3ZmZhNTU1MWMwZjNjNTUwZmE4MjkzODNhNmI1MzI2MWM2NmI5MGQ5NTU3ZTNkZDg0NzFhYzMzZDk3NzcwYSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDQ3NTE0MGUyNmU5YzVhMTcxMWQ2NDQ1YTE4YjdmNGFlMjAyMmY5OTNlZjYyODQwNzU1NDMwMWI5NmUwZGMyMCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiY2RhMzEyZmUxNTU3MDQzOTMzNGJjOTAwZGI0NDI5NTM2MmYzODlmNWM2ZWQ4ZTQxNWI4MjJjMGY3ZjA0MmM0OCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMmNiMGE2MTZmN2FjODVkMDRhNjg3ZjFjYTM1YjM1MGIyNWRiYzg2Y2JjMWVjMGQ1ODUwOTliMjliOWU0ZDlkYSJ9"
|
||||
"resource": "repo://Frameworks/TermindPresentation/HostConnectionFields.swift",
|
||||
"version": "repo-file-v1:sha256:bb9245bcbfc3ea5dcfb136c816635cf8d4257e9eca6f7518fa59b4cec7e0ef74"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/HostConnectionFields.swift#L6-L110",
|
||||
"version": "repo-lines-v1:sha256:29c7efc3b61247d2d68e1e17d4db6c249d314d57e82f21af61c33b1061cd21c9:eyJzZWxlY3RlZExpbmVDb3VudCI6MTA1LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJkZGRiMTRiMzgzMzAzNjRhZDk3YmViODY5NWVmYzMyYTFjMjkwZmUyYzk3Y2EwNjAxZmYzY2QzNzhjYTVmMTI5IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0ODkzZjQwZTM3ODFlYjg5NmM4MmQwNDZhMDgwNjdhMTFlMzVjZGYyZjFkZmFmMjZmZWE5MGI4ZGI2Njc2NDEzIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJjZGEzMTJmZTE1NTcwNDM5MzM0YmM5MDBkYjQ0Mjk1MzYyZjM4OWY1YzZlZDhlNDE1YjgyMmMwZjdmMDQyYzQ4IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MSwiZm9sbG93aW5nQ29udGV4dEhhc2giOiI0MTJjYTM0NWNjZjc1YmY5YzA4MDZiY2U2OTViZThkZTgwOGI3OTk4NDI1MWE3YTU0ZDIwMmNmNjEwMWRkNDUxIn0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift#L27-L85",
|
||||
"version": "repo-lines-v1:sha256:a6e29baaf15f74202edf721730ed24039c57ae6838fe140b2b4e362d091ee07e:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZlMzA0ODhhNDJjZmI4Y2M1YTgzMjM2YjRjNmM0YmE4NTg3YTY1ZDlmNWZhNDUyZGE4ZjY2MzhkMjhjNDZlYmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBkNmFlZmJiYzE2NGE0NjBmMTYyMDM3M2FmODUzYWI0Y2I3ODUwNTk3YjY5Y2UxNWQ0NGI1NjI4NjdjNDhmMGEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAxZGQ3YmJmYzM4MTU4YTI1YWNiMmUzMWU5NWZjYjdkYjFlMDRiYTA4ODg3ZDBhZWM2ODVkMzNhNDQ2Y2E0OWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM2YWU5ZDE5OTIwZjMyYWQ5Yjk0ZWI3ZmYzNDk4ZWM5ZWY4ODBlMDEwYjZkNWUyZDgxNGQ5ZWQ0NmNiZTdmN2MifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift#L85-L268",
|
||||
"version": "repo-lines-v1:sha256:1791485dbc760b6a70abc050298fbc5fe8fc27cba0b5980e353fa9e6c1bbf1c2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTg0LCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIwZDZhZWZiYmMxNjRhNDYwZjE2MjAzNzNhZjg1M2FiNGNiNzg1MDU5N2I2OWNlMTVkNDRiNTYyODY3YzQ4ZjBhIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJlNmIwNDQ5MTQ2OTcyMmU4MzYzYTk0ZTQwNDQ1MzhlMDEzYTJhMjE3ZTM2YjFlNTY4YmE2MGFjYjdiNGM4ZjJlIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI4MWE4OWExMWNlN2ExOWFjNDBlZmU5NjNiMzFlY2FlYjkwZmNlYmYwNzczZGRiNDdlZmYxNTg1YmViNGI0MjU2IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiI2MjNhYmZhNzc3ODY2M2M0YTg3NzkxY2QxZmE0MTk5YzlhNTNiNWMwZDI4NTYzZWJkMDQyNjU0OGRkNzZjOTM4In0"
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift",
|
||||
"version": "repo-file-v1:sha256:0ca046969bd969fa4d4f4d245220726eb709fe97d4df67d7969b19807a8aae32"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -473,8 +453,8 @@
|
||||
"statement": "MobileEditorSheet owns dirty-discard confirmation, async save progress, error feedback, interactive-dismiss prevention and in-flight task cancellation on disappearance rather than allowing a failed save to silently close the editor.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/UI/Components/MobileEditorSheet.swift#L13-L108",
|
||||
"version": "repo-lines-v1:sha256:538f0ee547a19e0e7559fb08ac488e9345fab5ce2baad4deae9c274fab19f0d3:eyJzZWxlY3RlZExpbmVDb3VudCI6OTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBhN2M5YTk5NTdiOThhZWU4MWNlMmQ1NDhkOTI3ZTk3ZjFjZTE2OTllYjAwMGE5ZjY5Mzc0OGY5ZGExMTYyZDgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJiZmVkZWI1YzcxOGQ0Y2VlZjQxMzViMDE2NDNlYWM3ZDUzMTY4YzRkZTc3MDJmMjZiZmQwMTQ1NjNhNTUzYWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
||||
"resource": "repo://TFI/UI/Components/MobileEditorSheet.swift",
|
||||
"version": "repo-file-v1:sha256:1ac73af36fbba10f888b4b6d14c6ae03505f9033159e218888aeb7f4954a1e4b"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -483,16 +463,12 @@
|
||||
"statement": "Vault's Known Hosts is a separate card editor for SSH host-key entries: card tap edits, a secondary action copies the fingerprint, confirmed deletion uses the known-host store, and saving validates through app.knownHosts; hashed entries do not expose a recoverable port field.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift#L6-L86",
|
||||
"version": "repo-lines-v1:sha256:c95a7ee49b5428df46595142db320a1c9b94635eb0003029a58ed9d7e75aba82:eyJzZWxlY3RlZExpbmVDb3VudCI6ODEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3NzM1ZGU2NzdlNWVmZTVkYTI5NWUyMGYzNzk0Y2M2MDM0YTI4YjJlZGJiODc1ZDZiMGRiZmQwZTMxNTNhZGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNmYTE5ZjJhYWYyNmU2MjE5ZGY4MmM0M2QxOGI1MmU5OWI3MzhlNTIyNDJiMjE4Y2VhZmEzMjg1NThkNGNjZGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFkZTY3ZmY5NzJiMWUxZDk5Njc0OGE1ZTczYjM2NmY5MzU4NzZiMDE4MGU5NmFlYzI4YWJjM2UyZGVmZGQ1OWMifQ"
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift",
|
||||
"version": "repo-file-v1:sha256:fa8263ae0b73e44ebc464500c12d7b4d05158c8a9ccf45f2d8fd85c82c4b0fa4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift#L89-L154",
|
||||
"version": "repo-lines-v1:sha256:ba61694ac7cb6511e2145c7bb97834acf099353fe88d3e6df2569e52e66faa65:eyJzZWxlY3RlZExpbmVDb3VudCI6NjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3OTJkZjUxMDBhY2FmNGJjZWI1YWMxNDljZDI5ODEwYzFhNTc5YmU1OWIxNjIzMWVhMjA0NDgwY2M2Mjg5OTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L585-L594",
|
||||
"version": "repo-lines-v1:sha256:61a53c7427686f015a2a0e178754b73c6cace5d3a8f133c0ec322a0f059d97ae:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVkODVlZGRlZTIzMDBkZGNjMTY1NGI5MzE3OWQ1M2Q0YzExYTZjMTZhYThlZmFjN2IxYjcxYmEwMDRhZTg5MWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1MjJjNDJjZDE5YzZkMDNkODA4YzQ1MjcyMDU1MjgyNWI3ZWExYzViNDkxYjIxODUxMWNhYzc0MTVjZjlkOWIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVkNmEwYWJkNWM1MDRmMzM0OTMxZWY0ZTY3YTAzMzBiZWIyYWFmYTNmM2UxZWNkYjhmYmRiNDYxODhkZmMwMmYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -501,12 +477,12 @@
|
||||
"statement": "Host duplication creates an independent Host ID/name while removing references to Host-custom identities, so duplicate actions do not share Host-specific secrets.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L534-L549",
|
||||
"version": "repo-lines-v1:sha256:0d01fc0bc960d8e9ede9793b66394cce8ffdd3aa5d778fa6d9b366973c979fa2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImEyZjRlZTNjMTI5MGIyZDBiYjE4YmFlZDJmNDE0ZGJjOTk1ZDExNDE3ZTYzYWFkZGNhN2MzOTFiNjMyZjA1ZmYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImFkYjQ1OWJiNzNkN2U1ZTQ2Y2YzZjg4ZmQ1NGFhNjQ2N2E5OGI0Njc5YzU4MGFhZDc5MTdmZTFlOGUxZjcwMDUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE3NzRiNTU3ZTIwZjFhNzM4OTJjMTc2YjJhYzQwODlmY2I4Mzc1MjY1ZDgyNjQwM2Y4Nzc1ZTQxMjYzNzZhYmIifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift#L70-L99",
|
||||
"version": "repo-lines-v1:sha256:7f1eee07fcdb08cacdb0aee8ead03028da5d588ec619947fbd773d04a13b5e10:eyJzZWxlY3RlZExpbmVDb3VudCI6MzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI2OTllNGJmZDIyN2YxOTYwZWI1MWY3ZTlmMTU4NTFmMWMwOWQ4NWNjNDkzZWJjN2E1MDRmMGQxZTY2NmQ0ZDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM5YjJkYjM3YThjY2FiMDIzMTkyOGUwZGY0MzcxOTc3ZWQzYzQwNzBkYTlkMDUwMjEzMzQyYmMwMmQyOGE0YWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE2N2IyNmY2YWVhZGY4N2Q2NWViMTgzOTUyZGY5OWRmYzcyZjc2YzI1ZDFlYzI0ZDg3OWNjNWFkNmVmOTkxMDMifQ"
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift",
|
||||
"version": "repo-file-v1:sha256:0288f63f82aaa2fb09baff8ab6bcb8cfcb1a3c6cf6f119777e26380c2723620d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -515,26 +491,22 @@
|
||||
"statement": "Workspaces Recents filters local events into a maximum of five distinct Hosts only when no saved or live Workspace is listed, while quick actions publish up to three openable Hosts from the same local projection and re-resolve terminal capability on activation.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift#L88-L105",
|
||||
"version": "repo-lines-v1:sha256:14eed48b39ce10f59fee0068214b04db5f0f481e900b4ed0a90dfc1d866798a3:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZDUzYmFhYzE4Nzg1MmI0MzFjMjMyZTA1MTYwNjFkNDk2ZjdhMjE1NmVlNGJmN2RlYTY0N2ZjNjY0OTg2NmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ0OGI4ZWMyMjc0MGQ4ZDA4YjAzNDZlMmE1OGE3ZTMwYTEyNTMzMDNmZTU5ZTJjNWE4MzE4NjY0Mzg1NTI0M2YiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImNmODZjOGRkOGIwOGUxYmE0MWEwYzhiN2Y0NmQxMTBmYzFhZTk3YzRiMzk2ZDNlNTk3YThiMjk1Mzg2NDFlMWQifQ"
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
"version": "repo-file-v1:sha256:3279e1780ccbe60d036b141a306261ed99fe10dbee0ec890671bb7573997b6ea"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceListView.swift#L183-L190",
|
||||
"version": "repo-lines-v1:sha256:aa1856158ce2fbaea83b75c9e7e49f3c80ccec56b7b0b041591862872beaf4d7:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMDc3Y2I1ZjRhYmRiZjgxNWE0YTZiMzUxOWE5ZTNlNmIxM2Y0Nzc4NTg0MmFlNjQ2ZDEyZWQ0NGQzOWU0ZjY5ZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiOTk5YmRlZmVlYWNhNjM0MGUwMjkwZGM4NmU4ODljODlkNWUxODlhYTViYTQ0YjU4NWIzYjcwNzM0ZjRhNjJkOCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjQxZjVkZjVhNDQyZGQwN2Q1ZWVjMWZiOTQ2ODMwMWMzZjQ3YzRlNzIyNGI0YTU0OWJhYzMxMmEwMmQwYmUwOCJ9"
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceListView.swift",
|
||||
"version": "repo-file-v1:sha256:f930f9694ed5d428ece5550b01f8a5b62436c6e2ba565e71c69e3fdc0a4657da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceListView.swift#L37-L53",
|
||||
"version": "repo-lines-v1:sha256:5610fadbc23981d1bcdcb4c387bfddac5cbe7d4071c26c5c3089adcddcad8ebe:eyJzZWxlY3RlZExpbmVDb3VudCI6MTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMwOGZmYzFmMDllNWEzZmNhMmI0MDE5OTIzNjY1Y2I0NjBhODA2NjIwZWNlYWJmODRiN2IwNDYyZGYyYmM3MGYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1MjJjNDJjZDE5YzZkMDNkODA4YzQ1MjcyMDU1MjgyNWI3ZWExYzViNDkxYjIxODUxMWNhYzc0MTVjZjlkOWIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjIwZjFmN2Q2YjE4ZDNiZjJmMTM2ZjgzZWQ5ODhmZDc4MmE1NzgzMWQ2MGZiYWU3NDY1MjBlNDM2MGViMjQzMjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImRkMjAyNDczN2I3NzRiZGVhNWE4MTA1OWI5MzQ1YjhiMWJlMDUxMzg3MWYyNzUxNWFhNGQzNTFiMDJkMjU4YzMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Platform/MobileHomeScreenQuickActions.swift#L68-L85",
|
||||
"version": "repo-lines-v1:sha256:5182cc7b295da108c285936161ef8d3a015b3bfa4f8278b2cc65c2ccffb6a220:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY0YzRiMWQxNGU2YTFjNTc2ODk0ZDhkYWUyMmViNTQ1YWFkYjY0NDU2Mjg2NGE1ZmVhMWQwZjU4MDYxNmIxNzciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZjNGY2MWQ0YWEzNzkxMTQ4YTUyNGZmNzA2YWE5YTg2MjQwMDZkNGNhMTIzZWM3NWU4YjQzOTRlYmZkYjdhOWUifQ"
|
||||
"resource": "repo://TFI/Platform/MobileHomeScreenQuickActions.swift",
|
||||
"version": "repo-file-v1:sha256:876e36822c6894079fa98043df42e98d7044a2b7658eacb3a4e049075d41cf88"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:bca96ac65afae5b3c664cba51d37fdd56b978934b1d494d475e95d057226bf98",
|
||||
"pageVersion": "sha256:3dbe70c12c4d9e377a7282f38eba5a02c2eb396d5d044254044e125cefe0ad07",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_34230e88036241baad093fb8de5bac8e",
|
||||
@@ -32,7 +32,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
@@ -40,11 +40,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:6156e0821962b295b33e546540b8894537b1e053c788ff50b30e276d5ab3b092"
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -140,11 +140,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -153,16 +153,12 @@
|
||||
"statement": "TermindIOSApp is the mobile @main entrypoint, which selects live or test dependencies and creates a MobileAppModel for the scene; failure to initialize displays an unavailable-content view, while desktop TermindApp creates app-wide composition for each WindowGroup and terminates launch on database initialization failure.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift#L5-L33",
|
||||
"version": "repo-lines-v1:sha256:1574c44f26f386fca5834af375adbea23b9471aaca384b9aa647006e94caec2e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZmJkYmI1MDE2YWM3ZGVlYTU2ZTg5MGFlOTNhZDc3MzY1Y2I0ZDhhMGQ4NjhiMmU2YzliZTNjYzExYzQ2NGQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE0MDI1ZTA5ZDBlYTM3ZDMyNTYyMDVjODkwYTg5YjU0NmE0MDcwNTg4MDJmZWUyZDY1N2Q2ZjJmODg5MzllMTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQwOWRlZDA1YTMwZTBiMDk1ZjI3NWRkNTcwMzRmNzU2NTgzNjBjOWQ4ZWIyNTg3NjNjNGI0MDMwYmM5ZGRjYjEifQ"
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L13-L21",
|
||||
"version": "repo-lines-v1:sha256:06b626892110f9744884986c24067cdd36319b7ecbff0b8e399689be24a91fe3:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNWNmYmRiYjUwMTZhYzdkZWVhNTZlODkwYWU5M2FkNzczNjVjYjRkOGEwZDg2OGIyZTZjOWJlM2NjMTFjNDY0ZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiOGJjYzYxMWFmMjNhOTFjM2I3MjdkMGFjZTRkZTIyMjQyZmM0OTA2YzcxOTRhNjM0OTE5YjY1ZDcwM2RkMDBiMCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNWEyZGI2NmY0YTUzMjU3NWRjNTBmYmM5MWNmNGJjYThiMTVkN2U4ZDJiZTlmNWNjMThlMDY2MjY1OWMwYTVmOCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYTljYTJjYThlNGZlMzI2MzgzMzdkNzZmYjI2NzI0NDRmZGNjMTI3MjU0OTQ4YWE3YWMzODZlMzhiY2JiYTY5MSJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L137-L212",
|
||||
"version": "repo-lines-v1:sha256:11dfd817e23e7a83d0ba2e12fd400fa125b0db9a3f60b67d7cd8192803616199:eyJzZWxlY3RlZExpbmVDb3VudCI6NzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJhMGFmZmI5M2JmYmI4NjViODQ1NDU5NDY0ZGIzNmVmNDdkN2QwOTgyYzBjMGJlMzI1ODI1M2NhYzcwNTQxNjgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVmNzY0ZGRiYmJlYTkxMTUyN2U4MTdhODBmNmZiOGExMmU4NDE3MzE3ZWY2ODEyY2Y5YTgxZjc5MDgxOTkwNjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdjZGEyMmE4ZWYyODNjOGFmOTJjZDlmMmY2ZTA4MzdkODg4MjdjYjBkZGM2OWNlNDFkMTAwZDFiOTdjYWM5MmMifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -287,6 +283,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:6fcee3a37158ff40799ce0b4dc356338d80ec4b9e1bc658f5d856c466618b2fe",
|
||||
"pageVersion": "sha256:292b2eb72af811fc62750a5dadf871d3b272b65a49013ce5fd8e551a35437b1f",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_8e9cf2adb50847f98fcd4516cb0ed521",
|
||||
@@ -12,15 +12,15 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift",
|
||||
"version": "repo-file-v1:sha256:3aed203d6e01bca706733b899b9636aa4808717dea3a8f2d044fd01db08a33d5"
|
||||
"version": "repo-file-v1:sha256:c2f5bd4b56b1c901b8f139b34372452037e6c95315e1dc3e50b08f3215f5d748"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:6156e0821962b295b33e546540b8894537b1e053c788ff50b30e276d5ab3b092"
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -32,17 +32,13 @@
|
||||
"resource": "repo://TFI/Application/Connections/MobileWorkspaceConnectionServices.swift",
|
||||
"version": "repo-file-v1:sha256:ef59c5a0c8f3a85f06ebc889641b86f279388044be2140e86615e2e10a1ab9da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Application/Repositories/ToolAuditRepository.swift",
|
||||
"version": "repo-file-v1:sha256:e8f3fef7528eb405bc5537e5fbd89a90bec0304e9be075419b3b916d6ad85147"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Application/Serial/SerialPortService.swift",
|
||||
"version": "repo-file-v1:sha256:a46f15942b08e733481d2b315d7810a198229852bb0213dcb56dfd0ce3870c7a"
|
||||
"version": "repo-file-v1:sha256:c7c790b6611795b1817fd485ec5a43805edf146fe262f0869537b816ac181d6b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L70-L122",
|
||||
"version": "repo-lines-v1:sha256:99e13181818902dd10a0752232d9b88d1202274b2d8bb1f6662e37bd185bcdb5:eyJzZWxlY3RlZExpbmVDb3VudCI6NTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZkOTZjN2U3ZTUxOGViZWYxZjQ2ZGJiNmM3OGRmYTM5MjBkZjE3OGE0NmQ1MTQ0MGFjY2YwNjc3ZTE5YjMyMDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg5MjdkODJhMjlhYzUyNjBiY2I0NjJkZjEwYmI2MmQ3ZjUwODg1ZjAwNWVmY2MwMTcyY2Y0ZjRjMDliZjE0MTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU3MzQyYWI0YTU1NDg5ZmFhZjMxZDM3NTgwY2YzZjI5MmYxZmUwMjI2MzhhMWRkZGQxNzM0YTBiYzZkM2ZhZjAifQ"
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -52,15 +48,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPDownloadCoordinator.swift",
|
||||
"version": "repo-file-v1:sha256:e5ffbb3acd1e863e6146f4f5c23e244fa9d028254f02f1358d6fcc0b8664e5e8"
|
||||
"version": "repo-file-v1:sha256:8be3783d975ac47d92fcbd9364e39db11b449980d07c87bcfa5fe3abf15d1ced"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPServerTools.swift",
|
||||
"version": "repo-file-v1:sha256:7fb10e9423fc06bfc8c45a3b189ffd03cc3b8f588915c1e9afa3cc33b91d6020"
|
||||
"version": "repo-file-v1:sha256:11a618b54c8c7c8cf212423feb11ef58ee507f58a852a9fa4a7e5fd06bdf2800"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPUploadCoordinator.swift",
|
||||
"version": "repo-file-v1:sha256:d4b9205cc908ce2c38eb1e82ca1ea0a84a45794fa0613b0e794177ae9e48a48a"
|
||||
"version": "repo-file-v1:sha256:40e4a170562f9f04dc759dcff0727cb52dae8ad2a62af6d7b7ab66368bb26907"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Infrastructure/MCP/MCPServerSession.swift",
|
||||
@@ -85,12 +81,8 @@
|
||||
"version": "repo-file-v1:sha256:ea46bc5d91b8f0cbbdf562a56e1383dc1d7732ba249b109dd676a54369acf9c6"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Infrastructure/Database/SwiftDataToolAuditRepository.swift#L8-L39",
|
||||
"version": "repo-lines-v1:sha256:38b8970feee35b8cbaae0f8b45bc929123bede6525aa60b92af877931f846081:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ0NzUxNDBlMjZlOWM1YTE3MTFkNjQ0NWExOGI3ZjRhZTIwMjJmOTkzZWY2Mjg0MDc1NTQzMDFiOTZlMGRjMjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZjYTIwNzI5YzQ2YjVhYTQ3ODI2MTBkYjZhYmFmYTg2ZWRjNmNmNzdiNmM2NDA5MmFmYmEwOWJlNTdlODE2ZDEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNkYTMxMmZlMTU1NzA0MzkzMzRiYzkwMGRiNDQyOTUzNjJmMzg5ZjVjNmVkOGU0MTViODIyYzBmN2YwNDJjNDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhkNDdhZjBlMDg4MzA4MmQ1N2JkNzAzMzMyZDU4ZjNjZjBiMGQ5ZmY0M2VjOGMyNGEyOWU4MzNlYTZlOTJhY2MifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L191-L205",
|
||||
"version": "repo-lines-v1:sha256:c4ec94e716e4cb8b2c13ee93ce7d370e5a3800eae469b89cf13c6870f5fcc45a:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNlMDlmOWExMjczZjgzNDQ3YzRiNzFiYmEyN2YwODAzMzcyMTkyZWZlODBiNmMwMmM1MzA4Y2U1YThkOTI4N2QiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM5YjJkYjM3YThjY2FiMDIzMTkyOGUwZGY0MzcxOTc3ZWQzYzQwNzBkYTlkMDUwMjEzMzQyYmMwMmQyOGE0YWYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ0MzM5NTc5NTQ5OTAyMTEzNTE2MTA2Mzc0OGM4NTM0ODkyODlkOWExYzlmNDIzMGJkMmM5NzliYjU0NjZlNzYifQ"
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -100,27 +92,27 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Assistant/MobileAssistantView.swift",
|
||||
"version": "repo-file-v1:sha256:0fddf4b52985fd4751bd49999edac5564d870aa83581e8310b97abc769036c7b"
|
||||
"version": "repo-file-v1:sha256:d18bef4e97506ba41d6a1437e72fc60f54b2154d70f04c5030288e48087c40fe"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Shell/MobileNavigation.swift",
|
||||
"version": "repo-file-v1:sha256:3990f0736d3218c6b7720fae9650f413d8472178d755dfabb69321df8c5bf4d1"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift#L48-L150",
|
||||
"version": "repo-lines-v1:sha256:2a79c9678fc370d7b26355ffd6ce56c0674405e4d0be61de5717bce47060b1df:eyJzZWxlY3RlZExpbmVDb3VudCI6MTExLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI2OTZhYmUwMDhjNjk0NGIwYTMyYmU3MmQzNmNmZjIzZDA3NDJhNDAxMDAyM2NiODZhYTY2MDYwMTBhZjFjNzZkIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI5MGIxYjkzYTJlYTViNmUxZjBlOTFkNDAxMTI4NjRkMjVhMjZjNGRlMzAzZmY4MDk5YzVmOGI5MzY4NDg4N2Y2IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiI2YzRmNjFkNGFhMzc5MTE0OGE1MjRmZjcwNmFhOWE4NjI0MDA2ZDRjYTEyM2VjNzVlOGI0Mzk0ZWJmZGI3YTllIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIyZWI5MTIzYmRmYTY5N2RhODdlMWUzYzRlY2Q3OGEzMjQ2ODA3MzM3MjVhZjQyMDMwYWExOWZkMWJkMzhmNDIyIn0"
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift",
|
||||
"version": "repo-file-v1:sha256:c2f5bd4b56b1c901b8f139b34372452037e6c95315e1dc3e50b08f3215f5d748"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift",
|
||||
"version": "repo-file-v1:sha256:7ce70114f4784fe940c151bb3cc5f376e6fcadb814f466cc93a41b24e6ec760c"
|
||||
"version": "repo-file-v1:sha256:8afffffbb974da8b4c7e4629ccac060f2b0cae5164ffa4f932dee2e083cbc15f"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Shell/WindowRoute.swift",
|
||||
"version": "repo-file-v1:sha256:e765b000ace38183f77e6d39a59079a4761888b80f90baa15798d27fe5e42a6e"
|
||||
"version": "repo-file-v1:sha256:d9456b2dc0c826014e380cd98127f5253a73ad0042ef94da57faa39218943b9e"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Terminal/SSHSessionModel.swift",
|
||||
"version": "repo-file-v1:sha256:959a88f6c2b5aa2f9f49b943d0908a7696c0e078fa7c9bbd7593cfe2b5776ca6"
|
||||
"version": "repo-file-v1:sha256:f3113440c05b4980693bc14f691e1a3c74a81e297641cd6b431054b2bacd1024"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -129,16 +121,16 @@
|
||||
"statement": "Native UI helpers separate reusable interaction from resource-specific operations: desktop managed cards receive selection/reordering capabilities, while mobile DesignSystem computes safe continuous or split content regions without becoming a session owner.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/DesignSystem/MobileContentRegions.swift#L3-L99",
|
||||
"version": "repo-lines-v1:sha256:098a90937f58a9a65e356b206a415202dff793579f410fd39dda027b5208d8f5:eyJzZWxlY3RlZExpbmVDb3VudCI6OTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFlYmYxODcwYWIyY2FlYjYyNWVhNzhjNzYyMzExYTA2MzJiZmRiMzNmZDBlNzIzOWMxYTRlMDcwMzM1NDUyNjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjljMzMxYTMyZmRmNWU0NjZmYjlmNjhiYzA2NjcxMDM3ZWRlYzk2M2YyYmYyMGNhZmM4ZTQ5ZGQ3OGExMjhiNGEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjoyLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM1OTY1ZmU4Zjg5ZDU0OWU2YTkxY2Y5YjIxMGRjNTcwOGEwZDg1OTE5MWI5OTQyNmY5YTBjMzBkYzVkNmU5ZmMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ3YmFhZDk5ZjI2OTBiODBlYmJhMGM1Zjc2Y2U4NjQ0OTI5NjhiNWRjOTYyYzlhYWM0ZmE5MTMwNmY1ZmVhM2UifQ"
|
||||
"resource": "repo://TFI/DesignSystem/MobileContentRegions.swift",
|
||||
"version": "repo-file-v1:sha256:504aacc35f8b572be5c0ff1f4ebc2ada8c33177a05342c0463d3623f45257326"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Platform/MobileTerminalSurface.swift",
|
||||
"version": "repo-file-v1:sha256:65daa3f685db120e61b593978ae57dec6feba8b15fb429f93922adb112ea3b08"
|
||||
"version": "repo-file-v1:sha256:5e5e6b2bccb3c873dc0211ea9588b54b388ba89bc83abe52886e514bf4e31e6f"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/UI/Managed/ManagedCardPage.swift#L6-L64",
|
||||
"version": "repo-lines-v1:sha256:50519dba5824748290013520351ca42cda77c594bb9fb98b9219a556ed057668:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYzZDliMTBiNTMwNTAyODEzYzUwZGEyZTAwM2M1YWMzYWYyN2RmOTQwNGRmYTQ3ZmU4YzUwMWUzMmNiNGEyZTEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ4ODFmYzEzN2IyMjE5YTdiNzZlNzdiY2U4NGMzNjIzMDA0OTNjYjM5MjBmZmYzMWNjMGNjZDQ0NDY2MjZlMWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg2NTNmMTNlYWZhYjdjODdjZTFhY2ZiMGQwNTMzN2M5ZmY0NjEyYmMxMDVmZTk1NjRmNWVjODBmZjg3NWI5ZWEifQ"
|
||||
"resource": "repo://TFM/UI/Managed/ManagedCardPage.swift",
|
||||
"version": "repo-file-v1:sha256:4dd8898a11a11ac393678c5ed5f49b5c33572705cb8031ae5cb7e33f2c37499c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -156,19 +148,19 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Settings/MobileSettingsView.swift",
|
||||
"version": "repo-file-v1:sha256:b513140ba94ba3c1ad07470e05ae601bd5f0f220bee89fe9e186ac98c6cc4a1f"
|
||||
"version": "repo-file-v1:sha256:dbe410f9ab27057bc37a5f7e5f0db0a87feb31f7b986cf44bf96decc2fb46d11"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:ae5726d2034f41e3797ec0cd94009bac394fe28681d3b939aa0ba8dda3d8dd28"
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/SFTP/SFTPChannelModel.swift",
|
||||
"version": "repo-file-v1:sha256:08abdf6882d3b0e829b82c6c2ea52a00021087dd58d013ff19ec412a1be8e549"
|
||||
"version": "repo-file-v1:sha256:e4820c6f0d57812a1b01234145f3291d1a919133125122a4f45eac4e3f87f45a"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Settings/SettingsPageView.swift",
|
||||
"version": "repo-file-v1:sha256:0c4e6f0881eead2da90bc782396a7c7c069a85a6ede7f2f4fdd23bc6233ecb1a"
|
||||
"version": "repo-file-v1:sha256:302951c6d2364dacb597c0374f419d44acd4952eb20ba1b313e31a4b9c059cf8"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Vault/VaultView.swift",
|
||||
@@ -190,7 +182,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Platform/MobileSFTPOpenWithPresenter.swift",
|
||||
"version": "repo-file-v1:sha256:a3dc3b210daa21ecc935650566c71756cc18aa99617985a616a785350f7ce990"
|
||||
"version": "repo-file-v1:sha256:98f529f35aadeaee38eb35e808ff43bfd81837ac2b80ea5eed932794cf2db222"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Platform/MacOSSpeechAudioInput.swift",
|
||||
@@ -216,11 +208,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Platform/MacDeviceName.swift",
|
||||
@@ -234,7 +226,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -244,7 +236,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/MCPServerController.swift",
|
||||
"version": "repo-file-v1:sha256:7374829e1807503b67c654c88edc8dba34bbd50a8499c6beec23170a73745c99"
|
||||
"version": "repo-file-v1:sha256:c5176c9083a21a9f97844730e93608df4897b24b4cadbc328e81dfb46f88641a"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -254,7 +246,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPUploadCoordinator.swift",
|
||||
"version": "repo-file-v1:sha256:d4b9205cc908ce2c38eb1e82ca1ea0a84a45794fa0613b0e794177ae9e48a48a"
|
||||
"version": "repo-file-v1:sha256:40e4a170562f9f04dc759dcff0727cb52dae8ad2a62af6d7b7ab66368bb26907"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/MCPUploadTests.swift",
|
||||
@@ -268,19 +260,19 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:5391ee5b542127ba539cac32e1f3d49c335e78f9c09aa06499c6c61fd00e42fa"
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:9daf1c0933fdbcff826165a8edc171876c54faa343a184348284e63f736e86bf"
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAppTests.swift",
|
||||
"version": "repo-file-v1:sha256:b2c528520ad5272155355404f91af52e490c6f17780a845d9e8a596c523484ef"
|
||||
"version": "repo-file-v1:sha256:4e595e215d00b798a3c7d026a88d5236ac57d2cfdec406883eb289dabd289f03"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -290,11 +282,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:5391ee5b542127ba539cac32e1f3d49c335e78f9c09aa06499c6c61fd00e42fa"
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileSettingsPortTests.swift",
|
||||
@@ -308,11 +300,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAppTests.swift",
|
||||
"version": "repo-file-v1:sha256:b2c528520ad5272155355404f91af52e490c6f17780a845d9e8a596c523484ef"
|
||||
"version": "repo-file-v1:sha256:4e595e215d00b798a3c7d026a88d5236ac57d2cfdec406883eb289dabd289f03"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -336,7 +328,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -345,16 +337,16 @@
|
||||
"statement": "MobileFeatureRegistry registers top-level destinations and MobileRootView mounts each in a NavigationStack backed by a scene-local MobileSceneModel; the Vault registration passes scene callbacks for opening/activating hosts, executing snippets, switching to Metrics and presenting a host editor.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileFeatureRegistry.swift#L33-L116",
|
||||
"version": "repo-lines-v1:sha256:95b16864445cf19cf8b5ffa9ac1006beb70a9a8fb97a1def2f928a0f0df56446:eyJzZWxlY3RlZExpbmVDb3VudCI6ODQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyYzBhYjFhNzUwMDZhMDA3NTE5YjhmZTgyNGQzOTVlNGVjM2JkNWJhMjY1MDNjZjA5ZTJkZGY5ZWMxYTI0MTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MDlhNTNhNjE4ZDAyOGUxZDMwMDBjMGE3YWJjZWVjYmU1ZmIzN2Y0ZTUxMWVmZTQ2NjQzZmFkNmU2Njg3MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImYyNjg3ZWVjNDdjMDhjYTllNWRhZmJiNGE3ZTEwNGMyZmJiMGU1MmYzNmMxY2ZkOGJjMzhlZjE4OTE5OWQzMWEifQ"
|
||||
"resource": "repo://TFI/App/MobileFeatureRegistry.swift",
|
||||
"version": "repo-file-v1:sha256:fd447af3f35bb38e151b34b2bd314e949d15f460f5ad89d7515e01ae1f88098c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift#L14-L39",
|
||||
"version": "repo-lines-v1:sha256:15879a1e881b04625ba69f98737d9205e03d7fbd868ce4c2799bcd7bb4faaaac:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAyODgwNTA4Y2FkZTAwMmU3ZWE3Y2MxZGNkMmEzZjgxNTJkMWViMDlkMTU4MmU1ZmFiNjc0YzY5NzkyZDk3NWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZkOTY4MDU1YmE3YjlkNGU0YzBkYmMzMDczNjYzZDM0M2U5MTg2ODliZWRlZjc3MTI0NDRmYTc4YzNjNGJiODMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjMxNjI0NDQ0NWQ0ZTY5YjU4NjI3NmU3OGQ0MDAyOWU1OWQ1NjRiNjQ0YjhlMTRmNDI0N2U2MWI1YmI5ZWZlMDciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjI2MjIzODhlOTUxYjRjY2JlM2I1ZWVmOGMxMTg0MDA0MjFkNzJhNjg5Y2EyZDFiZTUwNDFmNTExNDA1N2YyN2IifQ"
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift#L15-L43",
|
||||
"version": "repo-lines-v1:sha256:a9c891c91552cb57bb16304a1daea60106c1c74497e2801a6b9715779a2f31fb:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFhMDBhYzk5ZDQ4ZmUzMzU5Nzc0MzkyMmI2MzU0NDkxMGZiOWZkMDdlMTAxNjNkZTc0NTM4ODBjZjEwOTU0NjIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRhOTU5YTBkOTA2MmZjOGQxMWNiNmJhYTkxZDA4NjFjN2NiM2JlNTE3ODFhYjFlNDM2YzY4NzNjMzliZmU5YTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg1NGI5NTkyZTNiZmY1MGMzYTczMjA4Mjk4ZDQ3ZDdkNTQ0Yzk2NzNjNDczNDA1MjdlM2M2YzA5MjIxMDg0Y2YiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg2YzU5MWQyZDA2ODBjN2Y1NTkzZDVkZmRiMWJiZDdmYzJjNTA3NWMzZDMzNzQ5MTZkMDdhZDk1YzExMzRkYTEifQ"
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
"version": "repo-file-v1:sha256:3279e1780ccbe60d036b141a306261ed99fe10dbee0ec890671bb7573997b6ea"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -363,20 +355,16 @@
|
||||
"statement": "Mobile Vault renders grouped host cards and resource links; tapping a host selects or opens a preferred terminal workspace through the scene, explicit SSH/Telnet/SFTP menu actions open connections, and local edit/group/deletion presentation does not own the app's session or host-deletion lifecycle.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L501-L532",
|
||||
"version": "repo-lines-v1:sha256:272653e3fcc219bb95f099a32ccd67ffda852cbf012cc914bcaec085d7edefdb:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYyYmY0MThkMjk2MDkwOWQ0M2E2OWUyNzZmNWRmODc3ZDhmM2QzNzIwYTYzNDUxOGE5NGViOWVhNDA5MzMyN2MiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMyYzAxYmJjMDk4MWM5ZDIyZDczNTJlODYyMWU4NmE4NDg4OTU0NTM5N2MyZjI4NjRmYmZmYWM0OWU3N2U2NWYifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift#L83-L131",
|
||||
"version": "repo-lines-v1:sha256:44ed638316c70669b5ef692ac635ac86469aabb3dd4c6ec1a008643ec9218ca5:eyJzZWxlY3RlZExpbmVDb3VudCI6NDksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEwOTA1MzRlNGFlMDdmZThiMGM5MTk4MWE3MGY1ZDFjMmM4ZWE1YzMzZmY5OWEzZGQ2YTBjMWQwNWM3NzBmNjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjhjYzk0ZjdiZjEyMjBmOTFjNDQxODMzYjYxMGRjZGQ1MGM1N2ViNjc1YzNiYzY0YmY3Y2EyZThlYzkxNzBhYmEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ4MTBlMzEzNDk5YzU3NjYzMzUxMTFjODI1Yzg4MWEyYjhhNWJiMjBkN2ZiNTgwNDQ0MzAyNjk0OGI2MTU3YjgifQ"
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
"version": "repo-file-v1:sha256:3279e1780ccbe60d036b141a306261ed99fe10dbee0ec890671bb7573997b6ea"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L441-L513",
|
||||
"version": "repo-lines-v1:sha256:456cfc3a140a45f1536ca95bdf7f347179c129b50a48912515b2528bd411b911:eyJzZWxlY3RlZExpbmVDb3VudCI6NzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRlZjlmZDM3NWY1ODkxYTc2YTE5Mzc2YzI0NTZiNGYyMzM4MmVjODJkNWJiNTkzMDEyZTNmOWZkZDNhY2YzYTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJjZmUyOTY2MGQwMWI1MTk0ODgzMDkwNWE3ZDQ1ZGQ0NDUzMGNmMWMyNGE0ZTk2NWI0OGMwMDY1OGQzODBmYTciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJiODlkNTljMjE3MGEwZWFmOWY0NDc2YmVjMjRjOThlYjdlYTRiMWNlYTY4ZDQ5MmQ2OGNkNzAzOGZkNDE0YmQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L767-L834",
|
||||
"version": "repo-lines-v1:sha256:a07e0e245c8f4f406d84b4fef5566cdc859fd6f1122354eb1b71ee859d8c361c:eyJzZWxlY3RlZExpbmVDb3VudCI6NjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAyMTExNDcyZWQ0MmE0NDkxZjc5OTQ0MzNjMTM5ZTBlY2M3ZTczZmZhZjI4ZTZlYzIzZDI3OGIyMmRjZmYyMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjkzOTgxNDU1ZTQyYTZiNzRiOWU5N2ZiYTY0MjM2NTQxM2Q4YTNlOTJkY2JlNjU5NjY1ZDUyODA0OGExZmU0MjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYzYzUyYWM5YmUwN2MwNzljNTRhZDgwOGMzNDEzNDMwMjFmYmM4M2NiZDVmZDk2ZGNlZTk4MGY4YTI2ZTU4YzMifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -385,24 +373,16 @@
|
||||
"statement": "Mobile Vault search forwards matching resource queries to dedicated pushed screens and switches the top-level destination for Metrics results; History presentation lives in the Vault file but filters host/device-backed app connection events through Application/Workspaces policy, caps results at 50 and only opens enabled protocols, with delete/clear operations delegated to app.connectionHistory.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Application/Workspaces/MobileConnectionHistory.swift#L26-L124",
|
||||
"version": "repo-lines-v1:sha256:0a30a7cb5bd5c6e983aff721f11dfe9a9e88b0b0bfe5529ad89ba0a0c479f37f:eyJzZWxlY3RlZExpbmVDb3VudCI6OTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFiYjcyYjBmNTVlMWRhMWMzOWE4MGY1NjI1YWQ3YmY3ZjMzNDBkZTk0NzVlYzYxYTIzMThkZDRjOGJkNzBmNjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYxMzVmNzBlZTdjOGYyNDQ4ZTgwYjQ3MjQ5ZDI0NGJlZGU4ZmIzNmIxYTVlNjZlZWE0YTQ4NzFkYmI4MWMxZjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
||||
"resource": "repo://TFI/Application/Workspaces/MobileConnectionHistory.swift",
|
||||
"version": "repo-file-v1:sha256:ea1bf279a07d2dc0fd61e841777fc8e490a6d09fb2a7f36256ecc26a1c8ca541"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L398-L438",
|
||||
"version": "repo-lines-v1:sha256:6426680101ae11723a8187b37964aaf570488070e8a8d58c4a53f0cd80b90998:eyJzZWxlY3RlZExpbmVDb3VudCI6NDEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM0OTFkYTIwY2NkNDBlY2I1NzJlNjg0NDUyNDk1N2NlMGVkMjk4ZDE4OTYyZmE5MWRkMDNjMmQxZjc3YTQ5OTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMzMDJiOGY2NTU3MTc0YzMzZDgwMmE5N2IwZTk3M2U0MzU4NjI3ZTA1MGI5MDNlN2M2MWE5OGQ1MWM4MDNiOGEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjliYjI1MGMxMWI4ZWVlZDllMDA0ODIxOGFlMDBmMmEzM2E3ODAyZmEzMDY2ZTA0MWMzY2RiNzI0MGYzMzVjMjUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhiOWRiYzFmMDQ5YTIwNDhlYWE2NmU3OTVjNDkzODkzYjg2ZDNjZDI5NTEzM2E5ODQwMzRmNjM5MzI2ODMwNjUifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L46-L127",
|
||||
"version": "repo-lines-v1:sha256:515f44848c6cf09add98e47c05ba8dd7a1bffdcf0238619cd7754c00258112fe:eyJzZWxlY3RlZExpbmVDb3VudCI6ODIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNmODhhMjRjZmVkZmU1ZTIzYTM1MDVjYTU4MDZhNDdlNDJjOTViMmZjNDQzMTRhMjA1NTcwMjkzNDE5YjQ4YWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU2ODYxZmNhNzI0NTBkYWZmMGJlNjNjNTM1MWU2ZjllMDUyNDg1Yzg2MTI4NGI3MWI1NTk5NzhkMjVlMDJkYTgifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L568-L661",
|
||||
"version": "repo-lines-v1:sha256:a8dde1065aaa091734bb471cbb4e28413f294c2fa7e9d846b08d81943a72a5ce:eyJzZWxlY3RlZExpbmVDb3VudCI6OTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYwMjA0MzJkYzQ3NGFmN2VmY2NlYmMwZTQ1ZDAzYzIxYmM3OTY0ZWMzZWY5NDE2Zjg5NmRlMDVlNmM0ODAzMzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBlODY2ODIwYzYxZTkzNTc2ODNmMTE1NzA0OWQxMDRkMjlkMjE2ODg5NWNiM2RhMDg2NGZhZDVlNTYwNTc3NGYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileConnectionPickerTests.swift#L148-L173",
|
||||
"version": "repo-lines-v1:sha256:c41e543bd8025d0fe331b673e3d89151282497571cfe21fbb403e4db7fe28cf1:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBkOWVjNjFiMTUzMGUxMmU5MWQzNjU4YmY5YzhmYmExZWU5MDk5YjZhY2ZjNmE5NTdhZTkyOThlNGYwOWMzOWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ0YjQ2NzVjMjMxNmI4M2Q0MTI1ODRiZmE0ZGNiZWM2OGQ5OWM4ODM1N2QwOWMzNGY4OTdkZGU4OWM5MjA2MmMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE0OGI4M2Y2NDVjYjJmZTI5N2YzMzkwYzliODMzZjdmZWVjMDk0ZWMyNGNkYjA4ZGQ1ZjI3Y2JlNzNjZDM2YjQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI5YjliYmYwYzQ2ZWVjYTY5NjFkM2E0NmEyNTJjYTRjZWU5M2UzMWQzNTNmOWYyZjIwMWJjYmZkOGRkYTk0YWUifQ"
|
||||
"resource": "repo://TFITests/MobileConnectionPickerTests.swift",
|
||||
"version": "repo-file-v1:sha256:5fa61b5614ce53928bd77c0e7b5254a41d8acc68a7bfbde0e5a9cb2b8f4f3791"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -411,20 +391,12 @@
|
||||
"statement": "MobileHostEditor holds host and custom-identity drafts in a sheet, gates save on protocol/port/authentication/environment validation and saves identity changes through the host library; the separate Known Hosts screen edits validated trust entries via app.knownHosts and reports storage failures.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift#L208-L269",
|
||||
"version": "repo-lines-v1:sha256:f9642a68da4f4e7a085ca7ff63ad77a0ad5992c82d14a3ba0055300c7a7bc272:eyJzZWxlY3RlZExpbmVDb3VudCI6NjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg4M2IwNmQ1MmQ3ZWY4NGJlZDBjMzVlNzVjNWQyODg4N2Y0MzZmOGE5ZjM1MjBmZTRhMzFhZWY1ZWZlZmM2MGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY5NjQ4YzE1MjRiOWVmNDk4ZDBhNzgzNTI1OGYzNGIxOTZhOTdlODg0YTUxOGM0MzY3YTE2MzQ5ZjcxMjVlMWEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjZjOWNiMzdiYjEwMzg5MDAyMmY2ZmYyYTg4YTdiMWJhODlkYjg1NWU2OGRhODAwNDE4ZWRkNmE0OWY3YzE1YjgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk5OWY0ZWJlMWUyOWMzZTllZWQ2MGVhMTUwMzUxMzQwMTUzYzllMWI5YWY5NTBiMTdhZWU3NGQwOWQ0NzVlYjkifQ"
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift",
|
||||
"version": "repo-file-v1:sha256:0ca046969bd969fa4d4f4d245220726eb709fe97d4df67d7969b19807a8aae32"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift#L27-L69",
|
||||
"version": "repo-lines-v1:sha256:02754b0a1bbd6555d1c8c5586c972850b8ea563b4ccd6bb577ea81b06d927ff2:eyJzZWxlY3RlZExpbmVDb3VudCI6NDMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZlMzA0ODhhNDJjZmI4Y2M1YTgzMjM2YjRjNmM0YmE4NTg3YTY1ZDlmNWZhNDUyZGE4ZjY2MzhkMjhjNDZlYmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU3ZWExNTk4ZmY2N2M3ZGM0NmE5Y2IwMmE2MjhlMWQ0MzZlMjdlMmU4YmNhZTFkMDllOTAwNGU4NzcwNTMxNGMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAxZGQ3YmJmYzM4MTU4YTI1YWNiMmUzMWU5NWZjYjdkYjFlMDRiYTA4ODg3ZDBhZWM2ODVkMzNhNDQ2Y2E0OWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkwMmUwMTg2MjNlMTg3ODVlNjQ5ODlhZTEzYzIzMjgyMDE0OGE3Mjk0YTZkZWNhMjQ5MjExNjFjMWFiNDY4ZGEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift#L6-L86",
|
||||
"version": "repo-lines-v1:sha256:c95a7ee49b5428df46595142db320a1c9b94635eb0003029a58ed9d7e75aba82:eyJzZWxlY3RlZExpbmVDb3VudCI6ODEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3NzM1ZGU2NzdlNWVmZTVkYTI5NWUyMGYzNzk0Y2M2MDM0YTI4YjJlZGJiODc1ZDZiMGRiZmQwZTMxNTNhZGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNmYTE5ZjJhYWYyNmU2MjE5ZGY4MmM0M2QxOGI1MmU5OWI3MzhlNTIyNDJiMjE4Y2VhZmEzMjg1NThkNGNjZGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFkZTY3ZmY5NzJiMWUxZDk5Njc0OGE1ZTczYjM2NmY5MzU4NzZiMDE4MGU5NmFlYzI4YWJjM2UyZGVmZGQ1OWMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift#L89-L153",
|
||||
"version": "repo-lines-v1:sha256:ac254b0b4597be75de10b8c7596fe613d94b2e76dfa17bfe5e41947933915602:eyJzZWxlY3RlZExpbmVDb3VudCI6NjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3OTJkZjUxMDBhY2FmNGJjZWI1YWMxNDljZDI5ODEwYzFhNTc5YmU1OWIxNjIzMWVhMjA0NDgwY2M2Mjg5OTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift",
|
||||
"version": "repo-file-v1:sha256:fa8263ae0b73e44ebc464500c12d7b4d05158c8a9ccf45f2d8fd85c82c4b0fa4"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -433,34 +405,30 @@
|
||||
"statement": "Desktop RootView mounts one WindowSidebarView alongside persistent detail per WindowModel; the sidebar selects Navigator, compact Assistant, Snippets or focus-sensitive History, whose source depends on the focused SSH/SFTP pane and is disabled for serial/Telnet panes with a Snippets fallback; activating Assistant or Navigator can also change top-level destination.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/RootView.swift#L6-L49",
|
||||
"version": "repo-lines-v1:sha256:86a5698ef6059244332c78ef1e569c473d56b5ba3d767b7c9b61b0c838083495:eyJzZWxlY3RlZExpbmVDb3VudCI6NDQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI4NjljNDYwYmI1YjgzNGM4Zjc4YzhjMjEzMjAyNThiZWZjMGVmZGEzMTZmZTE2MzY0ODY1NzNhZDkyMGJmNTkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhhMDZmOGRiMGExNTBhMGZkOWRiZjE5ODI2ZjliODBlNTY0MDA5MGIzYWNlZGU5OTQyZWJhMjViZWE3OWVjMTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU3MWRhNzQzNDU3YzAzYTI0MDQ0YTE5NzU0NjBhNmM0ODk5ZTgwYjc1MjhlMzA0ZDMxNGQ2N2ZlNTVhNDE2MDYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijc0YTk1MzE4NmM4MTFmNGJhMjcxODk0MDUxMGNkYmI0NGUwNjIzNmMzZTViNTcwZjI4MzhkYzk0YzYyMTRhMTYifQ"
|
||||
"resource": "repo://TFM/App/RootView.swift",
|
||||
"version": "repo-file-v1:sha256:b541d1995a8473c132e0e7aea10c0b56bc96d12cf1d003ffaa0f6bdf1f605eb9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L168-L196",
|
||||
"version": "repo-lines-v1:sha256:fab8ec5c2615e2059937c1874b34f91fa78e407a9c91834fd5a9e2bae6bef536:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYxMDk3ZDRjZTdkZDAyOWU5OGI2YWFkMjViMDFiYzEzNzhjOTdlMzA5YmRjMDY0YTM0ZTI2NTQ4MTFmMTgxYWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZThjZDVkNTA2ZmYwYjY4ODQ3MTFjMmMxNTI1YjdiY2UwMmY0NDMxMDU2YTk3Y2E0ZDQ1NWY3N2Y5MTg4MmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQwMmQ5OGU3M2M3ZmQxZDQ4ZjUzNjdjZmY5NGFlNGYzNDlhZTYzZmIyMWRiYzkwZmYxYjZhNDViYjNmOWQ5MzEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImNjZmM1ZDE4YjJmZGJhYzRlZDQ1NGFjODhhZjc1YzI4NGNjYTNjZDlmMzZjMmQwZDhmNzUyNGVmNjc2ZTA0NWQifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L20-L109",
|
||||
"version": "repo-lines-v1:sha256:453efb359ee33d9200b73cdd0c8e381ef22355605ada3c2999e958efa5d020ae:eyJzZWxlY3RlZExpbmVDb3VudCI6OTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNkNjE5MmFmNWU2MTFjZTc2MGJiMTdiYjIxY2RmMzVlNGRjMzE5YWM0ODIxMjc3NmE3MTY1YTdhNGVkYmE3NDciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA0ODM5Y2YzNTY3NmU3MWJkMjNjZjQ1MWRjMjU0ZTI1MmZlZWQ0YjI4MWVlZGYyY2M5NGIwOTg5OWUwZDQzOGYifQ"
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift",
|
||||
"version": "repo-file-v1:sha256:e2f23f2dff6d1fba8ec85ae36c7e68960694da2a669507bdeb6e4f57ff3e5463"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift#L768-L779",
|
||||
"version": "repo-lines-v1:sha256:5d4ca3aa9b8065880638441e6fde5ad930ed84cd12cd2c2846958e5f3e54aabb:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNjNzI4NzFlZDg1YWRiY2U3NDE3ZWU4NzNmNDNkMDNhN2Y2MmE0N2ZlYjQ1YTgwODhkZDUzMGY0NTUxYTU0YjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdkZGIxYmZhZGQ3YzM1MmU3NTYyYTQ2Y2Q0YjRlYTQzZGVhMjM0NWI4M2ZjM2YyZmM5MTU0OTY2MTNiM2JjYmIifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L198-L260",
|
||||
"version": "repo-lines-v1:sha256:c369d3ccb9cff0a5a11f9565fd9a2687419334e5e2e6d40108edb3142bac2c57:eyJzZWxlY3RlZExpbmVDb3VudCI6NjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM4MGVlMGVlNzM2N2FmM2ZmOWFiODcxYWUwMTI2YjQ2MDY1MThiNGYzNjM5N2Q5Njc1ZjE5ZjQ1NTExMDJmYWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM5ZWRmZjJhNDQxOGNlM2EzZGE4MmM0ZTVmMWFkYjNiNmI3ODExYTU3ZGUwOWEzZDJiOWRlM2I2NmIyYzdhNTgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE4NTUxZjM3NmYwYzQzZTZmYjczNDI2YTFhOTA1NzhiOTM0ZjBhNjY2NjM3NTA4N2RkZmY4NTVlZGJiYWM5ZTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNlN2FjNWYwMTAzZjFkMDlmOGNhMTAxODgyMDU5NzM4ODY4NzdjMmM1NTRkOWI3MzU0MmFlZWFmYjAyNDc4NjYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/WindowSidebarTests.swift#L46-L124",
|
||||
"version": "repo-lines-v1:sha256:4a7890314d8b06976cb8c0138504e183510892cf9e9556c2d8dee49174149176:eyJzZWxlY3RlZExpbmVDb3VudCI6NzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg4YmZlZDBhOWM3NzUyOTQ4ZWY4ZjRlYmRhZTcxMDM3YjYxZTQ1ZDk0MDFiNGFlOWU3YmZkYzI3ZmI5OGQyZTEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYxNzBjNDZlM2Q5OTBjMDNiYmM1ZjBmY2JlZjA2Zjc4ZmVmMTA5MjRkNjZhMjAyY2Y4N2EwZjIyZmU3MDcyNzUifQ"
|
||||
"resource": "repo://TFMTests/WindowSidebarTests.swift",
|
||||
"version": "repo-file-v1:sha256:3fce60dc27ea37748137125c239ad6e18ff3b63d7ef73ce6baef93bda80148fc"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:b2e31af1e23b8eb56a0e9eaabf4e5a5b0a0ad90c94c725aa451f629dbe390f3f",
|
||||
"pageVersion": "sha256:100eead559d1039723780eb0c8f8415c71f74a88dbe7627c0fc93b11de49343c",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_bd9f5ddda6b6466eb79c622b02fd73f2",
|
||||
"statement": "Termind builds distinct macOS (`TFM`) and iOS/iPadOS (`TFI`) application targets, while shared framework modules do not import the application targets; the application targets own native UI and lifetime behavior.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift#L5-L17",
|
||||
"version": "repo-lines-v1:sha256:a2a3bd4ff94c140758b6b89a59d0745d4318eccea3e565614aeb71ae86e31ba5:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZmJkYmI1MDE2YWM3ZGVlYTU2ZTg5MGFlOTNhZDc3MzY1Y2I0ZDhhMGQ4NjhiMmU2YzliZTNjYzExYzQ2NGQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE0MDI1ZTA5ZDBlYTM3ZDMyNTYyMDVjODkwYTg5YjU0NmE0MDcwNTg4MDJmZWUyZDY1N2Q2ZjJmODg5MzllMTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBkMjE5MGFjNWM3N2IzZTA5NDYzN2Q0YzdjYzhhNTY4M2M2MjE3YWY4MGYyMzU1YjY5NzlkNDNiZGI5ODkwM2EifQ"
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L13-L20",
|
||||
"version": "repo-lines-v1:sha256:891f05013590adcc8910c2e5088931000fa575e966a2550c82fb466ad06f1d36:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNWNmYmRiYjUwMTZhYzdkZWVhNTZlODkwYWU5M2FkNzczNjVjYjRkOGEwZDg2OGIyZTZjOWJlM2NjMTFjNDY0ZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNWEyZGI2NmY0YTUzMjU3NWRjNTBmYmM5MWNmNGJjYThiMTVkN2U4ZDJiZTlmNWNjMThlMDY2MjY1OWMwYTVmOCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYjAzMTkyYWFlOGU2ZGIzZjk3M2MyMjYyODQyNDdjOWI2ODgxYWMxNTEyOGUzOGQ3N2JjNmMyNDQ3Mjg4NWZlZCJ9"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:ca356c025f911101bbaf63a9a34b72736291043ed0fc0daa8dbedec972eac6b1"
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Termind.xcodeproj/project.pbxproj",
|
||||
@@ -30,7 +30,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -40,15 +40,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:0029784efe4588e87c3dc18317fdfaad46bed6b3a32bcf72dd0dd9b1c9da256e"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/RootView.swift",
|
||||
"version": "repo-file-v1:sha256:25eb65f73680cfeddb1916e7c2f416828cc67abe6f80d7463fa9d84a4fcfa0c4"
|
||||
"version": "repo-file-v1:sha256:b541d1995a8473c132e0e7aea10c0b56bc96d12cf1d003ffaa0f6bdf1f605eb9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:6156e0821962b295b33e546540b8894537b1e053c788ff50b30e276d5ab3b092"
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -57,8 +57,8 @@
|
||||
"statement": "The macOS main `WindowGroup` creates a fresh `WindowModel` per scene but injects the same `AppModel` and SwiftData container; it also declares a separate externally-driven authentication window.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L146-L190",
|
||||
"version": "repo-lines-v1:sha256:eb20fcc10fa3cc0f5740fa0fbbf0746859c1e4b7b431188ee4e3672fc48bae73:eyJzZWxlY3RlZExpbmVDb3VudCI6NDUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYxMDk3ZDRjZTdkZDAyOWU5OGI2YWFkMjViMDFiYzEzNzhjOTdlMzA5YmRjMDY0YTM0ZTI2NTQ4MTFmMTgxYWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQwMmQ5OGU3M2M3ZmQxZDQ4ZjUzNjdjZmY5NGFlNGYzNDlhZTYzZmIyMWRiYzkwZmYxYjZhNDViYjNmOWQ5MzEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdjZGEyMmE4ZWYyODNjOGFmOTJjZDlmMmY2ZTA4MzdkODg4MjdjYjBkZGM2OWNlNDFkMTAwZDFiOTdjYWM5MmMifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -81,12 +81,12 @@
|
||||
"statement": "macOS termination asks the user before quitting with pending external edits, then performs idempotent app-wide cleanup that closes windows and cancels/stops runtime services; the AppKit delegate replies when cleanup finishes or after a three-second fallback.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L669-L693",
|
||||
"version": "repo-lines-v1:sha256:4088a1395f839fa08e6e42d1dc28faa30416dc463f43b9354b941ebf4e582043:eyJzZWxlY3RlZExpbmVDb3VudCI6NTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRiNmE1OWU3Nzg2NmU1MGRiZDYxZjA5ZmQ1YWM2MjQwN2Q0ZGVlNjdkNGIyNTJhNDExYzRhZTEwZWNmMWQwNmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjUzODNlN2M2MmI5ZmI0ZGU3YjNjNTc3ZmFkNjNiOTYxMGRlZTcyNmI4NzljYzZjN2M5ZjYzNTljOTU5YWEwODQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYzNmM5MGE0M2ZiOWQ0NDg2NzI0NmE0MzY5ODk4YWZkOTFiOWUyYjM0OTZmMjU3OTg1YTk0MDFhZjY4ZDI1YWYifQ"
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L331-L380",
|
||||
"version": "repo-lines-v1:sha256:af7cb9bc2d40d80d6078769faf6bbf1fe1a5b20164b5d9d6f3c4f6ff36236ea9:eyJzZWxlY3RlZExpbmVDb3VudCI6MzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImIyMmJlMTBlOWQxYjNjMGE2OTYxNzZmMGYyMDQ3MGVhODMzN2FmYzI4MWZmMTIzYmNmMmRmMjkzMTNkMDIwMTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg2MmZlMmQ0YmFjM2JhZjAxN2NiYmY5MmFiMTcwZTQ0NWExMWQxNzYyODBkZDEyOTdjZmM2ZDQxZjI2Y2NlMGYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4NWYxZjhkMWY1ODkwZmNjMTE1ZWMwNWRlNGU3NzA1ODdiOWRjNDlkZDhlM2IxNTViYmUwYzI4NWI2ZWQyYmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdlMjAyMDc0MmMzM2IxYjkxZWIyMjYxNmJmYTg4NWMxNjQ2NThlM2Y5YzAzZDNkODZhYzllMjgwMGRkYmNhMzcifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -95,8 +95,8 @@
|
||||
"statement": "`TermindIOSApp` creates one `MobileAppModel` startup result, selects testing or live dependencies from the XCTest environment, injects the shared model container into its `WindowGroup`, and presents an unavailable-data view when initialization fails.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift#L5-L33",
|
||||
"version": "repo-lines-v1:sha256:1574c44f26f386fca5834af375adbea23b9471aaca384b9aa647006e94caec2e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZmJkYmI1MDE2YWM3ZGVlYTU2ZTg5MGFlOTNhZDc3MzY1Y2I0ZDhhMGQ4NjhiMmU2YzliZTNjYzExYzQ2NGQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE0MDI1ZTA5ZDBlYTM3ZDMyNTYyMDVjODkwYTg5YjU0NmE0MDcwNTg4MDJmZWUyZDY1N2Q2ZjJmODg5MzllMTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQwOWRlZDA1YTMwZTBiMDk1ZjI3NWRkNTcwMzRmNzU2NTgzNjBjOWQ4ZWIyNTg3NjNjNGI0MDMwYmM5ZGRjYjEifQ"
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -116,7 +116,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -125,16 +125,12 @@
|
||||
"statement": "Each `MobileRootView` creates a scene-local `MobileSceneModel` for navigation and presentation, reports its phase to the shared app model, and publishes it as a focused scene value; its sidebar-adaptable tabs retain per-feature navigation stacks.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift#L4-L39",
|
||||
"version": "repo-lines-v1:sha256:107885cd61c384831f96818970b307dab47a74153f16743478683c50734e4691:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBmZmQ2NjgyMzJiMzJmMGE2ZTZiMmE3ODI2MzE1ZmY0ODEyZmQxNTVkNzI1ZjM0ZjA0ZGNiOWY4MGU5ZDA1MWYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZkOTY4MDU1YmE3YjlkNGU0YzBkYmMzMDczNjYzZDM0M2U5MTg2ODliZWRlZjc3MTI0NDRmYTc4YzNjNGJiODMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE3ZmYyYjcxMGUxMzQ2NWEzZmU1MjE2MzA1YjkzODIxZDZkMzNmNTJmZTI5NTBjMzdhYzgwYjJlOGQyZDAwYzAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjI2MjIzODhlOTUxYjRjY2JlM2I1ZWVmOGMxMTg0MDA0MjFkNzJhNjg5Y2EyZDFiZTUwNDFmNTExNDA1N2YyN2IifQ"
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift#L49-L72",
|
||||
"version": "repo-lines-v1:sha256:1f9048541f568bea75db7cff31aa0ed19d9f4c25d5cfa707c4a57b1e8848f550:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwNmIyOTNhY2FiZjI2YWJjZmZmNDhiYzNlZmVkZTIzZmEyMDFiYjA3MDMzMDMxYzcwOWVkZDc2NmQ1YjQ2NWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcxZTQxZGU0OGM0NWIxYTkxYmVmZjAzYmNlNmQxMjhkYWIwMDE5MGE3NjI1YWMxODE4NzAzYTA0MmQ2NzViODUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM2MTlhZGM1NjcxMTNjZmI2YWE4YTM2ZmI4N2U5ZWI3N2FhZGFlNjU4MDc3ZDRlODQ0NGNkNGM0NWM1YTFiNWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE0M2M5YmQyMmFhOGFjOGQ2ZGU3MTU1YmVjMTljYTgyNzgxOTliMzBkMGQwYWU4MDdlOTY0MzY4OGZmZTdkZGUifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift#L9-L39",
|
||||
"version": "repo-lines-v1:sha256:5a6c84ab4f38f1e77c57ba0bd6d145b262bcef8da67b9a17034e19c2fc8c3990:eyJzZWxlY3RlZExpbmVDb3VudCI6MzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdlMzBiMWNmYzNlMDdhNWQzNDFjZTY5NjdjZDYzMTI4MWQzYzQwYmYzMWQzNTI1MTM2M2MyNzYxN2NiZmIwMzYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNkYTMxMmZlMTU1NzA0MzkzMzRiYzkwMGRiNDQyOTUzNjJmMzg5ZjVjNmVkOGU0MTViODIyYzBmN2YwNDJjNDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjliNjdkY2Q0ZWY5ZGYwOGQ4MTFkZDQ2ZmJiZmVhZDk5OGVmNzYzOTM0M2NkNTdjMmZhZWFhOTIyYTI2YjIwNTMifQ"
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
"version": "repo-file-v1:sha256:3279e1780ccbe60d036b141a306261ed99fe10dbee0ec890671bb7573997b6ea"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -144,7 +140,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileSceneModel.swift",
|
||||
@@ -152,7 +148,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAppTests.swift",
|
||||
"version": "repo-file-v1:sha256:b2c528520ad5272155355404f91af52e490c6f17780a845d9e8a596c523484ef"
|
||||
"version": "repo-file-v1:sha256:4e595e215d00b798a3c7d026a88d5236ac57d2cfdec406883eb289dabd289f03"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -161,16 +157,12 @@
|
||||
"statement": "Mobile cold launch restores only saved workspace descriptors, not live sessions: it loads valid descriptors, starts with no workspaces, clears live activities, and opens/connects a descriptor only on demand; descriptors contain only workspace ID, Host ID, title, and connection kind, excluding runtime command/path state.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L659-L687",
|
||||
"version": "repo-lines-v1:sha256:79cc24d90367f9ef59be0ea4dd25af4951788cf734444c57cefc55aa8a746b6d:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA4YjM0MjE2MjYzZjM3NTkzNDUyZGMyNDNlYTQyNTQ3MDJkZTEzYjI0OTliYTQ4ODYxODk2NTI4NGNmNDQzNmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ1NWE2YmQ5MDhjMTBjOGM0MzYyZDBkNDAyZDI0Y2JkMDY2MDgyYjNjMjQ0N2YwZTA0MjZhYjEzY2M4NDc2M2MiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE5MDlmNTg5MzgzODA2NjM1OTVhOTFhNDhlYjQzNWFhNjI1OGNiZWVlZDc1MjAzMDUxODZiYjBiMGI4MTZjMDIifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L737-L755",
|
||||
"version": "repo-lines-v1:sha256:3449b8dcc3ba4d272c3cfbdc74c82d98c9356a9d9d2ae8a6400f2e62ca150874:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxODI4YWZmNmM2MDJhZDBjNDkzM2FhYjA1ZmQzZTgzOTVmYmI4ZjY3NTI1OGU4NzBiMmE4MGY5MjhjYzhmZWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE5YmZhMTRhYWRlOGE1OGNjNTMwMzA1N2IzMmEyNDk1NjdmNzI3NDFhMTJjZDJjNjRjYzAwMzZjNzlkZGRmOTUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVhNzhhMmQzMGFkYTcwNjU3OTM0MDdhOGM1ODY5NmMxMmM3NjAyZTc0OTVlM2IwZmE5MDRmMDE3NmI0YzY5NmEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImYzMmY5MDQ0OGE2NzUwMTI4YzczM2Y4NjgwNGQ0ZTg1N2FlOWMxZGIwYTJhNzFmZWRiM2QzMmRkZTM1MGEzMzYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Application/Workspaces/MobileWorkspaceDescriptor.swift#L4-L11",
|
||||
"version": "repo-lines-v1:sha256:77f7c0d7a427983ddaf016443366b4285cf1c2f05a98140967648265613b928f:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZGZhYWVjMjQ3MjRjODcwZWYzMDdmZjA5NzBlYzdiMTc5YzZmY2U1MjQzMWQ2ZDY2MzU2YjZmMDVlODVhOTI5ZiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYTU4ZDRhOTEwNzQwNTlmMGM4ZDIxMzZmOWJmODA4MzQ2MTQ4ZmM4Y2ZiMzU0M2RkY2JjNzUwZTc1NzZlNzI2MyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiN2NmOTkwN2FlMjY4ZTFmOWEwNGU2MDRmMDlmMTA5MjhkMWNlZjgzNTk5MGUyOTllYTk2YWYwMmRkZjRiYWQ4NCJ9"
|
||||
"resource": "repo://TFI/Application/Workspaces/MobileWorkspaceDescriptor.swift",
|
||||
"version": "repo-file-v1:sha256:55722d5acd7f8768aa35065a0b00d0ffae7d279e63ce382fd229a8fa77241d00"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -201,12 +193,12 @@
|
||||
"statement": "Desktop external SSH/SFTP/Telnet URL handling opens temporary unsaved workspace/session state in the target window; Telnet URLs that carry an advisory password require explicit confirmation before opening.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L761-L821",
|
||||
"version": "repo-lines-v1:sha256:1c6df32dff348711da79f105fd6d28d5f4861c458b11f6bdb83e76ce91138697:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdjMjYyYWM1NzdlODU1NGNjMTM1M2E4NjUxMjk1ZGEwYTgzM2EwZWYwNDVmNTVmNDU1NDIzYWQwNWU0MDBkNzgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIxZTZhN2E4MjNmMzRhZWJjY2E1M2M0MWFlNjBmNmJkMGFlMzBmNDYwOTFjZTUyNDU0Mjg1YzlhNmI0OTRhZGQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdmNTE0NzI0NWM5NzEzNTg0Y2Q3Y2VlNWM0NGNlODk5MjIxNzZjZTY3NGRhNTYxOGQ3YTU1NmU2ZTA1MTBjZDYifQ"
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ExternalConnectionURLTests.swift#L9-L45",
|
||||
"version": "repo-lines-v1:sha256:1f318118564e3c8a1ceac6136bf9c344ae39976ff5793b9dd39658561f5381d0:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ3ZThkZDgzNmY2YmU5M2Q1ZTk4YjZmNGM4ZjZkNTFjMGNmMjBhOTlhZjMyYzQwNTUyYzE3MDRjODQ2M2ZkZjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjIyM2QxNzZhYTU5ZjhjMDRhOWVkZjg2YTRiZDA1MDk4Y2FlMWUyODFmMTkzMzBjMWI3NTc4OGFkMDE2YWNmYTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://TFMTests/ExternalConnectionURLTests.swift",
|
||||
"version": "repo-file-v1:sha256:578d5419ad888d840f26749e330b36ecd79be673e5d6388ed6019a16b5526078"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -216,15 +208,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/Pane.swift",
|
||||
"version": "repo-file-v1:sha256:35b8edb059701d5548d750f48c2591c3d5b820e35e1c4dd6e53ae316debce779"
|
||||
"version": "repo-file-v1:sha256:622be88eed12fd9a677cc1d5a39549c96398445ebfff8059936a4cc29d0e2a11"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:6156e0821962b295b33e546540b8894537b1e053c788ff50b30e276d5ab3b092"
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -233,24 +225,16 @@
|
||||
"statement": "Both app composition roots create an app-wide DeviceDirectoryModel with the Vault installation ID. macOS names it from trimmed kern.hostname with a DeviceKit fallback; iOS uses Device.current.safeDescription directly. Foreground activation refreshes the directory record without rewriting connection events.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L201-L210",
|
||||
"version": "repo-lines-v1:sha256:4f516b911b69847058eaab07c798fe64dfeafa277166dba252d21c44e382448b:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijk1MDE4Y2FmY2ViNTI1ZTZhZjQzN2JjZTEwMzI3OTQ2YWM0MzFhMDI3YjI3MjQ2NDE4NjBmZTc1MTBhZTMyMDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJlODRkMTQ0ZGU1YjZlY2NlODY0MWZmMDQxODBmOWEwZWQ3MjkwYTRiOTU3ZWZhNDVlM2U1YzkzNGI5ZWU3YWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVmNmY0MTY5ODIxNTkwZjRmMGJjZDljNTYzYTc3NzVhNjM1N2JlZDc5ZjM0NWVmNWVmOWUxNTY2MDdlYmNkM2MiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE1MDNhZTlmZWY1YTRiZjM5ZDIzZmQ0MDRmYWFiYTkyMDY2MmY0ZmEzODUzMjkxOGVlMGI2MmE0OWNhY2EwZjIifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L560-L578",
|
||||
"version": "repo-lines-v1:sha256:b0fa484bcb19ae7f887f203d3b438c9bccc7b5936706cd85d285e53c0f9b31d2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjExYjYwOWM3ODJiMmM2NDVhM2M2ZDFmOWMyMDA3YzdjMGVlMWI5MTI1YjJjOGIxOTU0YTFlMTVjY2UxM2VkYjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjExMGVhYzUyYWE2NjM0MDczNjQ0MjU1MTg2YTc5NGIxMjdmYzQ5MTA2NTRmYTNhMjBiOTgzMjMxOTIxZWU2ZWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI0NTg0ZDFiMmZhZDA3YjA0ZTIwZTVjOGE2MTM3OGEzNDFjZGJlN2E4ZDgwMzAwZDQ2NzJlNjhhYjcxZTFjZjMifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L317-L320",
|
||||
"version": "repo-lines-v1:sha256:1ee408a9a5507918379d16437b19820e165a6ac4f23f4bb06987770b0e8aa179:eyJzZWxlY3RlZExpbmVDb3VudCI6NCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNDU5MDRhNmM4Yzk5NmRhZmEwYmM3Mzc4YTJhNDQ4YjM2MTNhODQzNDgzNGYxYjdmMGU5MTMxMzc5MGU0ZmJmOCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZTZiMDQ0OTE0Njk3MjJlODM2M2E5NGU0MDQ0NTM4ZTAxM2EyYTIxN2UzNmIxZTU2OGJhNjBhY2I3YjRjOGYyZSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMGZiMTRiOTAyOWQ0OTg1MmNiYWU1ZDNkMjc3M2I2NTA1NGFjYTU0NWI2NDI5MmZjNWY5MWEyYjU2MGQ5MDU2OCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZThmZTBiYmI5NDc2N2JkNzQwZWYwN2NlMDI5NTc3MzZhYTBjNDE2YjMxODIxMTZhOTAwNDhmNTUyOTJhNDg3MCJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L84-L100",
|
||||
"version": "repo-lines-v1:sha256:01cc489e7587e0656b402cdd3bfe9f089758ba5d920b6bb9a538388f4d0f4727:eyJzZWxlY3RlZExpbmVDb3VudCI6MTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ0YzA4NGU4NjI3OTA4ODY3YzIxYzc0MWVlZGQ0NzlhM2ExMGE5MDk4NzQ2NTZmM2E1N2YyZDU1Y2MyMWExYTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZhYWU3ZDJkZDk1OTRkNmMzYmViZjE3Y2FlZTgzOTllYWIyMTNlMjM3NGQ2MWZhYjY3MDc5YmVjMTYwMjg2MTIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjFjYTEyOWUyMWU4M2NhYmM5MjYxNTk2OWFmYjUzYWM4NGEzNjlkMGNjNzU5NTAwYTMyOGZkY2Y0NWE2Y2ZhOTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY1MDFlN2VkMjlmY2YzZTZlMmE3MDI0NDZhNzQzZWRmMWE3ZGQ3MGVlOWY4ODg4ZWYwOGI4NTFjMTc2Yzc4YzQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Platform/MacDeviceName.swift#L5-L29",
|
||||
"version": "repo-lines-v1:sha256:2e3a802d84fd2b017f0074f76c3ef896d3127453e0142f3a054521e823ba686f:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImIzZWIyNmFmMDY4MGI1ZTY3MGVmYjZkZGRhNjRmNGEyMzVmNDhmNTE2N2NlMWY4OTYwMDQ0MDU0MGE1OWRkMzIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVlNGQzYWNkOTllYjdjOGNhNzFkNzZjODJjMTIxOTcxNzU5YjBlOTFmODVlNzhhNWQ1NDJlOWUzNWQ4ODFhODUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://TFM/Platform/MacDeviceName.swift",
|
||||
"version": "repo-file-v1:sha256:d884719f29fe1d5e7a8e980adcc5205737202a72bcb9e839ba39c34f0dcb414b"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -347,24 +331,16 @@
|
||||
"statement": "Desktop shutdown fences new assistant runs, cancels run preparations, stops stored conversations and waits for their terminal persistence before closing agent background commands and connection pools; repeated calls share one cleanup task, while the AppKit termination reply has a once-only three-second fallback that does not guarantee cleanup completed.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L724-L778",
|
||||
"version": "repo-lines-v1:sha256:4088a1395f839fa08e6e42d1dc28faa30416dc463f43b9354b941ebf4e582043:eyJzZWxlY3RlZExpbmVDb3VudCI6NTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRiNmE1OWU3Nzg2NmU1MGRiZDYxZjA5ZmQ1YWM2MjQwN2Q0ZGVlNjdkNGIyNTJhNDExYzRhZTEwZWNmMWQwNmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjUzODNlN2M2MmI5ZmI0ZGU3YjNjNTc3ZmFkNjNiOTYxMGRlZTcyNmI4NzljYzZjN2M5ZjYzNTljOTU5YWEwODQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYzNmM5MGE0M2ZiOWQ0NDg2NzI0NmE0MzY5ODk4YWZkOTFiOWUyYjM0OTZmMjU3OTg1YTk0MDFhZjY4ZDI1YWYifQ"
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L217-L241",
|
||||
"version": "repo-lines-v1:sha256:850e12a59f116f944049eaf0226a5d7979e0610d2e89b9adf9e7b220b02dc96c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMzNzRjMTE1MjIyZjljYzUwMWEyMjliZmUyMDk1YTNkZWZmMTFiMDg2MjFmOGFiMmI5MzgwZWEzMjQ1ZWM5MmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNhMTE1ZmUxY2Q2ZDFkNTg2ZTIzYWM3NTJkODUyNzQwZWQ2YmE5ODNlZmU2NDg0NTMwNDM0YmM4MTBiOGQ5ZGUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImMxYmJkYmE3MTE3NjI3OTU5NzBjZWQxMDc4MzhjY2EyMGY2OGJkYmM0OWFiODdiNTE5YzcwZmEwOTdiZGU0OWIifQ"
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift#L383-L422",
|
||||
"version": "repo-lines-v1:sha256:3584a07a98a3152e8413b2ca3dab7ec5452440020bc87aa0c1a67dad6ee6df69:eyJzZWxlY3RlZExpbmVDb3VudCI6NDAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImIyMmJlMTBlOWQxYjNjMGE2OTYxNzZmMGYyMDQ3MGVhODMzN2FmYzI4MWZmMTIzYmNmMmRmMjkzMTNkMDIwMTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc4NWYxZjhkMWY1ODkwZmNjMTE1ZWMwNWRlNGU3NzA1ODdiOWRjNDlkZDhlM2IxNTViYmUwYzI4NWI2ZWQyYmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoyLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhiMTg2M2Q4Njg3OTcxYTY0ZjViOTdkMmI1YTMzNmYyYWE0NTIzYWU3MjU2MDIxOTg2YTQ2MjdlY2ViMTUxMzEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppTerminationTests.swift#L12-L66",
|
||||
"version": "repo-lines-v1:sha256:6ad8d7bcd045badb3fc0b39ec827c2092c78053e237fee649338c10c207fe520:eyJzZWxlY3RlZExpbmVDb3VudCI6NTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk2NjIzZDExNWQwMWY2ZjNiNWJhZDE5NTgwODNkYmY0Y2U0OWVhNDIxZTY2ODZmNThlODQ5ZmU5NThiNzhmYmUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMxNTg4YmUwOTg1YmY0YjM2ZTM2ODU2NmViNjlmMjI3NGVkN2UyOTIwOWFmYTJjYTYxNjFjYWU2OTFiODA0YjYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppTerminationTests.swift#L163-L200",
|
||||
"version": "repo-lines-v1:sha256:23741adb64c4324b01aab2e7b6c1ff5b763b7be042588dafeb2e55ddb2254e05:eyJzZWxlY3RlZExpbmVDb3VudCI6MzgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYzYjI4MzBlZWZiNWU4Y2YwOGEyZmUwM2FiY2M3MjE4NTI1MDljMzkxNWI2MDEyNGQ1YWQxZGQ2ZTA4MTUyOGQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQwMWUwZTUzYzVjZjJmYjM3M2ZhNjdiZGYxZWIxODUzZmI5ZWUyMmVkOWUwZWQwZTdiMWQwNDFiOGYwN2Y2ZjcifQ"
|
||||
"resource": "repo://TFMTests/AppTerminationTests.swift",
|
||||
"version": "repo-file-v1:sha256:61e14261971e275798d4cde5275e5c3e0dc0d5552beace53b81e1ed3842358eb"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -409,16 +385,16 @@
|
||||
"statement": "Mobile Home Screen recent-host shortcut items are refreshed from local connection history when scene phase, history or host configuration changes and are limited to three openable recent Hosts; unknown and malformed shortcut payloads are rejected.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift#L49-L61",
|
||||
"version": "repo-lines-v1:sha256:249ac9c410d430a05c01d60a3f50dad3ec3d6f422327fd2c794d220961356430:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwNmIyOTNhY2FiZjI2YWJjZmZmNDhiYzNlZmVkZTIzZmEyMDFiYjA3MDMzMDMxYzcwOWVkZDc2NmQ1YjQ2NWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5MzEyMzk0OTNhNjBlYTFkOTllZWQyZjE3MTljZjEyNjZmMThlNTE5ZDQxZTZmODNiMjYwNjg3ZjUxZTA3OWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImVhODJkMzE1MjUzMGQ4NzVhM2U0ZTA1ODYyMDQzNTI2Zjg4YWY3ZGVkNzkxNjk0ZjdjZWZkNTQ0OGQ5ZTY3MGIifQ"
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Platform/MobileHomeScreenQuickActions.swift#L53-L85",
|
||||
"version": "repo-lines-v1:sha256:d61cefed43f210f7ad7e714850a75960082d617c06fad5bbba053929b04142de:eyJzZWxlY3RlZExpbmVDb3VudCI6MzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYwMjEyZWU1ODM0MGZjYzliNzkxNTZlZDdiYjIwNjQ0YjJjODJhYzM2MGMzZDdhYWU0YTZhZWQzZjg3ZGVmZWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZjNGY2MWQ0YWEzNzkxMTQ4YTUyNGZmNzA2YWE5YTg2MjQwMDZkNGNhMTIzZWM3NWU4YjQzOTRlYmZkYjdhOWUifQ"
|
||||
"resource": "repo://TFI/Platform/MobileHomeScreenQuickActions.swift",
|
||||
"version": "repo-file-v1:sha256:876e36822c6894079fa98043df42e98d7044a2b7658eacb3a4e049075d41cf88"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileHomeScreenQuickActionTests.swift#L13-L99",
|
||||
"version": "repo-lines-v1:sha256:e64ef71db78459dd5c501551f9cf9bb8e02172db307bc2ed4feca0700a0baca5:eyJzZWxlY3RlZExpbmVDb3VudCI6ODcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRhNWQ1NzkwYTUwMTk1OWQ5MzcyNDJjODJlYTQzMTdlZjI4MjA1ZDUyYTY1NzVkNGFlZjRiNDA1ODE1NTRmNzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjlmZTI4YTNjYTA5YWVkYTRiNDFlMzhhNzU1OGZlNTAxMWJlNGNmYTIwMTk5NzZlZDgxNjM3MTFiNmVmNDgwMzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk0ZGY1MjYyMGJkMmEzZTcxYjhhOWUxMTdlZmRmZTQ0MDQwOWNlM2ZiMmJmZTYxNGJmZThmNWJjZjNjZWRkMTkifQ"
|
||||
"resource": "repo://TFITests/MobileHomeScreenQuickActionTests.swift",
|
||||
"version": "repo-file-v1:sha256:6c3c8c89cc7cdc7e8e0d52d53818bddbc5cc2c35e137f4e344dca54ad9262016"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -455,22 +431,22 @@
|
||||
"statement": "On mobile background-task expiry, active workspaces detach transports, clear pending interactive authentication and set a foreground reconnect intent; foreground resume reconnects only workspaces carrying that intent, so returning before expiry preserves a healthy connection.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L560-L578",
|
||||
"version": "repo-lines-v1:sha256:b0fa484bcb19ae7f887f203d3b438c9bccc7b5936706cd85d285e53c0f9b31d2:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjExYjYwOWM3ODJiMmM2NDVhM2M2ZDFmOWMyMDA3YzdjMGVlMWI5MTI1YjJjOGIxOTU0YTFlMTVjY2UxM2VkYjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjExMGVhYzUyYWE2NjM0MDczNjQ0MjU1MTg2YTc5NGIxMjdmYzQ5MTA2NTRmYTNhMjBiOTgzMjMxOTIxZWU2ZWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI0NTg0ZDFiMmZhZDA3YjA0ZTIwZTVjOGE2MTM3OGEzNDFjZGJlN2E4ZDgwMzAwZDQ2NzJlNjhhYjcxZTFjZjMifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift#L1056-L1101",
|
||||
"version": "repo-lines-v1:sha256:0a7ae642dd083c84f164b264fee0281ba51d48288dcddb66d8c2e9912a631140:eyJzZWxlY3RlZExpbmVDb3VudCI6NDYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjljN2Y4NWI1NDQ5YmI0MTM0YjhmMTAzN2M1ZDkwNjU4ZDNiMjU4YWIxMDZlNWZmNjEzNTBiZjg2MzlmYzY4ODQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE2ZGMzODIwMjNmZDQ2NDhkYjQzZmZhNjFjNWJmYjQ3ZjliOTZjZTIyZjFmNGI2OGYxZTczZGY3ODkxN2VlMDkifQ"
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift",
|
||||
"version": "repo-file-v1:sha256:c2f5bd4b56b1c901b8f139b34372452037e6c95315e1dc3e50b08f3215f5d748"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAppTests.swift#L364-L412",
|
||||
"version": "repo-lines-v1:sha256:4b42b940eee336d4e9dba5d37b9cd3b61c253847a1e50c87f2a735a301852750:eyJzZWxlY3RlZExpbmVDb3VudCI6NDksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFiZDFmNThmMjIzZDQ1NjI2YzYyY2U4NDc3Nzg4MjI0OWNkMDdjMzM4MzQyYTE0MWRhYWRhMzkzMjUwNGY5NTgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjgzY2QxZDE2MWMyZWJmNTNmZjg1NjNmM2Q5MDdiMmM5MDJiYzVmZWE1MThmMDcyY2UwNmU2MjI2NTQwMGIyMmMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjczNDUwNzJhNjRjMWI2Y2UxMWFmZmZmNGZjNTM1ZTk1YmYwZGMwYmQ2MDhhYTQ4NzMzMWI5NzYxYzI3MjdhY2YifQ"
|
||||
"resource": "repo://TFITests/MobileAppTests.swift",
|
||||
"version": "repo-file-v1:sha256:4e595e215d00b798a3c7d026a88d5236ac57d2cfdec406883eb289dabd289f03"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:1d94baed34a4a63a7a933c51f451945882a2778972ab6bd10350dbd195285613",
|
||||
"pageVersion": "sha256:75e670dfa0509344b9ab0328cbe127991d80d0198d1c7aeeaae2d502ee71c83b",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_6e30bc8cde134c23815d274543d0786c",
|
||||
@@ -206,7 +206,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift",
|
||||
"version": "repo-file-v1:sha256:cf79dd9ebcaa4d4ce76e340aa5b6585322619c5e04ed35aa8fe5208a895106f9"
|
||||
"version": "repo-file-v1:sha256:669be133495ace7709a537d328d7ba5e31fa8159dbd50a7f3e193cc91f807d74"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -220,11 +220,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/IdentityFormSections.swift",
|
||||
"version": "repo-file-v1:sha256:93de372e215799eb224092fa676a7e7716a646f5545127504c3dfe7d94a2516e"
|
||||
"version": "repo-file-v1:sha256:eb1f12eb2abdbd61fee03068366f3d00672bbe2388c7fde34af1210ade6d95f8"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/SFTP/RemoteFile%2BPresentation.swift",
|
||||
"version": "repo-file-v1:sha256:e27e838481f8b11824eb5d37bce36d22b5c66cbb14464fae3785f77ecd058aa5"
|
||||
"version": "repo-file-v1:sha256:c33baaf4af7e82f3626448c95af37b10034595812e7dbfb83aa30e85305bef72"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalAppearance.swift",
|
||||
@@ -232,7 +232,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:ca356c025f911101bbaf63a9a34b72736291043ed0fc0daa8dbedec972eac6b1"
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -417,16 +417,12 @@
|
||||
"statement": "RemoteCharsetStreamConverter performs strict outgoing iconv encoding and stateful streaming decoding, buffering incomplete multibyte input while passing malformed received bytes through rather than failing the stream; normal encoding throws on unrepresentable text and optional invalid-input recovery reports rejection.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://FrameworkTests/RemoteCharsetTests.swift#L26-L67",
|
||||
"version": "repo-lines-v1:sha256:e26eabcaac0395551641ec9be367ea064eff06db917c89c2ac5dcf5011273d8a:eyJzZWxlY3RlZExpbmVDb3VudCI6NDIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI2MmYxZjhlNzYyMmY5NjRjMDE0ZTU3YmM0NzQ0NDRjZGQ5YzI4OTcyZTcxMmNiYTJkZGI5ZWZlMmJjODIzNTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjgwYTg5ZTQ0Yjk3NTMzNThhNzRkZjI3ZjgxNjE5Y2RhY2YzNmVjNTJiOTNlNzcxOGUyNDE3YzYxYTQzNGI4OTEifQ"
|
||||
"resource": "repo://FrameworkTests/RemoteCharsetTests.swift",
|
||||
"version": "repo-file-v1:sha256:5078e65bb98f232433bcd599cdc4d36335ccbc4e0d4633f28ce40c3611b14857"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift#L145-L223",
|
||||
"version": "repo-lines-v1:sha256:f8892502d88bbe21dd53f7d2f5feb868e83104b38e739700e675dd7cf2a539d2:eyJzZWxlY3RlZExpbmVDb3VudCI6NzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyOWQwZGQ3Njg3MTU3NzZkZDE5NTU1ZmI3MzU1ZDZmOTE1ZjI4NDM2ZjhmYmIxMTQ3Y2Y5MTUwMThkMjgwM2EiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVlMmY4NzI4MWVkYjU0NmViNTIzNGRiNjk4ZWYyZGJkM2Y1NWM3YjNmZjgxMDQ0YzVhZWJlMTdmMTdiODhiNjIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMzOGRkMWQ4Zjk2ZGNhNzFiZWE3ZTUyMmU0NDgxNDBhNjc5ODRmYTRlY2Y5ZTJiMzgzYmRmYTNhYmYxZGJmM2YifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift#L41-L139",
|
||||
"version": "repo-lines-v1:sha256:fb2a42a6ccccf45a6ea6fb302bc378c0e36219610401cfc86b3ef3ac773934ab:eyJzZWxlY3RlZExpbmVDb3VudCI6OTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ4MGQ2NzYyOGE1ZDQyMmQzMzNkMDY0MjNlNDRiNDQ5NWRjZjIwODZiMjQ0NzZmZjY4MjZhNGExZmQwMTM1NDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE1M2M1MTkzMmRhMWMyNmI0NDkzMTIxNmUyMDRhYjZjYzUwNzE4OTE1MzEwZDZjYmUwNGJhNWY0ZDRlYTVhYTcifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift",
|
||||
"version": "repo-file-v1:sha256:34692935f03154b8b9108663fb4666eaca689d24ab4b8468610495ed49f9d15d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -435,32 +431,32 @@
|
||||
"statement": "The remote charset adapter is applied at SSH exec, PTY and SFTP boundaries and also in Telnet; the SSH PTY OSC 7 filter rewrites charset-encoded working-directory paths into percent-encoded UTF-8 for Ghostty, buffering fragmented frames and bounding incomplete payloads.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://FrameworkTests/RemoteCharsetTests.swift#L88-L105",
|
||||
"version": "repo-lines-v1:sha256:d993b57e4ee07fe64963235749b3d1da91c896eb37a806687ec3a4924fae8690:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBjYzBiNjNlMjc4YjhiYWZjNThhZjEyZWU1NDUxOGMxZTEzZjEzYThkNmY4N2JmNDlhNzJiYjEzYjc5MTQ3ZGQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://FrameworkTests/RemoteCharsetTests.swift",
|
||||
"version": "repo-file-v1:sha256:5078e65bb98f232433bcd599cdc4d36335ccbc4e0d4633f28ce40c3611b14857"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift#L225-L272",
|
||||
"version": "repo-lines-v1:sha256:097eb2230f29b0b7ba234ed63cc74a0020b8455dd74b27ae1372400534c80237:eyJzZWxlY3RlZExpbmVDb3VudCI6NDgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM0NGY1M2U3ODIwY2I2ZGVlMjBjYzI3YzUzNzI1NzQxNTVhMjUyNzZhOGZmNjI3ODViYzcyZTBmYzM5N2ZjZWMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk1NDE0NWZjOGQ2NDEyNjYzYzIzNTA5MDgxOTIwOTcwNzViNmI4N2JlY2Q1NTMxZDk3MzZjZmI3MmNkNGUxZWIifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift",
|
||||
"version": "repo-file-v1:sha256:34692935f03154b8b9108663fb4666eaca689d24ab4b8468610495ed49f9d15d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SFTPChannel.swift#L1050-L1059",
|
||||
"version": "repo-lines-v1:sha256:1658b6df3d87086511f52ca5558ba653833f3c8661c53141329dbcc7b1dcfbdf:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg3MTQ1YjAxZjU4OGNhYjg3MzZiNzcxNDJlNjMwNGM3YmQwMmFhOTY5ZWU4ZjJkYjA0ZmQ4ZDNhZmMzODI2ZGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNhZTk2NmQ4YzVmOWI5MmMxMGRjYTQ2MDRkMGQ4OTAwOTIwZTNkYmNmODY3ZTUxNjZmNGU1ZmM1NzJjYTRmODgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg3MGIyM2M1ZWE2MTUwNDFjMWM1NmE4NWFmYzNiYTNmM2M2YjBhNjFhZGY0ZmRkOTQ4M2M3Mjg3NzY1Y2IzOTQifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SFTPChannel.swift",
|
||||
"version": "repo-file-v1:sha256:508b0f166c37050bca2ebd5b50e778d90abcd6426dca20422be86f442027684f"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHConnection.swift#L28-L60",
|
||||
"version": "repo-lines-v1:sha256:22a22a2b497829248ab3e5880daf830512f03dd4a317771d2541f86155b98c15:eyJzZWxlY3RlZExpbmVDb3VudCI6MzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImEyYmU2NzBmYzQyNzBiMzQzOTg5M2I1Y2Q3MDMyODQ0MDZmYmZlNjRhNzg4MmUwMzVjOTE4MTRlYjBkZjRkNzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHConnection.swift",
|
||||
"version": "repo-file-v1:sha256:f4c451cea09acceef83466764034d182db354ed99364616ddcd18388d2bbd8ed"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHConnectionWorker.swift#L60-L85",
|
||||
"version": "repo-lines-v1:sha256:9fb1b85b1ac40b091bec6ae0b36debc5978c2c029f69f90944402912907d2a75:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1YmEzZWNhZDAwNzM4MGU4ZGI2NjcwNDhkNmFjOTA5YjRiMTcxNjIyNzBmYTU1ZjQ1MDEzNTViMmMwMDhiZTEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjllN2NkODRiNzY3MWNiOWFlZmQ1NzkyOTZiNzYzODA1NjM2YzllOWYwZWQ4ZDRlMjU0MTMyMTI0OWMxZTgxYmYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjExZmE0OGJmNmI0MTZiYmVkOTA0YmRmMTk2ODZmN2I5OTViOTcyNjRkNTlkMDVkZTEwYWQzYTkxMjY5OGM3ZWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM2Nzg4MjlhNTVkNTI4NGQ1MjQ2N2I3MjcxM2VlN2E0MjYxM2UzOTdjODRkNzE4YmJhM2I5N2IwOTY3NDExODIifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHConnectionWorker.swift",
|
||||
"version": "repo-file-v1:sha256:83bd91c7b4c8130770b7d66248513245e3a5dc341380b5285703b32e707bb6f4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHPTYChannel.swift#L1097-L1125",
|
||||
"version": "repo-lines-v1:sha256:18b6ec795aa4c05d1e4b820fa966bdcd93eac5d15b1643bf22c9159acd84a950:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxMDI0YTNlZDg5OGNiZTliOTI3MDY1OTc4NjFmMjBjZmFkMTY4MTY2OTY5Y2FjNjQzNjI2OWE2MzRmOWU1ODAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAzNGYyOTRiYzljYWNmMTVjZjM2Y2I1NDIwYmVjOThmNTBmY2Q2ZWIyNmJhYjc1ZmU2NjMwMzMxYjc5ZGFmYmQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIwYzFhMDM5NmZhNTI4ODRjN2JkNTAyMGI0YjMyN2IxMzc3NjNkYmQ0NWE5NjFmZDI5ZTczZGEzYzU4MGY5OWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY2MzkwMzNmODAyZDEwMDE1YmFkZDExMDc4YzFiZjg5YjljODhhMzc2ZjhjMzlkN2Q0MTZkODk1OTc1MWUyZGEifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHPTYChannel.swift",
|
||||
"version": "repo-file-v1:sha256:d107fbe196c9df5e7b49acb4301fe0a5f819fc5b411815083966f073b491f237"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L100-L110",
|
||||
"version": "repo-lines-v1:sha256:5ec85b0929ba0a2bfd2b1302882875ba5d00ca0589bb2c9c1b17ff05f5cdd9ec:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFlMzE4Y2U5MDUyNmI0NDBlMGQ2YTJjNzAxZjNiNzA5MzIzNzk2ZTE2ZDcxYmQzNjY0ZWE2OTFmMGRlNjhjZjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE0MDQwNzcyMjI1MTA4MGEyNWE4Zjk3OTczZmRjZjY3MTBkYTY3YmM1MGUyNjhmNDYxZGFmMjFiODk2MmJiMzgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNlODliZWQ5YjAxNWE5MzY2NDk3MjgxN2EwM2Q4MDMwMjZmOGYwMzY0NDNiODYwYjc4ODljMjM1MzU4ZWE3NjAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY1ODgwYzBiN2JmNWVjZWM3MTcxNmM2NDhmNDM3NWJiMmU2MTZiZjIzNDE5YjAzOWE4MmQ4ODQ5Yjk3NGRjOWYifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift",
|
||||
"version": "repo-file-v1:sha256:669be133495ace7709a537d328d7ba5e31fa8159dbd50a7f3e193cc91f807d74"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -487,26 +483,26 @@
|
||||
"statement": "Shared application strings and bundle metadata have separate string catalogs from AgentKit text, and the repository localization check requires completed zh-Hans and zh-Hant translations; Linux distribution assets, catalog and licensing are regenerated together from a pinned Simple Icons version rather than fetched during app use.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md#L48-L50",
|
||||
"version": "repo-lines-v1:sha256:5e69d5ddf8b0181f834edfe8f463b1ddc71ce0c0c26beaa6f4dc0cb63b7f1c67:eyJzZWxlY3RlZExpbmVDb3VudCI6MywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiN2ViNmVkNjM3YmU2ODNjNzYxMmY2NzdlYTllMWE1NmI5NjU5OWU3NzJmNmQ3NjkwYjQyMzc0MGNkMTRhZmZmNyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiODQ1MThlZDQyNWZhZWNhNTgxNGExYzEwMTU0ZjEzMjgxOGViM2VjMGI2ZTgzOThkZjQ5NGI4YWRmN2MzYTI0NiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiOTg2ZjBmYzI2Yzg1ZWJjYjA4ODA0ODE3YmIwZDNkYmQ3YTA5YTYxYTU3ZGE5YTA1OTdhYWM5ZTc1ZDBkNzQ5MiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMGVkYzQzMzI5OGFkNTgxMjllZTBhODg1MmMxM2Y1MjkyMGRhYWY5NGE4YzY0YTQ4NzFlZWVmNDZlMTMxNWVkMiJ9"
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/LinuxDistributionIconCatalog.swift#L14-L25",
|
||||
"version": "repo-lines-v1:sha256:46220a6c0c2862ec48861323b92cc21d9e565259e819e8ffe2ba105ebe7b0e83:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkwNWQ3NGUyZmQzYTU0ZWQ2OWIyZTlkNGFjNjQ5MGQzNmZhNmQ1YjlkZTM1NWIyZjdkMDdlZTMzNTVjM2UwNjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI1ZDUyOTJkOWFiYWZmMDkzNjg4NjdlZDJjZTZlYmQxZTBhYmZlZDBiMzIzY2M0NDVhNjJkOTY3OGU2YTM4ZmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNlYWNmMmU1NWZhZTY3MzJhMzgxNmUzMWRkYWM5MTNjNjY5NDk0YjYzNGVhYmJmMjJhOTc1NWI1YjgyMWJiM2EiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImRhOGI1ZDNiNGU0ZmFlNTYzM2NjMjY2MmU4NWI4ZjM0YzNlYWU0MzVlMjBiMzM2Y2VmMWZmYzI5YmRmZGQwYTMifQ"
|
||||
"resource": "repo://Frameworks/TermindPresentation/LinuxDistributionIconCatalog.swift",
|
||||
"version": "repo-file-v1:sha256:a129d782efe875c18706468fc0aaf8d5191c71287e0ac1f1559027f1fcc13821"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Scripts/check-zh-localization.sh#L5-L38",
|
||||
"version": "repo-lines-v1:sha256:b0e73658713e0bef0ac9fac43dd6d0773ad289fc23ff261a3048e2b0c041518b:eyJzZWxlY3RlZExpbmVDb3VudCI6MzQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRiM2ZjMjU5YmQyZWU2NDYyYzExYjZkOGUxNjZkMjU4MTVlMjNjNjkzZTA0ODRjOGZiZWQ3OTRmOTJmODI3ZDUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMxY2M5NTJiNzdlY2RhOWVjMDJhODQxMDRjMDZhOWI3YjBlM2YyM2UzMjczMmQ0ZjIwNmU0NTYxYWI4Nzk0OTIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImExOTg0ZjI4NTg4NzhjMzQwMjJjYzU0NDQ0NjVjNGY1NjczYTE0ZGVhNGE1N2E1NmRiZTdmOTA2M2E2ODQwYzgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk4M2RmNGEzNjk4MThjNzczM2Q2ZWJmOTdmNTg3YWIyMzg1M2ExMTc1YzA0YzUxODYxNjg4MTljZmEwYjMxMmUifQ"
|
||||
"resource": "repo://Scripts/check-zh-localization.sh",
|
||||
"version": "repo-file-v1:sha256:305b4c1458a71783b51720861f2a4a1452bd28a8b9478ddae38b4c775f52eb97"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Scripts/update-linux-distribution-icons.sh#L4-L27",
|
||||
"version": "repo-lines-v1:sha256:e49bb42925da6bf075fa72a0630d566b825cb7bb54f427a17350ff9475ae4f9b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI5N2RhYmY0NzI0YThlZTU1ZjY3MDIzZjRiZmQ4MjI1YzE3NDEzNDQ4ZjBmZmM0ZDk5MjI2NGVlZjU1MmQzYTgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiMzk3NDE3YWZhZmJmZDk3NWNiNzE2ZjkwNDM1NDc3MDVjMjkwM2NjMTc5NDRhM2U4NTcyNTgwNTYwZmMzZDAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjMyNzE5ZjUyMDk2ZmMwMTY1NzlhZWE0OTY5NmVmYTgyOWNmYzg4N2E5YzI5YWY1ODQyYTVlNGIxYjVhOGNhN2UiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjUyZjMzYjM5MGE0NmE1YzJkZjkwOGIwOGM4NjNlMGEyNmJiY2M1YzQ4MDJkZGUxNjA2ZWNlZGIzNjBmM2EyNzAifQ"
|
||||
"resource": "repo://Scripts/update-linux-distribution-icons.sh",
|
||||
"version": "repo-file-v1:sha256:6554e0ab2064d73f9aedf5c5334a7b113a5e78f2964f95812ebadaefba0b23b1"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:28aa0deba6ac872df151035ac04d0aba9eb9619b16b76c706ecd36c2dbe08425",
|
||||
"pageVersion": "sha256:4d74f05a7122684c6b96ed5356b6f6195a539e57beb0e540084accada9d032af",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_8809151c43594803b83cf0451d849112",
|
||||
@@ -70,7 +70,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPServerTools.swift",
|
||||
"version": "repo-file-v1:sha256:7fb10e9423fc06bfc8c45a3b189ffd03cc3b8f588915c1e9afa3cc33b91d6020"
|
||||
"version": "repo-file-v1:sha256:11a618b54c8c7c8cf212423feb11ef58ee507f58a852a9fa4a7e5fd06bdf2800"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Infrastructure/MCP/MCPServerSession.swift",
|
||||
@@ -81,8 +81,8 @@
|
||||
"version": "repo-file-v1:sha256:5a91a4b29083f71858834b4b1adee9fb64551de704e850ebe8026926ff9a6b9b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TermindMCPBridge/main.swift#L4-L87",
|
||||
"version": "repo-lines-v1:sha256:ecccf30acbd284a663e31c1aa7f40e224b2264fb038003a81dceaa30c6449866:eyJzZWxlY3RlZExpbmVDb3VudCI6ODQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjZmJkYmI1MDE2YWM3ZGVlYTU2ZTg5MGFlOTNhZDc3MzY1Y2I0ZDhhMGQ4NjhiMmU2YzliZTNjYzExYzQ2NGQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE3M2Y1YTY5MGEwZjAwODY0Y2RmNDU3MjY3OTAxZjNkNzg5ZmRjYzgwNzQ5NzlmNWUzMDQ2ODVlMjFiMzNlNTUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE0ODcxYWY5NDg1Yzg3ZThjMGM0ZGNhN2IyYTI3MThiOWY5YTJmN2QxM2RlYWM1Y2MyYTY5YzgyNWVhY2ViZmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgifQ"
|
||||
"resource": "repo://TermindMCPBridge/main.swift",
|
||||
"version": "repo-file-v1:sha256:5d7d2a463303294a57a5c633c4a10a9c2f773434d97eb0f91f64be8ff1a93572"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -152,7 +152,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://Scripts/check-zh-localization.sh",
|
||||
"version": "repo-file-v1:sha256:065d662aa579090c80e0fe93ab13ecb447c112ceebbc8a1ec29a1c39b9b8e3ef"
|
||||
"version": "repo-file-v1:sha256:305b4c1458a71783b51720861f2a4a1452bd28a8b9478ddae38b4c775f52eb97"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Scripts/update-linux-distribution-icons.sh",
|
||||
@@ -313,6 +313,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:a6f8d86c38688d119e171586b5b7c1c46a68416470c47cda9fbe3cbee3d02f9a",
|
||||
"pageVersion": "sha256:248082c1704843420a73915262422310cbc8c586ce590a5808d2052a4a65f23a",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_085ce722f39f48eea75366ec3b3f7554",
|
||||
@@ -70,15 +70,15 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:9daf1c0933fdbcff826165a8edc171876c54faa343a184348284e63f736e86bf"
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -180,15 +180,15 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Platform/MacDeviceName.swift#L5-L29",
|
||||
"version": "repo-lines-v1:sha256:2e3a802d84fd2b017f0074f76c3ef896d3127453e0142f3a054521e823ba686f:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImIzZWIyNmFmMDY4MGI1ZTY3MGVmYjZkZGRhNjRmNGEyMzVmNDhmNTE2N2NlMWY4OTYwMDQ0MDU0MGE1OWRkMzIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVlNGQzYWNkOTllYjdjOGNhNzFkNzZjODJjMTIxOTcxNzU5YjBlOTFmODVlNzhhNWQ1NDJlOWUzNWQ4ODFhODUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://TFM/Platform/MacDeviceName.swift",
|
||||
"version": "repo-file-v1:sha256:d884719f29fe1d5e7a8e980adcc5205737202a72bcb9e839ba39c34f0dcb414b"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -229,12 +229,8 @@
|
||||
"statement": "The architecture tests' @Model guard only scans the desktop and mobile app roots plus Domain, Application, and Infrastructure; import scans are exact import-line checks and concrete-symbol checks only look for a fixed list, so tests do not prove all intended ownership boundaries exhaustively.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L221-L236",
|
||||
"version": "repo-lines-v1:sha256:f8c236519e8486d9e23370a1125780885a560563104317d8b0667fde12b5c048:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjcyMzk2YTZjMGFlNGEyMDI0YjE2OWE0NWY3MjdmZjYwNWE4NDI4NjdkODJlYjJjOTNkYmNkNmVlNDg4YmExYWEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L245-L300",
|
||||
"version": "repo-lines-v1:sha256:97554b0b6762f85b0f292940aa809315e0f8c641560cdb8ca2cdf8fbec334748:eyJzZWxlY3RlZExpbmVDb3VudCI6NTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQwODJlYzhiMDRiNTlhNjdhZWFhYmYxOTVkNWE5Y2I4YWJkMGE3NjBjZDc4YjE1MTNhNzg3MTA0MGE3N2Y0Y2EiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM0ODVjOTkxNGE0ZTFmMmY4YzUzZGM1MzYyODQ3NjI5MGQwZDAxYmFkZTA0NzQzYjVlNjczOGYyNTk4Y2M0YTQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -255,6 +251,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:40e0ea051b8758c505d4264ef66de5fe3e767ee52a8afa2858337c6827d609d1",
|
||||
"pageVersion": "sha256:374ccfb1b67779f7dfab5f96e532a7acd4676fbb1505fa9d05c6dabf3898791b",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_981f16f030e9469588af705aa377161e",
|
||||
@@ -8,7 +8,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:7c19a99ec73d4473ac94bb134b62a1306c62d1285e5b8af26430f1d466de35a7"
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift",
|
||||
@@ -261,28 +261,24 @@
|
||||
"statement": "The terminal_suggest schema remains registered across Assistant surfaces, while its execution gate is captured in toolAvailability: TFM Workspace sidebar sends true, TFM standalone and TFI send false; this partial gate does not disable independent SSH/SFTP execution.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L794-L809",
|
||||
"version": "repo-lines-v1:sha256:f5bad0e8ec4b31fdac4505332e2c746548c179c72239909f782501aec3db7129:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRjYTA3Y2I3YmYxMDg4OGZkZDFlMmMwMDMzYzI4MDIzMGVkMTRkNjkzNGY0NjFiNTZhNTg3NDllNmRjOTUyNWYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjViOGQzYzU0YjEwNzZiYmJmNTcwMmQyMTc3NDA0NmFlZDI3ZmNlYzVhM2JiNzYzNzQ0NjNlN2RlYTEwNGMwMmEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjcwYmFhMzUxMmU3OGFiOGM2NzBiZWU2NWVlNDQ4MzQ4ZTNjODVkNWZkYTFmM2JmYmYzYWRlMzI3MGIyNDY3MDgifQ"
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift",
|
||||
"version": "repo-file-v1:sha256:5d0e5c2bd75be53d73649916974145d847e8ffdd944a4f096192052d7a2b8078"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift#L11-L16",
|
||||
"version": "repo-lines-v1:sha256:a43583fa28f32662ba3edc9845073bfd7bfacb29b7c16c21536c56a4fe75a32e:eyJzZWxlY3RlZExpbmVDb3VudCI6NiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNDQ3NTE0MGUyNmU5YzVhMTcxMWQ2NDQ1YTE4YjdmNGFlMjAyMmY5OTNlZjYyODQwNzU1NDMwMWI5NmUwZGMyMCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMmI2ODNiYzA0Njk2MWVmOTJkOWI3Y2JkNmQ5YWNhZjJlOTk5Yzg2Zjg2ZjM1MzM1MTFiNWIyZTNmNjZhYjZmMSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZTJlNWI4YTJmMzJlNTczMDY2NDkyZTk4ZTUyNjFmZDQ1ZGQxMGYzZGQ1MDk3NjY2MzYwMzQzZjVjMWRmYzZhNSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNzlhM2ZjZTUzZjAwNjc0MmEyNjdhOThkZTNhZTI5Mjg2MzgzNmUwNzA3YTlmODgyZDllZGFhMzdmNjU5MTU1MiJ9"
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift",
|
||||
"version": "repo-file-v1:sha256:8a9a00fed4426631856719583ac4fe07542c1b12d159913a3936b39342dcee8e"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift#L115-L137",
|
||||
"version": "repo-lines-v1:sha256:d884494a35ff53875a54b449f399714b9593269893ee6b39224ad026690f757c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ3N2Q1YWM0NmZkNzdmMWZlYWMyMTM1ZTlmZDAxMGYyMzk4MWQxYzBhMzMzZWJkMTNlZjE2MmUyYzZiNTg0MDIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjMzZDE2ODk4MTU0MTExNzUyNDc4NGZlZWJjNTY5NzIzNmYyZDk2ZDI2YWJmYjA2ZTIxYmM2OWQ4MzIwODY0MTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA2NTdhYTY2MTFhOTk2ZTA3NjllNjNiN2VhYjJmMzIzYTEwZTA3YTAxMmViYjk1MTBjYTdhMTE4M2U1MzQ4ZDQifQ"
|
||||
"resource": "repo://TFM/Features/AI/ConversationTranscriptView.swift",
|
||||
"version": "repo-file-v1:sha256:0d485769d915e4ca05b84ad7acddab8ab7210e76f7e0b077ec7b0d575092fc01"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/AI/ConversationTranscriptView.swift#L103-L110",
|
||||
"version": "repo-lines-v1:sha256:541872e190e6d37c8cbb564bd335c76a333ede612d55b5bebc52340c1b584861:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiY2EyMDdlOTU2YmFkYTg5NzAwZTdkZDYyMzI4NjA3NzRmODk3YmYyZmIyNzlhN2EyZDFmNzgxMjU1YTQ5MTk4YSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiODQxMTE4MWVlMmVkMzkyYTZmNzJlZGYyMTBhY2I1MjA0YjBmMzQ5YzM4NWM4NTAyYTBmOGRiY2RkYWJlMTZiZSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiN2MxYTA5MGM3OTQzNmQyY2ExMTBlOGZkZDk2YTJhYjkzMGMzZTI4Njc1MzQ5NjU3ZGU4MWNlNDAzZmZkYWY2YyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYTU1N2E1YTU0OGJlOGIyZjAzMzVlZmNjMDc2ZTVmZDQ2ZDMwYzQyNTdhMGY5Mzc0ZWM3MDE5ODczOTYyNDVmNiJ9"
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift",
|
||||
"version": "repo-file-v1:sha256:8afffffbb974da8b4c7e4629ccac060f2b0cae5164ffa4f932dee2e083cbc15f"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L201-L227",
|
||||
"version": "repo-lines-v1:sha256:1d54119a61269212f65c8230f6bbdbe4878a2feb36bcce0a3e87f802545152a6:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYwMjA0MzJkYzQ3NGFmN2VmY2NlYmMwZTQ1ZDAzYzIxYmM3OTY0ZWMzZWY5NDE2Zjg5NmRlMDVlNmM0ODAzMzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZkY2E2ZmY0MTYzODU2MjUyOTU1NzNiYjQ0ZGRjZGM5ZDZiYmZkOWQ2OGRlYjVkZDRkNjA5OGNjZWRiNTFhNjUifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AgentBuiltInToolAvailabilityTests.swift#L155-L186",
|
||||
"version": "repo-lines-v1:sha256:322e4385cb4f30c48e2aede580612d470b10baca410ceceed97de8fc9a9b385e:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY4ZmRiMWE0ZmJiNDNlODMyMWI3MmU0Y2Y1ZmI2MDViMzJjMGRhMDlmMDVjZjQ2NjRkOTk1ZWFhYWZmZjk3YjAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjZlYzUwNDQwYjc4NjEyMDAwOWZkYmFiMzJiY2U1YmUyMjI2NGU4YTI3NjBkOWQ4NDY5MGM4ZTlmMDFmMTVmMzkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImVjYTRkZTNjNjI1OWM4ZmNkNTlmZGJkYWI2NWI1MDM4ZjRhM2YwYmNjYWU1OGRkYTAzMTJlZDNiNWQyNWNlYTIifQ"
|
||||
"resource": "repo://TFMTests/AgentBuiltInToolAvailabilityTests.swift",
|
||||
"version": "repo-file-v1:sha256:41d316f0b6e2b1b286a3a4a5f5c5167c386c68cb3a0258f19f79923cdd26c42b"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -375,36 +371,28 @@
|
||||
"statement": "Desktop sidebar, standalone and mobile first sends use controller capture before library promotion; refused sends do not promote or consume drafts, while accepted composer/text sends fold attachments and armed skills once and direct text sends preserve unrelated draft text.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L255-L322",
|
||||
"version": "repo-lines-v1:sha256:2889ab3b98df5cb7ad3761be5369f5ce30608dd0545a113ba32e762084fcf0f4:eyJzZWxlY3RlZExpbmVDb3VudCI6NjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE5N2Y5MTA0Y2I3MTFhZmVjOWQwNDhkNmU3MDg5ZThjMWQxMjMzNGI3ZjRiMDY4NDMzYmM2OTFkNmZlNTFiYjgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjczY2YyYmQ5MTEwMmVhZTlkOTJiZjA2MzA3M2UyMjA1ZmY2MDE1MTNjNTU0MTM1OWIxMDkzOTUxMTAyMTdlMmEifQ"
|
||||
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift",
|
||||
"version": "repo-file-v1:sha256:40ea45f2c9460238030ad6c00ed2f9ac58ffdfbefbe7500d752238d97379a217"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L103-L183",
|
||||
"version": "repo-lines-v1:sha256:178f860b9b18486bb117281733065309aea6c20a833151433972af61dfb4856a:eyJzZWxlY3RlZExpbmVDb3VudCI6ODEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZDUzYmFhYzE4Nzg1MmI0MzFjMjMyZTA1MTYwNjFkNDk2ZjdhMjE1NmVlNGJmN2RlYTY0N2ZjNjY0OTg2NmQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjgzYWVlMmNjZDYwMjA1YzRmNTY0NWM0NjE3MzZlZTZmYjkyZTU1ZGQzZjE2MmQ2NGQ0Y2UzOGIwY2I1NjExZDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk1OTNiMzkxMWVkYTE0NWU1MTk0NDFkMzI3ZTc2NWU4OTk5YmIzYTA1NjViMTI4NzRmOWM2MGRkODNjYTBkZjIifQ"
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift",
|
||||
"version": "repo-file-v1:sha256:5d0e5c2bd75be53d73649916974145d847e8ffdd944a4f096192052d7a2b8078"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L284-L304",
|
||||
"version": "repo-lines-v1:sha256:de29dc974cbd2c72ac1a59847fd02fc322550b4b15d0016d4ac1a76e768f07f8:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZhNWZmOTFkNGU1OWMxMDhlZWFkYjMzYzhiYzk3NTk1NGM4MjM1MDQ2YTcxNDRhNDFmMTBlMmI5NzgyYTc2ZDMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ1MGE4MTlhNjgyMGMwMzcxODE2OWM0YjllYmQ3ZThkODI1NDlmMTgzZDE2ZjkxYjM4YWY5MGZkNTM4ZmQ5YTkifQ"
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantLibraryModel.swift",
|
||||
"version": "repo-file-v1:sha256:3459cb676c105f9632379488ddda2a53c354c385e18eba92e915e806f8dfdcb5"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantLibraryModel.swift#L294-L314",
|
||||
"version": "repo-lines-v1:sha256:a64014c34c15ee7ab0d8a7a5a10328e7bd3404bf8421df377ce5286051a2d32d:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE0NjE2ZjIwOWNhYjQ2NDQ1MTQ4ZjU3NzBlZmQwM2Y2ZmU1YTA5NGIwOTJhYWM5M2Q1ZTE0MTE2YWNiMWVkNjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU3YzRmZjVmY2EyMGUzODk0Zjc3ZmY2NDk0Y2FmNmVkZDU2NzFiZjE3N2YyMmVmMDE3NDBlNzNhMTYwMTc3OWMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjUyMTg5MDk5ZWU0MjAyMWJlMjA2MDFkNTBkNGY4YTc5ZDI0YWEzOWE3MGUwNjgwZTA4MDgxZmZhMzk1MWEyOTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI5ZjE4NTg0N2IwMWZkZjhmNzliZDMxMGI3NzJjYzI4OTlkMGFmOGQ1YTM2ODAzYzZlZmY4ZTNkNDc0NWE5N2MifQ"
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift",
|
||||
"version": "repo-file-v1:sha256:68355854cdc17712a285fe01fd836c11ddc8321954037db18cbd738e3b5d85de"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/ConversationModel.swift#L1781-L1857",
|
||||
"version": "repo-lines-v1:sha256:137b934f370a293436a575b71fa2064f196fde99b552ad6b4722cc26c7d1715f:eyJzZWxlY3RlZExpbmVDb3VudCI6NzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEwNWFkZWY4YmJmMTk1N2E4N2RkNjVkZGNkNWUxZmZkNzU1NzQwNzM2MTY4Yzg4MTUyOTU1OTljMTk2Y2ZlMWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVmM2MyYmU5Yzg4ODZjMmM1YzI4MjYzOTk4MTBmZTYyMDY0YWZhZWEyN2RmMTNmNzQ5OGI4M2QyMmVlODBjODkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImNjYmNmYmVjMzcyYTExZGI3NzM0MGI4NDNmYzI5N2NmNDc4MmM2NTA3NzMwZWQ3YzMwYjAzYzZjNTU4NWQxOTUifQ"
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift",
|
||||
"version": "repo-file-v1:sha256:8a9a00fed4426631856719583ac4fe07542c1b12d159913a3936b39342dcee8e"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift#L115-L137",
|
||||
"version": "repo-lines-v1:sha256:d884494a35ff53875a54b449f399714b9593269893ee6b39224ad026690f757c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ3N2Q1YWM0NmZkNzdmMWZlYWMyMTM1ZTlmZDAxMGYyMzk4MWQxYzBhMzMzZWJkMTNlZjE2MmUyYzZiNTg0MDIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjMzZDE2ODk4MTU0MTExNzUyNDc4NGZlZWJjNTY5NzIzNmYyZDk2ZDI2YWJmYjA2ZTIxYmM2OWQ4MzIwODY0MTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA2NTdhYTY2MTFhOTk2ZTA3NjllNjNiN2VhYjJmMzIzYTEwZTA3YTAxMmViYjk1MTBjYTdhMTE4M2U1MzQ4ZDQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L1410-L1412",
|
||||
"version": "repo-lines-v1:sha256:31c1f04a072f685c2062916ea2f92b78d852768850456d8452bffe97923d3bf6:eyJzZWxlY3RlZExpbmVDb3VudCI6MywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMTA0Yzc0ODEwODVjNGRkZGFjYmEyYTcwMDc2NDhhZWU1NWMwZDRkM2ZjNzkzZjJhMTJiMDM2NzU3YTIzMGIwZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiOTk5YmRlZmVlYWNhNjM0MGUwMjkwZGM4NmU4ODljODlkNWUxODlhYTViYTQ0YjU4NWIzYjcwNzM0ZjRhNjJkOCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjEsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift#L201-L227",
|
||||
"version": "repo-lines-v1:sha256:1d54119a61269212f65c8230f6bbdbe4878a2feb36bcce0a3e87f802545152a6:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYwMjA0MzJkYzQ3NGFmN2VmY2NlYmMwZTQ1ZDAzYzIxYmM3OTY0ZWMzZWY5NDE2Zjg5NmRlMDVlNmM0ODAzMzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZkY2E2ZmY0MTYzODU2MjUyOTU1NzNiYjQ0ZGRjZGM5ZDZiYmZkOWQ2OGRlYjVkZDRkNjA5OGNjZWRiNTFhNjUifQ"
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift",
|
||||
"version": "repo-file-v1:sha256:8afffffbb974da8b4c7e4629ccac060f2b0cae5164ffa4f932dee2e083cbc15f"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -434,7 +422,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:0029784efe4588e87c3dc18317fdfaad46bed6b3a32bcf72dd0dd9b1c9da256e"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -531,28 +519,24 @@
|
||||
"statement": "Explicit startAgentRun reuses the last user turn's stored context snapshot or a neutral unknown legacy snapshot, while capturing current runtime configuration rather than reconstructing historical model settings, credentials or skill-package bytes; this context path is not a manual Retry/Resume UI or automatic recovery execution, and provider retry remains AgentKit-owned.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AgentKit/Sources/AgentKit/Runtime/AgentRuntime.swift#L228-L232",
|
||||
"version": "repo-lines-v1:sha256:eed277fa50bd81bf4981cfc5ca33ee0040f9f31c8c789675787c5b21125c5a3c:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZWFjOWQ5NmYxZjNjZWJiNDM5ZWM1ZWU1OTBhNzcyMDU4YzBkZmMwY2E3NTBhMGM0MGVjNzI3NDU5MjU4ZmY0NyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTkwOWE1M2E2MThkMDI4ZTFkMzAwMGMwYTdhYmNlZWNiZTVmYjM3ZjRlNTExZWZlNDY2NDNmYWQ2ZTY2ODcyZiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMWZkNmZkMjc0OTZiYTU4NmFjZGJiODIzYTBhNjQxYTUzMTU0NTc4OTAzOWM5MjU2NWUwYmQ5Zjc3OWFiMjhiZiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYmNiODI3NzU2YjA1Y2M5Y2NmNDljNjg5ZGExNTM1ODlmNDA5MjYyNzY1Nzg2Njg0YTllMDVhNDY2ZGIwZjQ2ZiJ9"
|
||||
"resource": "repo://AgentKit/Sources/AgentKit/Runtime/AgentRuntime.swift",
|
||||
"version": "repo-file-v1:sha256:dd5e6ea3dd365910d2a30a88da9029bd972a547b511503e9665857da494271c3"
|
||||
},
|
||||
{
|
||||
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift#L430-L445",
|
||||
"version": "repo-lines-v1:sha256:3f7bdc58bf3927133f06eea2e8e00a3133869ed3462af5055d22c12e05480f3d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkzMmE1MGMyZTM5ZDNkYmY3MWUwOGMzNmMwNDZjZDQ1YTc0NDU3ZWE1YzA0NzlmYjYzZDQwNDFmYTk2YmEwMGEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM3ODk5Y2YxYzlmODQzNzQ2Mjk3MTM5YjliNDZhOTNiZjExN2IyMTE1ZWE5OGQzMDcyMmI1NzMyYjQxODc2OGUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAifQ"
|
||||
"resource": "repo://FrameworkTests/AssistantExecutionControllerTests.swift",
|
||||
"version": "repo-file-v1:sha256:40ea45f2c9460238030ad6c00ed2f9ac58ffdfbefbe7500d752238d97379a217"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L306-L336",
|
||||
"version": "repo-lines-v1:sha256:bf88b55c1f3fecac21ea3c56a99a2176e6666c75cde733f0cf4aef2414a158d6:eyJzZWxlY3RlZExpbmVDb3VudCI6MzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE2YjJhNzE4ZTA0YThkYjIyMWZkY2ViZjYyMzlkMzkyM2ZiZThiNzMwOTE0ZmI0ODgxYmQ0ZDcyMDNkM2ViNDMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjYTlmYWYyZWJmODlkNzUyZmY5ZDg0MzNhMTU1ODQ5YzIyMTA4ODA1OTA2OWU5ZGI0ODU5ODkxZDcxNDUwY2EiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQ0OGJmNTE3NmViOWRmZDcxNmVlZjIzYjMwMTU4ZTE1ZWVjYWEwZDM4NGMzMTczOTA4YjJiZGJhMjA2MjU0ODAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlhMWQ3MWNlZjc4YzMxNTAyYjU3ZGVjZmIyOWNjYzFiNDY0OTZhYTdkMDBkM2M2YzZlZjkyZDc1NDM3NDgwODgifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift#L516-L566",
|
||||
"version": "repo-lines-v1:sha256:edb46d8373b999cee1120d8ef9ef0cc3027c386590cbc8cbe77eed3d1d2d9086:eyJzZWxlY3RlZExpbmVDb3VudCI6NTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM3ZTZjOTQxMjBkZTM2NTQ4YzFmNzAxOTNjMzFjODQ1NDU4MjQ4ZDQzYTg3ZTZlNTQyNjkxMGZjZWRiYmU4YmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdmMjIwYzhiMTI3ODQ1YTBiNDdlOGI4ZDY5OWQ0YTZhZmQ1OTVjNmQwOWFjYjVmODliNzI2N2Y4MmQzMDc2ZTkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijc0OGI1M2NhMjYxZmM5ZWYxNWMzODlhZWRhMDRmODYxMWM3YjQ3ZTE4ZTYyMDk1ZDExZGY4OTBhY2MxZDhmNGMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIzZjQ3NzRkYmY1NmE0MTNhNmY3ZTUzNWRlYzdhYTU1NjRjZjcxNDIyZTJhMGI4ZjU5YWQ2NWMzYWZlYzE5MTUifQ"
|
||||
"resource": "repo://Frameworks/TermindApplication/Agent/AssistantExecutionController.swift",
|
||||
"version": "repo-file-v1:sha256:5d0e5c2bd75be53d73649916974145d847e8ffdd944a4f096192052d7a2b8078"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/AI/MobileAssistantConversation.swift",
|
||||
"version": "repo-file-v1:sha256:e61d288008796c0ae9c45ef3bb28166726d98128b950d303c6d5117f9d0d11a9"
|
||||
"version": "repo-file-v1:sha256:6c4e4f5657258dbbed75687d7bbb2dcf22751b2a80a1ac9298087cc996d8cd9e"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/AI/ConversationTranscriptView.swift",
|
||||
"version": "repo-file-v1:sha256:e25a6400fe10738ea7881664f6f1fc2465d7696d470dce522ef5222a3bb83fe4"
|
||||
"version": "repo-file-v1:sha256:0d485769d915e4ca05b84ad7acddab8ab7210e76f7e0b077ec7b0d575092fc01"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -895,6 +879,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:c9bc2c85241afa99871ff2b9d281f17d45acb8c76ef353b5c20844561140d378",
|
||||
"pageVersion": "sha256:49d4c96b5e9397c0c6e417bd17e4747f23d72190fbba7da9f191fe57862801f2",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_70c5c3da992944188e719c65adc9b06c",
|
||||
@@ -97,28 +97,20 @@
|
||||
"statement": "Free access retains the ordinary remote-workspace experience and the first three Metrics cards, while protected callers gate assistant execution, terminal drag/drop upload, remote MCP operations, built-in MCP server availability, iCloud synchronization, and Metrics beyond the free limit.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L525-L545",
|
||||
"version": "repo-lines-v1:sha256:aad17fae07c748996e66ae9c9cbe627c73d6f20ebf16ca6ed7e0c7a56fd8b2fb:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE3Y2E3MWJkZmM2MGVhMzNkYWQ0YWI2NmNkYjBjNmM5MjUzOGY1NDA0NjRkYzY1OGExMTkwYjUyZTc3MGUyMmYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg3YzFlN2NkMjk4NDdjY2ExY2U2MjE4ZWQ4ZGRlMDJkYzFiMTIzMmFiNWE0OGZlYzVjNGU5NGIxOWYzYThlMzkifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Settings/MobileMCPSettings.swift#L43-L52",
|
||||
"version": "repo-lines-v1:sha256:6a4e61aaa27af6fad81a3403faa2d30b6a4709b33cdc3ebf056d086a4d768937:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE3N2E2YTA3ODhiODFjMDQxNjFlMjBlYjgyYzdlMGZkOGIyNDVmMjY1YTJjZmJmMzg2ZTM5Y2ZlNThkOTczYjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYzM2M5NjlhOTU1ZTc3Njk5OTFiNjYxMGY4NDY5ZDMyZTY3OGUyM2Q3NGJhZGZmOWQ5NDRhODhhN2VhMDA2NDQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYxNDRmOGIxNzcyZWYwYWU4NjA2Y2ExZjU4YzQ1YjkxZTdhZmQ1N2U3YTM2MGVhYTlkYTA3MjhkNTIzZDhlZWIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYwOTM0N2Y3MmNhYWI3ZmU4MTVhNzcyMzhkM2UzNWMzODY0NWJhNTRmODZlYzkwNWEzYjczOWY3MzcxNjFjMmQifQ"
|
||||
"resource": "repo://TFI/Features/Settings/MobileMCPSettings.swift",
|
||||
"version": "repo-file-v1:sha256:24ce8cf989678c83735ded1f77c24fa726ca7beb9009a61d14285c334f3c1029"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceView.swift#L555-L562",
|
||||
"version": "repo-lines-v1:sha256:20dc4bdedc36e2b39f1165283a7a67ebfe15a542f847f3d50d22db4d8ea43359:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZWFjMDVhNTBmMWZkOGZmMjk3YzNiMzc3MzUzMzVmNTIyMmU0MGRhZmNmOWVkNzVkZTQ1OWExOWY4MzZjOGNiOCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZmYwZDc1OTUwZGYwZmY5YTNlZTk2NjM5ZGNjOGZmNWVhZWRiNDBkNjgyYmVhOTI2MjJiNTIwZGQ4ODdkOTNlOSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMzdkNGU2ZDRhZGY1YjUzNjlhMDI0MTUzOTcyNTJhYjZiNDY4YjBhYTdiMjVmMDFkYWIzM2Y2NTFhZTI3YjU1OSJ9"
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspaceView.swift",
|
||||
"version": "repo-file-v1:sha256:581f46fd0bf35b780a3bef34663dd8db63ad36ce5decec0c887fb6675846da23"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L168-L175",
|
||||
"version": "repo-lines-v1:sha256:f0d53660f430dd84f87f5307a7fc14c2a5ed098451023878a8e6bc11d839b7e1:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzhlNjlkZTAyNmJhNzY5YmNhODkzZmM0NDRiYTliYWM4NTRlNGZkOGI0NTQzOTUwOGZjOTI3N2UwMTljZTBmMyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTUwMzJlOTY0ZDA5MzIzNTFlNWQxODUyNjkyODFiMTcxYTNhMDliMDhiMjg2ZTY2MWVhNDcwMzIzYzgyZWI0ZCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYmNkZWYwY2Q0Y2QzYTUzZjgwMWYxMGY1OWIxMzliNGE0NGE4YTM4ZDMyOGQxODY2ZWM2OThkNTk5ZTE5NTdlYyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOTRiNTdmYjk5ODgxZmRmMmRjNjU1NWQ0ZWM5Y2FjNTdlMzY4ZTYzYjdkYjFjYzMxZjFhMjliYzQ0NmVlMzdmMyJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L232-L239",
|
||||
"version": "repo-lines-v1:sha256:5fbeb435765ba0be31a7f6c42307b4a81b0525e439fc511ecfd9168f309a9097:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOGEyYWQ1MjgyOWE0NDM4NjVhMDI3NTVjMjQ1ZGFhZGY5OGViNTAzMDc4MTdmMTMyYTBkOTk0MjQ4NjIxMWJhNyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTkwOWE1M2E2MThkMDI4ZTFkMzAwMGMwYTdhYmNlZWNiZTVmYjM3ZjRlNTExZWZlNDY2NDNmYWQ2ZTY2ODcyZiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZDg4ODAzZDYzMjJmZDM2YjkyMTExMWNlZTUxYjJmNjZmZWRjNjdiYWRiNDk1ZTFlZGNiMDc1ZTc0MzA4NmY2ZCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNzBkYTJjY2ZmZmI5YzRlYzg1MjMwZTk0MzNkZWYwMWU0MjFhYjgyMmQ3YjllZDBhMDhjZDMwYjA4ODhhYmQ1MCJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift#L328-L348",
|
||||
"version": "repo-lines-v1:sha256:7096d285ae42140058f24ec8ba1a2d2d229718f0ae7a3d5bc1f7a8dc85101d80:eyJzZWxlY3RlZExpbmVDb3VudCI6MjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY3MDMyZjUzOTcxNDA0YjMxMjM2MmZkYmQ5MzlmOGRlNjYzMGRiNGVhNTQ1Mjk5MTUxNDVlMjNmY2RjNTc0MGMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdhNmVkNDJiNDliZDBjNGNkMDNiZmMwMzRkNzZiMzI2NjliZmYwOGYwOTE5OTRkMDUyNTIwODllYmEyNTEwNWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY5MWEwM2RhNGM3ZDMxZDk4YjI2YjJlYTcyNzg0YzlkOGExNjEyOTE3Y2RjZmE0NjBkOWEyYTZjMDQxODg1NDUifQ"
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -127,20 +119,12 @@
|
||||
"statement": "Native platform views own paywall presentation: macOS elects a single main-window sheet owner, while iOS presents `MobileProView` and uses the system subscription-management sheet; both views purchase through the shared controller and expose restore.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Commerce/MobileProView.swift#L14-L41",
|
||||
"version": "repo-lines-v1:sha256:23c7bc4783f04b1326da5618d9d292fe69931e3a41d8da9a3a307f8155d33bd1:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk4MjFmMTM3MGVjN2JlMThlNDBlMWI1OGE2NGMxZGEzMDY0ZTk2NTUxZmUwMzdiNTE0OGJjM2JkZWI4MTliZGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijc1YzZjYTI4OGM3NzFmN2NlMDJmZWFjOTRjNTMwNDJkN2QyMDljZjA0MTk4MjcxMGExN2RhMmNjYjgyMGNlN2YifQ"
|
||||
"resource": "repo://TFI/Features/Commerce/MobileProView.swift",
|
||||
"version": "repo-file-v1:sha256:a6bcd18131ccf3aa515989d29ae5cfde8d16098aab12e7b75047df9d60ca6893"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Commerce/MobileProView.swift#L97-L155",
|
||||
"version": "repo-lines-v1:sha256:a41d31b277d4d4152f1ed25e49a8429ce8de6905dbf6d6e4baece1a74304f2a7:eyJzZWxlY3RlZExpbmVDb3VudCI6NTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI1N2U2YzM3M2E4NmNiYzcyYmVjNTMzYTNlMjUyZDk5MDQyYmU0ZWMzOTc0NzdhMTg2YTkxOTQ1MzVkOWJiYzAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkzNTExZGY1YTFmMzExNjNlMmViMzBiNmM2Y2Y3NWMxZGEzNjljYjRjMThlNmYzMTJmYzgxMmJlOTZiMjdlNjAifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Commerce/ProPaywallView.swift#L207-L237",
|
||||
"version": "repo-lines-v1:sha256:46278fe2efd2619743b5627d51fa5f712932b91efff90e0689004a2b011be61e:eyJzZWxlY3RlZExpbmVDb3VudCI6MzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY3NTYzODYxNjFmN2ZiOWMwZGU0MWVlMWMxZmU1MDM4MmY0YThiMjZlYjFjM2Q2M2Y4MWYzN2ZmOGQ3YjY1NDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Commerce/ProPaywallView.swift#L52-L109",
|
||||
"version": "repo-lines-v1:sha256:40e56387488240ca3eba78f2b0403ee5b5451828f3ac9e6bd8f25d10e0c19a05:eyJzZWxlY3RlZExpbmVDb3VudCI6NTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZiYTU2MzIzNTNhZmQyYzk1NDZlODZjNGE0ZjRiNzhlMWNjOThkZjJlN2Y0OWY2OTBjNTQ1M2ZlOWE4NzRjNWQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYwNThmNmQ1NWJjNWQ5OGMzYWQxMTA3ZTQ4ZmQyMGMwNDdlYTVlZjA1OThjNjYxZWEwZmEzZmE4MDhjMDU5M2QiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImEwMmYwZjZmYjFiNzQ5NzAxZWNmYzVmYjljN2M5NTIxM2YzMjhkMDlmNjA5MmJkODUzZjc1YjBlZWNlNmJhMzgifQ"
|
||||
"resource": "repo://TFM/Features/Commerce/ProPaywallView.swift",
|
||||
"version": "repo-file-v1:sha256:2cf5d5d72ef8f9f6722d437960a0314057b7b8641c0ff5f2c0ccd789ce8c2f12"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -171,12 +155,12 @@
|
||||
"statement": "App localization is centralized in `Frameworks/Resources/Localizable.xcstrings`; every changed English string requires finished `zh-Hans` and `zh-Hant` translations, and the localization check rejects invalid catalogs, missing or unfinished translations, and Chinese spacing violations.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md#L46-L52",
|
||||
"version": "repo-lines-v1:sha256:ee3248e602d379f9dec697411865c83301ec4b03165ce02b62dfae384112d63b:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiN2ViNmVkNjM3YmU2ODNjNzYxMmY2NzdlYTllMWE1NmI5NjU5OWU3NzJmNmQ3NjkwYjQyMzc0MGNkMTRhZmZmNyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNTAzYWFlMjllMDYzMTZkNmRhNmY4YzJhOTFmNmU0NGE2MTJmYWJkNzkzYWQxZjVhMWZjYTUyMDZiY2VkYTQ3YyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNjZhNzFhZDgxY2FlOGI3MGJiZDYwMzkxNzllYTExZmU0OGExODY0YzdmMDcwNzU2MDQwYWJlOTYxNmVhNmMyYSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZWIxYmM1YmM0YTIzN2Y1NzhlNmFmNGE0MTVkMDY0N2Y5OTEwYjAzYjM2NGUxZTI3YzFmMWRiYWE3NDNkMDNiYSJ9"
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Scripts/check-zh-localization.sh#L5-L65",
|
||||
"version": "repo-lines-v1:sha256:67cab4f2004a6fc46d722a29d6b97cf17726952b1f426ad5215bbc22494a3e9b:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRiM2ZjMjU5YmQyZWU2NDYyYzExYjZkOGUxNjZkMjU4MTVlMjNjNjkzZTA0ODRjOGZiZWQ3OTRmOTJmODI3ZDUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMzOTljNGUwYTRmNDI2YjhlNDA4MzZiNzc1YmUyYWJjMmU3Njc1YTcyZWQzN2UwOTBhZjA2ZTVhYTc2ZTNhNTIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImExOTg0ZjI4NTg4NzhjMzQwMjJjYzU0NDQ0NjVjNGY1NjczYTE0ZGVhNGE1N2E1NmRiZTdmOTA2M2E2ODQwYzgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
||||
"resource": "repo://Scripts/check-zh-localization.sh",
|
||||
"version": "repo-file-v1:sha256:305b4c1458a71783b51720861f2a4a1452bd28a8b9478ddae38b4c775f52eb97"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -291,24 +275,20 @@
|
||||
"statement": "Both native paywalls derive trial and renewal copy through `ProOfferPresentation` from StoreKit's validated annual product and eligibility, falling back to an annual subscription without a trial if the offer is missing or unavailable; an unavailable plan cannot be purchased.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindInfrastructure/Commerce/ProAccessController.swift#L233-L276",
|
||||
"version": "repo-lines-v1:sha256:f66e990185bf8759d93b651499e5d173859cc340e345e6edba3abbf5715ed941:eyJzZWxlY3RlZExpbmVDb3VudCI6NDQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJkODA2NTg5YjQ0MDNmNDUzMTEzMDVhZjY5MzQzMGUzMzk3NTE2NWViNDc0NjM0YzA0YmE4YThmNTJkZThiNGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImNlZTUwNDAxNGQ1NjFjNDYxYTNmZTgyNzUxNTY1YTI2N2Q1ODIwZTczOWRjZmY3YTVhNDdiMGEyMDJiYjM4MmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRlYmRkM2IwMzE3YzAzODcyNTJiZjc4ZjcwOGU1ZjVlOWQwMWEyOGI0YzE3MjhiNWVlZTM0Nzk3ZDkzYmRiZTYifQ"
|
||||
"resource": "repo://Frameworks/TermindInfrastructure/Commerce/ProAccessController.swift",
|
||||
"version": "repo-file-v1:sha256:183451c066b1cd740d3d30fce8d3bae5b981ec65fd5d56fec667abf80839c053"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindInfrastructure/Commerce/ProAccessController.swift#L32-L47",
|
||||
"version": "repo-lines-v1:sha256:703045e28f12924d2dc7b05569bdc9b0d47d35be6264aabdd3c835f4113f6f0e:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ1YjQ0OTYxYmNlNmI5Y2E5MGRhYjNmNzU5OTM3ZGM2ZTU2YmIyZTkxNmZiNWU4NmJmZjc1ZWY3YzllMzRkZTEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBjOTkxNTM4NTA2Y2ZmYWNhM2MzZTliYjhjNThkY2Y0NTBjMzFmOGZlN2FiN2ZmZTUwNjk1MTBiNjA0NjMwNDQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImQ0MTQ4Yzg4MjUxYTUzM2M3MjFmNDYxOTI1YjIzMjNhOWI2N2QxMTcxZDNkY2M0NTBhN2NjYWM5ZTA3YmEzNzIifQ"
|
||||
"resource": "repo://Frameworks/TermindPresentation/ProOfferPresentation.swift",
|
||||
"version": "repo-file-v1:sha256:42aa3b8a9a279c72d7f6a57504a3d87e43cdaaeccebb0051a272b19c2229d35d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/ProOfferPresentation.swift#L10-L55",
|
||||
"version": "repo-lines-v1:sha256:899c660fb5a61583fb1427a0c77b7674254d09aca6aa063583409d537e7a1d1d:eyJzZWxlY3RlZExpbmVDb3VudCI6NDYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVjYjc4YTBhYmU3YWE5YTA1YmY5NDJhYWZhMmQ0Y2Y5NjQ0ZTVlZDc4MjAwYTcyZTYxY2EzMDM1YmU5ZTc2ODAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYxOTc0YjQyZmE3YTA0M2Q0Y2Q0NTIxYzg3ODYwMDhkMDM2YWIxNjY3MjkwODUwODYzZDdhNDFjNmRjNTc0NzMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQxMzhhY2VhNDZjMjMzMjEzZjFiZDc5MWEzMWQ5YTFmODMzOWE2N2RmOTIwMjQ0YWYxNjhlMWRlMmI2NzQyMjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoyLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM3OTRkMDJhODEyMTk0NGQxNzZkMjY1ZTliYjljYzU5ZjZhYjg5MGJjYWRmOGFlZmRlYmRiYmI0ZjJlYTg0NDQifQ"
|
||||
"resource": "repo://TFI/Features/Commerce/MobileProView.swift",
|
||||
"version": "repo-file-v1:sha256:a6bcd18131ccf3aa515989d29ae5cfde8d16098aab12e7b75047df9d60ca6893"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Commerce/MobileProView.swift#L97-L123",
|
||||
"version": "repo-lines-v1:sha256:f09e3dd33e7d34d5a2f33e09661df8d00f274a5d285fa2b3a6ffef78fddced25:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI1N2U2YzM3M2E4NmNiYzcyYmVjNTMzYTNlMjUyZDk5MDQyYmU0ZWMzOTc0NzdhMTg2YTkxOTQ1MzVkOWJiYzAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBjNjQ3OWNjMjMwNDQwZmQ0MWU4MjI0MjE4Njc5Njk4NTU5ZDI4OTNiZDY3YjQzODBhZmFiODExYjM4YTU1YWEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjVlZTdmOGE2YTdhYjFlZGQ1ZWE0NTczZWYwM2E4MTk4NmNhZmM0YzBmZTgyODM5NWM5N2VhYzAwZjA2YmRiM2MifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Commerce/ProPaywallView.swift#L52-L90",
|
||||
"version": "repo-lines-v1:sha256:3ba4af54585a578373c1b087486e1df70cd0a464318cf188121413a68b428513:eyJzZWxlY3RlZExpbmVDb3VudCI6MzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZiYTU2MzIzNTNhZmQyYzk1NDZlODZjNGE0ZjRiNzhlMWNjOThkZjJlN2Y0OWY2OTBjNTQ1M2ZlOWE4NzRjNWQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdhNzIwYjc4NDFiMTViNWM3NWZmN2MzZmJhYTBiMDg1NjhhYTUzYjMzNmEzYjUzMjkzMjQ5ZjZiZWZmMmRiMjAiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYwNThmNmQ1NWJjNWQ5OGMzYWQxMTA3ZTQ4ZmQyMGMwNDdlYTVlZjA1OThjNjYxZWEwZmEzZmE4MDhjMDU5M2QiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE2MTkyOWE2N2QyZWVmNzM1Y2UxYzFmZjQ5MzcxMWY0OThiN2FiYzE5NjI5MTVhNjhhZDI2ZmJlNGM4N2YyMTcifQ"
|
||||
"resource": "repo://TFM/Features/Commerce/ProPaywallView.swift",
|
||||
"version": "repo-file-v1:sha256:2cf5d5d72ef8f9f6722d437960a0314057b7b8641c0ff5f2c0ccd789ce8c2f12"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -317,16 +297,12 @@
|
||||
"statement": "`AppLanguageTests` verifies Pro offer localization in English, Simplified Chinese, and Traditional Chinese, and checks that both app string catalogs have finished Chinese translation units.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings#L4880-L4894",
|
||||
"version": "repo-lines-v1:sha256:ae374ff3abb4f81ab4bbdd99d2d00beafd5474c4d23499eb6ffc2eb68398e534:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIxMTc0NjExZWI2OGY2MTg0OWYyMGMwZWY3ZjJlYzBjMzhmNThiYTM3YmFlZTdjZjY2ZDA1MWMxNDdjNTE0ZDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg4MDA1ZDU3MTA2YTM2MmViMDAwZGFmM2RhNDY3NGM4MmI1MThmZjVhMmUyZjY3ZWU4ZTc1N2EzMzNjMmFmNjYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJkODA0ODIyZGE3ZmE1MTJlNmJiYzJmOTgzYjFhNmQ3NTM1YzMxMGMzMmJkYjg4MmYxYmFkOGQ5NDI2NWE0MmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFlZGIxM2I1Yjg2YjY1ODI3ZDczMDA1ZWZlZjJiOGFhMzVjYWQwZWEwMjU5YzQxYjgyODcyNDNjYzBkYjEyZDIifQ"
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings",
|
||||
"version": "repo-file-v1:sha256:90f5f9cd26e6974a00c7ce9c688e2bc3de33de2a02cf0012e0d9472be0b3fd48"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppLanguageTests.swift#L102-L121",
|
||||
"version": "repo-lines-v1:sha256:fae989108063e22cf05ff8739ed2a75708aa77e9a3638b94c4c539f908658bcc:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMzZDliM2RlM2MzNjAyMmZlNmI5YmE5NTM4Y2I3ZGVkZGY1NTkzNmEwMTE2Yjg1ZTZhZjA4ODFjNmE0NjA3MjgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBjNTEzMGE3ZDBkNzM0Mjk0Mjk0ODhkNmUzZDE2N2ZmMzkyNjE3Y2ZhYTYzZjliMTk2MTUwMDEwYWE2M2MxZjcifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppLanguageTests.swift#L136-L161",
|
||||
"version": "repo-lines-v1:sha256:751ad8bf416d907a0bf5b4b4fecfbf6ae46b94ec1a2caa251ebcffcc1defdc48:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVmNTdiNzcxZmRhMjU1Y2ZkNDE4NTkxNDQxMzhjNWU4NDg1Njc4YmMxZDFhZGMxNjdhZDMyZmE3OTEwM2NhNmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAifQ"
|
||||
"resource": "repo://TFMTests/AppLanguageTests.swift",
|
||||
"version": "repo-file-v1:sha256:a87e1a9c1edef71dacdd135cda2b3772e2e6eccfb3d07d42934c9ea04400920e"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -353,20 +329,12 @@
|
||||
"statement": "On iOS, Vault and Vault search open Snippets and Known Hosts with optional initial queries; Known Hosts distinguishes empty library from empty search results, offers add from the toolbar and edit/copy-fingerprint/delete per card, and selects add versus edit editor title based on whether the entry already exists.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift#L14-L86",
|
||||
"version": "repo-lines-v1:sha256:eb63aa1a7b1b6940a0cbc90635756972afe9cfa93891c545fdd63dfc21405ac1:eyJzZWxlY3RlZExpbmVDb3VudCI6NzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIyZjZjMmM2NWMyNjM0NDUyZTNiM2Y1MjZhZGY2OGYzY2NlNDU0ZmQ3Yjc3ZjBlOGMxMjQyNWQyOGM2YjRkZDMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjU2MDdhYjM5N2ViZDE3NzRiY2NmZjJhYjgyZmEyMGFhMzVmYTExNTNiMjE4ZDJiODZiYWJkMzQ5M2ZjZjZjYjAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFkZTY3ZmY5NzJiMWUxZDk5Njc0OGE1ZTczYjM2NmY5MzU4NzZiMDE4MGU5NmFlYzI4YWJjM2UyZGVmZGQ1OWMifQ"
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift",
|
||||
"version": "repo-file-v1:sha256:fa8263ae0b73e44ebc464500c12d7b4d05158c8a9ccf45f2d8fd85c82c4b0fa4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift#L89-L115",
|
||||
"version": "repo-lines-v1:sha256:d1a44a27ac3797ad7fcffda5b84ea41d412fab02a18098a95f6fb13c8f4f0180:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM3OTJkZjUxMDBhY2FmNGJjZWI1YWMxNDljZDI5ODEwYzFhNTc5YmU1OWIxNjIzMWVhMjA0NDgwY2M2Mjg5OTQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQwOTNkY2UwMmZhM2U1YzBiOGMxYzg2YWM2N2U4NzYzZTNhMjQ5YWFhZDAxZjlhOGVkZTJkNjcyNzE1MGJkNzgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ5ZWNmZTM4ZjNhZTg0NDhkNTg1NTZhZDEyNmQyN2ZjOTUzZDcxM2I1ODRlY2Y1OGQ3NzAxMWNmYzE1N2QxNDYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L580-L588",
|
||||
"version": "repo-lines-v1:sha256:5f46640a1644ee65ad1f1cf34d92c291010f3d3e3686c3c6fc942d9de4d44975:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNWQ4NWVkZGVlMjMwMGRkY2MxNjU0YjkzMTc5ZDUzZDRjMTFhNmMxNmFhOGVmYWM3YjFiNzFiYTAwNGFlODkxYiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMmFhMTU5ZDBiMjYyNTI3OGFmODE1M2NkZGI5YTVlMWJmOWY4ZWZmOWNlMGZhMzBjZGNkMTAxOTQ2NDBhMWZjOCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiM2I5MDRkNGQwMTQyMzEwYTYyMzU4MDA1Y2M5NTk2MzM4ZjIxOTk3Y2MxNDQ4ZGIxNGU5NTdjYzlmNzAwM2IwYSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNTBmOWQzNWY3MTAxOTgxMTA4YWVjMTg0MDU2YTBkYTE5YWU3N2M1NDA1ZDMyZGJmMTUwODE5ZWU5ODZhOTAyMCJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L636-L652",
|
||||
"version": "repo-lines-v1:sha256:30dfd942b6f2dcce677637aee4f43978ed7679dbe0396f106be48f5eed004b1a:eyJzZWxlY3RlZExpbmVDb3VudCI6MTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYwMjA0MzJkYzQ3NGFmN2VmY2NlYmMwZTQ1ZDAzYzIxYmM3OTY0ZWMzZWY5NDE2Zjg5NmRlMDVlNmM0ODAzMzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImViN2FlZjQ3MDkxZDE0ZmY5MTVhZDFmMGM3MGY5MDYyMmE3ZDYwYTk1YzQ2MjFlNDVjZGQ2NzhlY2Q1ZDE1YzgiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJmODgyYWVkYTYxNWI3OTQ4OWEyNDNhZjgwY2Q0NzkxYjU2NzViOGY3MTE1YjIyNGJlYjg2MDIxNjIzMTUwYzcifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -375,20 +343,12 @@
|
||||
"statement": "On macOS, the Known Hosts empty state offers import or manual add; deletion has singular/plural localized confirmation text and warns that deleting trust means verifying the server key on the next connection, while editor labels distinguish adding and editing.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings#L8325-L8339",
|
||||
"version": "repo-lines-v1:sha256:b30193645f18967afc32bbb2dc3133b4d865901edf8c6f708341182649ecfd81:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE2ZmY2N2Q0OGI2N2YyYWI0ZWZjY2RmZWMzZjU2N2Q2NzkxZDdhZDNkYmY1NjA1YjQxMGJkYjBiZjk4YTFiNjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjliNjJmNjBkODU5MGE1NzljZjQ2ZjhkNjczNzhjNGM1NzJiOTYyY2VjY2RiOTBjN2E1ZjdiNDJiOTYwNzgyYTQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg0NmVkNmFjZjVmNjkxZGFlZGJmMTc2ZDMyZTAyZjhiNTIyNjgxZmYxN2M5ZDY3MDk4MzY1YTMxNzUyNmY1NjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYyNjIwN2UxOGU0ZTczYmIxZmFiZDUyZTFkZDAyM2E0MGM0YmY2ZTBkNjE4MDZjYzhiYWIwYjcyNmVmZTU4ZDQifQ"
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings",
|
||||
"version": "repo-file-v1:sha256:90f5f9cd26e6974a00c7ce9c688e2bc3de33de2a02cf0012e0d9472be0b3fd48"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/KnownHosts/KnownHostsPageView.swift#L189-L213",
|
||||
"version": "repo-lines-v1:sha256:dd117dbfada691588176c2a6ee440f3424f636b99349917d8c59d9c6be29e9bf:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJiMjRjYjUxYmRmZDdmYjhlM2RiNzJlZjkzY2NiYWU1NWYzZTAxYzMzY2ZiZjNiZjNmMzczNmMyZGU1ODI4NTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjUwZGM5ZjIxZmI0Y2NlZGJlNDE4ZTlhNWQ1ZmZlZmI5ODdlYWMzZGEyNTE0NDE2NzFmMTQyMGU5NmNmYjRiZWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFhNTlmYjgzOGViZWJhYmZkOTU4NmMzMTljNzVhYTgyNjhmYmEzM2M2YWU0MWY0YzkyNWY2OTA1MTIwZDA5YmMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/KnownHosts/KnownHostsPageView.swift#L243-L248",
|
||||
"version": "repo-lines-v1:sha256:06c814d48d9c01b1cd4170904b441be3f9a491ac981a87268280015ebc26e195:eyJzZWxlY3RlZExpbmVDb3VudCI6NiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZjQ2M2M0ODc1MWI5MzQ3NDUzMjU5Y2ExYjFjMjViYTUyNWViNjdhYTJkZjUzMGRiZjM3NTI0ZmYzNjMxNTMzZiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZTZiMDQ0OTE0Njk3MjJlODM2M2E5NGU0MDQ0NTM4ZTAxM2EyYTIxN2UzNmIxZTU2OGJhNjBhY2I3YjRjOGYyZSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNDJlOTEzMjAwYjAyYTY1NWY0YjJmODk0NDk2ZWUxN2IwMTUyMzYwMjQzYTRjYjk5ZTE1NmI0MGUzMWExZjhiMCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMDRjNTgwNTczMmNmMzAwYWI0NmM4YzRkNDBlYzZlMzU2OTAwMmMwODI1ZTEyNzhhZmVmZmNhMjg5ZDIzNDg2MSJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/KnownHosts/KnownHostsPageView.swift#L72-L100",
|
||||
"version": "repo-lines-v1:sha256:367f80786d8d99e5269edfef2faf2bf1d55e0f022a710ff27bb7cd6e9aa717a1:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjEwZWMzNzc0MTEzOWVjOTg2Y2Y0MjMzYjE5MDJkOWU1M2YzNDU1OTI0YTBiY2E5ZTk1MGFiZDFiMjEwMGEyYzgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAzYjQyMWI4ZTA2OTJiZTMwYzUyYjQ3ZTJhODAxMzNhYzMwNGFkYzY2MDlmYzM1ZDJkOGRhN2U4MzlkY2JjYzkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjI5ODEyN2E5ZjRkMGJiNTQ5MDAzNDI0ZTBlZGQ3MmNkYzQ5ZThhNzY0NjU0N2MzY2VlNjZhOWYxMzU2NGM2M2EifQ"
|
||||
"resource": "repo://TFM/Features/KnownHosts/KnownHostsPageView.swift",
|
||||
"version": "repo-file-v1:sha256:27718a0dd715497708818b0d88d2f6861a1d7e9544490f109e36fe55f1fc1927"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -397,36 +357,12 @@
|
||||
"statement": "The mobile Snippets surface separates empty-library from no-search-results states, offers creation of snippets, packages, and nested subpackages, and offers either deleting a package with its snippets or keeping snippets; package-tree count copy and these creation labels have finished Simplified and Traditional Chinese entries in the shared string catalog.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings#L16421-L16434",
|
||||
"version": "repo-lines-v1:sha256:6c40e495346a66850cf16d9f6728aa2b30697fd84d10005cd0eeac4a01bf8539:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgwZWJjYWM1YTliOTE3ZGY2YTgwODk4NDQ2YTljMmU1ZjA3NmZlY2Y5YjNkNzUzYjkwMzhmODczMTE0YzRmYjEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg0NmVkNmFjZjVmNjkxZGFlZGJmMTc2ZDMyZTAyZjhiNTIyNjgxZmYxN2M5ZDY3MDk4MzY1YTMxNzUyNmY1NjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU4NzI5MzE0ZmQ4YTM4YmM0NjE2OTExMDkzMDg5NjlhZDY0NjQzMzE0YjJlZDcxZWEzNmQ5MGE3NmNkN2Y4NDQifQ"
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings",
|
||||
"version": "repo-file-v1:sha256:90f5f9cd26e6974a00c7ce9c688e2bc3de33de2a02cf0012e0d9472be0b3fd48"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings#L16454-L16499",
|
||||
"version": "repo-lines-v1:sha256:b2c36993f1d06bf6c488b1f9ae21c6eea09333828d29121dd249d7728eb48f2f:eyJzZWxlY3RlZExpbmVDb3VudCI6NDYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI0ODNmODJkZDkyYzE1ZDZkZjUwYzU2NWJlNWU0NWQ1ZGMwMzc3ZGM1ZjRlMDYxOTlhZGQyYjU3NjA5MGVhMjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg0NmVkNmFjZjVmNjkxZGFlZGJmMTc2ZDMyZTAyZjhiNTIyNjgxZmYxN2M5ZDY3MDk4MzY1YTMxNzUyNmY1NjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJiZGU0YzcwMDcxNmJmYjliMmNiY2NiNGFjOTMxMGE1OTk0MmI3Zjg5ODcyMzlmZDA3NWJiYjQ0MTRmMmYyMDMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/Resources/Localizable.xcstrings#L28997-L29011",
|
||||
"version": "repo-lines-v1:sha256:7380e8f467909347288c95b4b0428ee86bb44554ab0b381cb57af255d4a7c2da:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkxYjIwYmU0YjA5ZWEwMDI4NWQ4ODBjZWVlYmQ0YTNhODFlZTM5OGVjNmNkNjI3NDliMjA0YjQxMWQ4Y2E2YjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjliNjJmNjBkODU5MGE1NzljZjQ2ZjhkNjczNzhjNGM1NzJiOTYyY2VjY2RiOTBjN2E1ZjdiNDJiOTYwNzgyYTQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijg0NmVkNmFjZjVmNjkxZGFlZGJmMTc2ZDMyZTAyZjhiNTIyNjgxZmYxN2M5ZDY3MDk4MzY1YTMxNzUyNmY1NjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY2YzkxOWZmNGY2OTk1OGVjOWMxOGI0NjE3ZTAxYmFhMDg3NDhkOTRjZjkxMTI1ZmZmOGMyOGE4YWQzMDViMmMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift#L141-L155",
|
||||
"version": "repo-lines-v1:sha256:2e52362dcab9a2f7b6a44b0fc9291918703c3409cc2e6e2e391dcd47490a860b:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZiYTYzZDkzNmVmZmQxZTZiYjIxMjI0YjA1NmFmNjdiM2Y2MjNiNzNkNDVhZjhkN2FjZjc2NWM0Nzg1YmVhNjIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE4OTU1YWEzMWRhMmQwNDYyNjIzZjZjOWVhNzFiZDc2ZWE1NmQxYWE2MTViZGRhMmFlZmQ3YzA1N2VhNTIwOTgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRlOGQxZDVlNjk5YzI0ZjNhZTk0Yjk2MzZhZTk1MzE0Njc3Njc4Mjk1ZjQ0YTUxYmExNmZjMDhmNGE3MTViNjQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift#L180-L195",
|
||||
"version": "repo-lines-v1:sha256:8ccf0dc95c02f78777ed9a12826a9b0b973f8951771e734bac70783c8bad0b46:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjNTUwNmNjYzg2NzY3ZDM1ZjBjMjk4YzdlMzkyMjU3MjhiYjg4NmJmMjYxN2Q4ZmUzNzQ5NmNlNjI4OWYzNjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMxYzUzZDM1YTgzMzNhMjMwNDFhNjQzMjJmYWYwNmU3NGZmODBlYzYyYmQ1OGEyOGI1NjZjZDMwM2RmYTBjYzYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift#L219-L235",
|
||||
"version": "repo-lines-v1:sha256:2e54cffa1cbb29b3d600ea9dbb7dd005fac89c99463a853a21e41db1e09202b1:eyJzZWxlY3RlZExpbmVDb3VudCI6MTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU0NzJhOGE4MDI3MDRhZmNhMDFkMzA2ZmJjYzkwMWJhMWQzMzAzMTQ0OGIyMDg1YWEwY2E1ZjkzZTY5NmU2MmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM1ZjZjMmI0YzNlZmI4YTUxZGVhNjYzZGVlMmQ0ZTczNGI4MTk2M2Q0ODkyMDdhMjU1YjZhYmU2YTA2ZWM1ZDUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjRjOTEyNDk4N2JmNmNlNjY1M2EwNjkzYWY2MzFkOWRmYmVhYWQxNjFiMDE0NWUyNzU4ZmViMTNmNDdiMGE1ZmMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY4YThhYjM5M2JmYjY5M2NiYzAxMDAwNDdhZjUzYWY3YWY0YjMxNzg1ODZmOWEwZDZhNjBjMDNmYjQwYjg5MjEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift#L337-L349",
|
||||
"version": "repo-lines-v1:sha256:0eabe1eeca028a6aa8fcf1e46bb7c7790202725a9c9b6cd84c74491f5b4b573a:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZmMDgwNDY4M2FiNDA4MWU4ZjVlODhmNDJhZGVmNGYwY2UxMGRjOGRjOTUwY2JkOTQ4NGQ3OTdkNGZjYWE2YmUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE4Zjg1NDZlNDMzZDc4NjQzODA2NmJjNjllMDg1MGZlNWIyNjU3MDBmYzBlNDM4ZGU4MWRiM2ZjMTJiOWM0ZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBkYTg5MjlkNTc5MzFjYmIzOTNlNzNlNGYxNjM5ZjQ0NTg4MjUwYTFlMmM4ZDI3NzY2N2UwYmUxMDdmZTdmMGUifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift#L59-L95",
|
||||
"version": "repo-lines-v1:sha256:905b85c88fbc967381dd93d5491254ae70939a1009566d440f798976b5d13b99:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVkOGZmZjY4MDgwNGJkZDg1NjgzYWU5MTc5YzNlNTdjOGUyOTdlNjM2YjI0MjAzNTJlMWQ3YWJlOTc0OWVkOGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjkyN2FlYWRlOTVkYmRmZDdkM2NhZWVhZTc5MmUwZWMzMjQxNTE3YjA2MjYyNjA4M2ZlMzYyMzRiOTQzNjg2YTYifQ"
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift",
|
||||
"version": "repo-file-v1:sha256:1ba5269491357e2fc2677b2c69d987d9a144ff0d26589f481ff7161aceb27032"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -435,20 +371,16 @@
|
||||
"statement": "Known-host and snippet card relative timestamps use the SwiftUI environment locale, while host titles, package paths, snippet titles, and script bodies are record content displayed directly instead of localized catalog keys.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift#L35-L50",
|
||||
"version": "repo-lines-v1:sha256:8772c331061a6f33903a40129bf721838ddcd5f2faff405df623fe2923d0db6d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA0Y2IzN2Q5YTZiMmI1NTViYjllYzgxNzQyYTRkMjVhY2QyZmM3ZTFlOTgwYjM4NmU3NjQ4ZDllNTFkY2JhYzgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdmZjdiMzliNGJkMzBmM2VkMWYzYjVhNDhhMjg2ZjYwNDBhZTc0OGNkNDA1MzlmNDJhNDZhZjA4ZjA0OGU5MTIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU2YzdjNjA3MmM5M2I2Yjk5MGEyMzAxNTRmNGUwZjU1NDJlZDBiMzAwZDEzNWQ3Yzk1NGZlOWViMDgzMmM5ZGUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJhZmQ0YTBiMDUxZWYxNTAwOTM1Zjg1MWUwZTE3MTRmOTBmMzFjMzM3NWU0OWYzNThmNDlmZDhiZjFiYTFlOTQifQ"
|
||||
"resource": "repo://TFI/Features/KnownHosts/MobileKnownHostsView.swift",
|
||||
"version": "repo-file-v1:sha256:fa8263ae0b73e44ebc464500c12d7b4d05158c8a9ccf45f2d8fd85c82c4b0fa4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift#L260-L289",
|
||||
"version": "repo-lines-v1:sha256:9db559e516085882cb823c6deb04a05c7edd1478eb836537803c730e09861a38:eyJzZWxlY3RlZExpbmVDb3VudCI6MzAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjUxYzA2NjM4NWQ2MDI0ZTE0MDZmZDQ5MTg4NDBlZDI0Yjg2NTQxZjZmNDQzMmVhNjk3MDRkYzQ5NWRjMjA0ZTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIxOGYzNWVkYWFmMjQwYzE2NzUzM2NlMjAzYWNhODFkNjdjNWVlZTkxODYwNWU1OTJkMmU1MzAwOGViMTZiYzMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjIxNDNkYTgyZTA0MDMyODVmMDg0OGQzMjA2ZTllNmUwOTU0OWYzM2NmNmY4OWRiZDJkYzEzNmZjZDQwMzNmMTciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE1ZDk2Y2U1OWQxNDY0MDczZGNkNGIyOWE0MmRlOTFkYzQ1ZDdkYTc4YzNmMmFmZmQ3ZDNiMTlmYjA1ODA2MTMifQ"
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift",
|
||||
"version": "repo-file-v1:sha256:1ba5269491357e2fc2677b2c69d987d9a144ff0d26589f481ff7161aceb27032"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift#L443-L450",
|
||||
"version": "repo-lines-v1:sha256:d780e5cb62d4d18cc459ebdb88e119f5cdab79ffb2de53c9a6df112c1af3b427:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiM2JhNDEyODJiOTI3ZjUzNTc4OGMzMGY5ZWE3NjJhY2RmNDRjNDBiZjk4YzljNTk5ZWI5YjY3MmY4ODM2NjUxYSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNzVlNTIwOWUwYjg2MGYwODBmZTdmYzk2YjAxOTFlMWRhYjFmNTdmMjA5MjcxYjcxMDY0MzEzYjg3NzhhYWJiMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNTZjNDkxOWExZTkyMjkzMjdhNTNlNTJmZmEzMTgxNmZkYjRiMDEyZDhmMmY2MWQ4YTY0ZjIwYTA1NTNjZTk3YSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOTJmMmI5MWZmYzJkMmJhYzk0MWE4YmNkZmVkMTFmZGZjNGI1OWI4MzYzYmM1YTFkMDA3N2E0N2M3N2Q4ZWU4NSJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/KnownHosts/KnownHostsPageView.swift#L132-L163",
|
||||
"version": "repo-lines-v1:sha256:f1abf0deec8bb39d80bbdbc6b1fc2ee8552a2edbf7ca07df64fa6f0d92ec86ab:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgxOGQ3M2EzZWQ1MWViNThlZDk4ZDEwM2Q0Nzg3NjgwMjk0Yzc1YjQwMDQ0YWI5MzRiMzIxMTNkN2I4MjU5OGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYzNmI5MTA1ZDM4ZTViYmYxOTgxZWMyMjkzY2FmNjc0Y2ZjZjVjYjdjZDFlZDYwODYyODNlNGQ4ODhjMjRmNDIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUifQ"
|
||||
"resource": "repo://TFM/Features/KnownHosts/KnownHostsPageView.swift",
|
||||
"version": "repo-file-v1:sha256:27718a0dd715497708818b0d88d2f6861a1d7e9544490f109e36fe55f1fc1927"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -457,38 +389,22 @@
|
||||
"statement": "Language tests verify explicit-language Pro offer copy, catalog completion for Chinese in Localizable and InfoPlist, Simplified versus Traditional lookup, and assistant token-unit terminology distinct from security-token labels; mobile tests cover known-host add/edit titles and opt-in real-window card captures of Snippets, Known Hosts, and editors in all three app languages.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardRenderingTests.swift#L10-L14",
|
||||
"version": "repo-lines-v1:sha256:d52cb8c19a0b35bc44e205f0d5a12a698279206b2b4cdca80299321eedfac17a:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOWI3Yzc2ZTYwMzQwZWUxMGNhZGFjMDI0YThjNmFhYjJjYTg4NjRmNjdlOWI2ODlhMTFhODc0OTMyY2E1OTdlZSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiY2UyYTAyZDNkMmE3NzVlODIyMGJlMjk4NmQxMzNlOTliYjk1ZTA2ZDAwYmY0MTcyNjRmYzg3NTYxMGY5MDhhZSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYmNiZTZmZGYxZDQxMjk1ZjY1MDJiYTgxYzVkMmI3ZmU3ZDlmYTAxZmU1NDVkN2U2YTJhYmNjOWJlMzI0YjhiNCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNmYyZDFhZjdhMmQ0MzFiZWJjNzgxMGZiMzgzNDlhZGYwMDhlZTNmOTA4ZGQ1ZjliNGZlMWY3ZGY1NDNlYzEzYyJ9"
|
||||
"resource": "repo://TFITests/MobileCardRenderingTests.swift",
|
||||
"version": "repo-file-v1:sha256:90ca1c139d848451a57fd799f86760b088037baebb619bb8192fe677710d2077"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardRenderingTests.swift#L155-L164",
|
||||
"version": "repo-lines-v1:sha256:610fa0923a9b91c0d3e38f5a0bba02cdff0fec73b2980fe48b0c43000d6a1e74:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhkNDZkN2NhZDAyNTllY2U2OGJiYWY0YTYxMzAzYzQwMWY1Mzk1NDk4MWRmMWQ2MGZjZjIxN2YwNmZjMDc1ZmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU1MjJjNDJjZDE5YzZkMDNkODA4YzQ1MjcyMDU1MjgyNWI3ZWExYzViNDkxYjIxODUxMWNhYzc0MTVjZjlkOWIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZiNDEyNDY5YzBiOTkyZGFhZTI4YjYxNTBlZTZjNmVjZWM2MjAyZDM3ZDYzNTZmZDA1YzNlOTdjZmFhY2IyNjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImM5MDEyYTIzNDBlMjRkNjE1MThjMmNmMWMyNGJkODRmYmU5YjVmN2RlOWM5MDYwMTk1MTJkYjNhYzA5Nzk1YTQifQ"
|
||||
"resource": "repo://TFITests/MobileCardTests.swift",
|
||||
"version": "repo-file-v1:sha256:667200b9f2a179409df921dc6d6471f4ff081a98c462dfc0dda8fe9a08d35f24"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardRenderingTests.swift#L191-L205",
|
||||
"version": "repo-lines-v1:sha256:d8f1d524946591de67b55a6cace633ee83c0efb92726ebb923e628b8805a9156:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVjNmQ3OWVjZmFmY2M2MmIyNWJiN2U3MjI5OTI2NDY3ODU1ZGE1ZmJkYjMwYjlmY2M5OGQxY2MxZWZjZGVmMTgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdmZmMxMTlmYTk1Yjc1YThiYmQzMTQ5NjgzNzcyNmZmODU0NzQ4NDdkMWFlZTg3ZDIzMzBiODIwZDQwYTUzNDMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE3OGI1MWU1NTllZDE3MTczNzgzZmQwOGIxYzI2M2U5ZDYwNTM1MTdiYjEzOGExNmFkN2RkZmM3NzM2ODZhZjYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImIxNDU5MTM0MmRhNWEzNzJmYTk3NDFiNWE3ZTRiMjllNTk3MjNiNDBiZGVkN2QyZWNiOWQzZTkwMWNhMTAyZmUifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardRenderingTests.swift#L95-L120",
|
||||
"version": "repo-lines-v1:sha256:47605538f582da0dc698387e62dda4f4b71da6767d599dcbc17b8838ab509b08:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxM2Y0MmNjNDk2ZDAyYTU4ZmIxZGQ4NmM4MWQxN2NjZjY5NTQ5ODk2NjM5NTQ1MWRiNTkzMTg2YmZhMGNhNTkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU5MWU0YjJhNjU0NWVhMjMyNmYxOTY3ZjhhYmIyMjkyN2YzNTRhZjk0N2Y3NjE4NjkyNWI1NzgzMGI3NThjOTciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYxMjRiZTQyNDU3MTA0MzVjMmE5OGM0NTZjMzNkNjJiMWI5YmRiNjVlYTMwMDRkNjZmZjcxNWU4MmZkM2ZjZDYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE5Zjc5ZDYyMWI4NWIzYWY4NjEyYjAyZjlkMGNlOGRmMzYyZTkxOTNkMDllMTJjNjA0ZTQ5MDVjYjgwOTU1ZmQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardTests.swift#L99-L111",
|
||||
"version": "repo-lines-v1:sha256:fae41ec0748177a9faa7e94da51b5caf99ed1557fe9c3a42e708424d06a3f5b3:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjIyMWQ0OWUzM2I1N2QxNGY1YjE4NDA2OWM5MGQ1N2M3NDg2NmM0Nzc1MzY2Y2JmZTdhYTg3ZjY2MmE0NWU4ZmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQyMDU3MzU2Y2FkZDUwNjg3Y2QxOGYyNzQyNDE2NzNkMjY5ZGM4NjMyYmVlMjhkNTUwNDE0MjJjZTFlYzI2ZmYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppLanguageTests.swift#L136-L162",
|
||||
"version": "repo-lines-v1:sha256:4bc853acf8bb94e47d893ef308d5747f764c247379a23ac7b3a62ae7e4c29b95:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVmNTdiNzcxZmRhMjU1Y2ZkNDE4NTkxNDQxMzhjNWU4NDg1Njc4YmMxZDFhZGMxNjdhZDMyZmE3OTEwM2NhNmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjAzNTFjNDM0MmE4MjllMmYzYThkYjZjZjhlNzA5MjcyY2I3ZGNlNjdiNTVjNTA3NGE3MzJlNzNjMDUxYTc4MjMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppLanguageTests.swift#L80-L121",
|
||||
"version": "repo-lines-v1:sha256:f5f37d324d7719c4bd8c418534ca4f5ff7de8d6cbebca019d3fc5559b925374e:eyJzZWxlY3RlZExpbmVDb3VudCI6NDIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUzZGM3YjkyZTE3YmQ1OWUyMjQ4M2RjMDdlZWM5NWUxMTIxYmU5Y2ZjYmJkNzU5ZWRmOGVhYzc2NGEwYTlkMjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImY0MTJmYmM2NGI2MzE3YTMwMmRiODZiZTI1ZjFhYjU1M2Q5NTk2ZjM5M2FhODM2OWJlYzFkZTU4NmRjMTE1OTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBjNTEzMGE3ZDBkNzM0Mjk0Mjk0ODhkNmUzZDE2N2ZmMzkyNjE3Y2ZhYTYzZjliMTk2MTUwMDEwYWE2M2MxZjcifQ"
|
||||
"resource": "repo://TFMTests/AppLanguageTests.swift",
|
||||
"version": "repo-file-v1:sha256:a87e1a9c1edef71dacdd135cda2b3772e2e6eccfb3d07d42934c9ea04400920e"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:1faf5315736b44da4aab78615dbdfeb81fd8888d3b52b10b884f9ac33af15aa6",
|
||||
"pageVersion": "sha256:65e25f241d21cc316af8149e2f5040e22ec0737d9dee0e11d55f1447f76919b4",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_e50b505da2214c6781fa8eb1a146dacf",
|
||||
@@ -12,11 +12,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -26,11 +26,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:fc361c911553c831e066539b9f2c0df902eb588f71f3bac8606c0a48048a196e"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:721bea277227a69f102c1b505cf41245ddf5d568b96d6ff229cb440e53106ac0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -581,6 +581,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:9e0486ea1b4ef480f9b2de430e2beed9fdef98ddab424b93f4369fdc0b05748f",
|
||||
"pageVersion": "sha256:f145a23828c8bc1bc62a776d07d4f5245ebcf376c7f06c8b902eb1d64c18d9c0",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_7c677489fd8b4a4fadd006a4da4e9937",
|
||||
@@ -20,7 +20,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHPTYChannel.swift",
|
||||
"version": "repo-file-v1:sha256:91e4721c1929dbe719c47bbe18cea7c8dabea4fe54089a66894a2a5c7ad2c736"
|
||||
"version": "repo-file-v1:sha256:d107fbe196c9df5e7b49acb4301fe0a5f819fc5b411815083966f073b491f237"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -143,16 +143,12 @@
|
||||
"statement": "Forwarding auxiliary connections are filled with no more than four concurrent opens, install existing shared rules before publication, retry transient loss at 1/2/5/10/30-second delays, and do not automatically retry failures requiring interaction, trust, credentials, or cancellation.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHForwardingConnectionPool.swift#L167-L249",
|
||||
"version": "repo-lines-v1:sha256:c5dd7326f52fabc5c5932978402f481a8f4e495d6677058072cdc77b7d0c89ac:eyJzZWxlY3RlZExpbmVDb3VudCI6ODMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ0NTE3MzFlYzZhYWEyMmQwNDk1MjczYjdlOWIyMmVlNjY4YjFhODgyZjAwZDRmNmY3MDQzZTkxNzNkZDcwM2UiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM0ZGMzNTE2YjZmYjY4ODUxOGIyZmRiZDVmYWFhODJiNzk2NjE1MDNhYjI5NDAzNjU2NTViMDU0NzUzZTM0NzciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFjNjAzMzU2NjQ0NjJlNzliNWZmY2M3NWViMDJlM2YzYjIxMDk0MDlkZTU4YzU3MmQ1MmQ3ZDZlM2QyMjQ4OGMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHForwardingConnectionPool.swift#L340-L350",
|
||||
"version": "repo-lines-v1:sha256:f5d72fe1ee78b73df5b04fe4227feb201146437df69aca1e2f89cf41e21664bd:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFkOGUzZThjMzA0YTFkNWQwZWRkYjljODc5OTM1NjYzZDk2YTA1YmU0ZDFiZDI1OGJlM2NhMTNkMzU4MDcwNGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjU2ODQwZTVjNGYzYzQ0ZmEzMmFkYTFiNmUzOGViYjZhNjE1Y2Y1MzYyYWZjZmFkZjQ0YzQ2NWZkMzM3ZTE5M2YifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHForwardingConnectionPool.swift",
|
||||
"version": "repo-file-v1:sha256:99d09623ca00c9b9408718518264aeaa794d3875aa39928ad321ff9b7e6b1ae2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/PortForwardingReconnectTests.swift",
|
||||
"version": "repo-file-v1:sha256:ff128bcb12caf831b9ebf2b6dc68add5815cf73766f421d1b2d178b162f1c5d8"
|
||||
"version": "repo-file-v1:sha256:331fd75adb4b8a205b7dcb798c94f97ce4f1595485b531cabdd0618982e43160"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -195,6 +191,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:08:51.776Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:ae4a3bccb3836edf9362314d853ddc4634ebac972ee4c7f16eaf1c9c77c95123",
|
||||
"pageVersion": "sha256:ed30aee242a42146cd75d69d5a4e30ca8dc8fd7d5dc8db4ca3d401b8a73e894a",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_bc1531cd55cc445cbd6964ff7331b6c1",
|
||||
@@ -195,16 +195,12 @@
|
||||
"statement": "RemoteCharsetStreamConverter has strict default outgoing UTF-8-to-remote encoding, but incoming UTF-8 decoding bypasses bytes unchanged and legacy decoding converts valid sequences while bypassing malformed bytes and flushing incomplete trailing bytes verbatim; string materialization can still be lossy.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://FrameworkTests/RemoteCharsetTests.swift#L26-L67",
|
||||
"version": "repo-lines-v1:sha256:e26eabcaac0395551641ec9be367ea064eff06db917c89c2ac5dcf5011273d8a:eyJzZWxlY3RlZExpbmVDb3VudCI6NDIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI2MmYxZjhlNzYyMmY5NjRjMDE0ZTU3YmM0NzQ0NDRjZGQ5YzI4OTcyZTcxMmNiYTJkZGI5ZWZlMmJjODIzNTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjgwYTg5ZTQ0Yjk3NTMzNThhNzRkZjI3ZjgxNjE5Y2RhY2YzNmVjNTJiOTNlNzcxOGUyNDE3YzYxYTQzNGI4OTEifQ"
|
||||
"resource": "repo://FrameworkTests/RemoteCharsetTests.swift",
|
||||
"version": "repo-file-v1:sha256:5078e65bb98f232433bcd599cdc4d36335ccbc4e0d4633f28ce40c3611b14857"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift#L145-L223",
|
||||
"version": "repo-lines-v1:sha256:f8892502d88bbe21dd53f7d2f5feb868e83104b38e739700e675dd7cf2a539d2:eyJzZWxlY3RlZExpbmVDb3VudCI6NzksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjcyOWQwZGQ3Njg3MTU3NzZkZDE5NTU1ZmI3MzU1ZDZmOTE1ZjI4NDM2ZjhmYmIxMTQ3Y2Y5MTUwMThkMjgwM2EiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVlMmY4NzI4MWVkYjU0NmViNTIzNGRiNjk4ZWYyZGJkM2Y1NWM3YjNmZjgxMDQ0YzVhZWJlMTdmMTdiODhiNjIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjMzOGRkMWQ4Zjk2ZGNhNzFiZWE3ZTUyMmU0NDgxNDBhNjc5ODRmYTRlY2Y5ZTJiMzgzYmRmYTNhYmYxZGJmM2YifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift#L41-L139",
|
||||
"version": "repo-lines-v1:sha256:fb2a42a6ccccf45a6ea6fb302bc378c0e36219610401cfc86b3ef3ac773934ab:eyJzZWxlY3RlZExpbmVDb3VudCI6OTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ4MGQ2NzYyOGE1ZDQyMmQzMzNkMDY0MjNlNDRiNDQ5NWRjZjIwODZiMjQ0NzZmZjY4MjZhNGExZmQwMTM1NDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE1M2M1MTkzMmRhMWMyNmI0NDkzMTIxNmUyMDRhYjZjYzUwNzE4OTE1MzEwZDZjYmUwNGJhNWY0ZDRlYTVhYTcifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/RemoteCharsetConverter.swift",
|
||||
"version": "repo-file-v1:sha256:34692935f03154b8b9108663fb4666eaca689d24ab4b8468610495ed49f9d15d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -213,16 +209,8 @@
|
||||
"statement": "SSH PTY configures separate input/output charset converters and strictly encodes environment requests and user input, reporting failed user writes via a charset callback while preserving any bracketed-paste delimiters; OSC 7 rewriting runs even without shell integration, and PTY closure flushes cwd-filter and decoder tails before clearing them.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHPTYChannel.swift#L1097-L1125",
|
||||
"version": "repo-lines-v1:sha256:18b6ec795aa4c05d1e4b820fa966bdcd93eac5d15b1643bf22c9159acd84a950:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxMDI0YTNlZDg5OGNiZTliOTI3MDY1OTc4NjFmMjBjZmFkMTY4MTY2OTY5Y2FjNjQzNjI2OWE2MzRmOWU1ODAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAzNGYyOTRiYzljYWNmMTVjZjM2Y2I1NDIwYmVjOThmNTBmY2Q2ZWIyNmJhYjc1ZmU2NjMwMzMxYjc5ZGFmYmQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIwYzFhMDM5NmZhNTI4ODRjN2JkNTAyMGI0YjMyN2IxMzc3NjNkYmQ0NWE5NjFmZDI5ZTczZGEzYzU4MGY5OWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjY2MzkwMzNmODAyZDEwMDE1YmFkZDExMDc4YzFiZjg5YjljODhhMzc2ZjhjMzlkN2Q0MTZkODk1OTc1MWUyZGEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHPTYChannel.swift#L1170-L1215",
|
||||
"version": "repo-lines-v1:sha256:9ef763280ccf3dab12b1f4ea633744134103d81635f0b148b92ddc2d7c9849cc:eyJzZWxlY3RlZExpbmVDb3VudCI6NDYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQzOGUwMDcwMDY1ZDYwOWQyNmQ0NTgzY2ViYmRhMzExYjhkYmI2NWJkY2VlODI0NGM0YjVjYjFkMWE1YzQ1MTIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA1ZWMyMjIxNGI5M2JhY2MwNmJhNjhlOWY3NTc0MjU4YmJlMjNiOTIwNzYzMjk2MTU4OTBmZjQ1N2QxNDlkNDEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxZDZmMzdjZGY1ZDg5OThlNmZhMjNhNGQyYjg0NjFiYzJiOWYyM2VmZmU5MjRhOTcxZmNhOTM4ZjY3ODU4MWQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHPTYChannel.swift#L1587-L1652",
|
||||
"version": "repo-lines-v1:sha256:34d886a2ed1087143b81e0d9e03f2dee31d2d1d370340807b199379809bfd4c5:eyJzZWxlY3RlZExpbmVDb3VudCI6NjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRkZjQ0NWVmZGNjZmVlM2IxZjc3OGJjOGU3N2M3NjE2MWUxMGM4ZTE2NjkzNDU4OTllZjgxMWVmNzNlM2MwN2EiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjYmU4MjRjOWY2YTZmZDQ1ODEwMGI3NGExNzVhZjZlZGY3M2Q2YjNmODg5Y2E4MDUxZGIzYTcwOThhYmQ0MGYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjUwOWQwMDFkMzcyYzAwZTM2MzA1NmIyOTg5MjNhN2Y0ZmUwNTljNTliODRhYjU2MzQzMjlmZjgxOWVhYjIzNDcifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/SSH/SSHPTYChannel.swift",
|
||||
"version": "repo-file-v1:sha256:d107fbe196c9df5e7b49acb4301fe0a5f819fc5b411815083966f073b491f237"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -231,24 +219,8 @@
|
||||
"statement": "Telnet direct and proxied connections configure charset encoders/decoders independently of SSH hooks; Telnet protocol and NVT parsing precede application-data decoding, and outbound text encoding precedes NVT formatting and IAC escaping. Decoder exceptions display raw application bytes, while outgoing encoding errors do not send the failed write.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L151-L177",
|
||||
"version": "repo-lines-v1:sha256:83eb90aa5f275ba324f4283b41250aeeaf8a0ab789ad8555825a797afb9cc6b4:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI1NzA0M2EzYmQxMzJiYzI1MGJlMmZhMzZiODg4NzQyYTkxYWJlMzg1ZGQ2NjdlYmE0ZGJlN2U0Yjc3YTlkZTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRiOTE0NGMxOTM1YWY4MGU1MDM2OTI5ZjVlNTBlMWQwZWNkNDdkZDFjMjdhMmMyNTA1OWZiMzk3Yjg1OTc1OTkiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI0YTEwMTVjYmY4M2Y5NTgxM2NlODUzZWU2OTFkZDIyNmJkMWM0MWMxZTYzYjcwZDJhMDA0MjYzMTg5Y2VjYWIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L235-L245",
|
||||
"version": "repo-lines-v1:sha256:db41403872122c2a4dd9a2f6952d26d7f0136af5e5d6a11194d794d8d177c426:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM1OGQyZTEwZTZkYjY1ZmMzMTA3NmRmY2Y5ZmQwOTY2MGY5Y2E2Mjc0Zjc0YjYzNDBhYTZjOGUxZjFiNmI3MzMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQwZGVhNTU1YjQ0YWQ4YTAyY2U3M2NkMjNmZjAwZTU5NDYwYjZjYzJlYzAxMTEzOGU3ODlhNTJiYWI5NjcxZGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZhMmQ0NTQyNGYyODIxYzIxNmQwZWRlMTM1ZjE1ZjRjNjEwYmFjYTA2YTg4YjUzNTgwMTA1NDcyOWMyYjU2YjcifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L298-L315",
|
||||
"version": "repo-lines-v1:sha256:2a866f959ab9446ea82d4f1cc2aeda49a0938bfdc66084fd5778c78ce6cdc4f6:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNjYjgyNzgxMTg2ZGExMDJhZTNlYjFjMjY4Zjg3MTIwNjYxNTZlNDk0Y2FkNTk2Mzc2OGZkZWU5OTY0Y2M5Y2YiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFjYmNlMGQ0NmNiZGYzODAyOWE5MGExZDBhODdkOTk0NGZjYmVkNjg2NjEwZGJmZWRkMmY1MWFmZDljN2I0NTQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L397-L405",
|
||||
"version": "repo-lines-v1:sha256:93aba1c315acc3116ca75c4a017b85685d7946c01cc5584478caa0298e808ff0:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiN2U3ZmM0YzM2YzEzMzA1MDVmMzhmZTFhNmY0NWFhZjdjMjZjNjdkOWE3MGNlNjFlMzdhZGM2ZWE0MWZhMzUwYiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYzVhMWM4YzZkYzliZjBlNGFkOTcyZjdmOTQzZDA2YTQ0ZjhmMmFhOTA5ZGNhNmNmYjQxODQyMWEwMjc4ODBmZCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOGVhZmFkNWRiNGQ2ZmIyNjE2MjIxN2JiMTk3Zjk2ZGQ5MzJlZTE1NjQ3MjEwMTA0NTBiNjM0OGEzMTE4M2ZhNyJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L94-L120",
|
||||
"version": "repo-lines-v1:sha256:2b3aa7a52e252877039238e3788fced33f9841467c65382082b805a90732665c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjJlMmQzNmE5NmE0MzNkMjM5Mzg5NTg5NzdiOGJiYzA2NGRmODM1ZjVhMTI3NWZmOTkwMmFlOWNhNWUzZWY5MzQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImYyMjY2M2FlMDBiMDc3MGIwMWNjYTljYzRlZTdmNDUzNWI4ZTQxZDBjYmViNjk1YTNiYWI3NjE4YTgwMTgyZGEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjRiYTg0YTA3Nzk4ZjI3OTg2OWI0MzVlN2JkZTYyZmRjODZkNGFmOTM3MmRhNzIyZjk1YzYyNjlhMmFiOTAzZTciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk1ZWI3YTc3YTMyZGJhZWIzMmI4NjUxMDM5Y2ZkY2M3ZTYzZTU1NGMzYTcxNjViMTUxYzkzNDY3NjFjYWY3YTIifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift",
|
||||
"version": "repo-file-v1:sha256:669be133495ace7709a537d328d7ba5e31fa8159dbd50a7f3e193cc91f807d74"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -257,18 +229,14 @@
|
||||
"statement": "Telnet automatic login strictly encodes username/password; an encoding failure clears secrets, reports a charset error and continues manually, while cleanup flushes decoded output and clears converter and prompt state.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L318-L395",
|
||||
"version": "repo-lines-v1:sha256:4dc2ebee2e7b4d237580c96c8c6e766f0f1fa5de7381f375a9ff5549e1f15cfe:eyJzZWxlY3RlZExpbmVDb3VudCI6NzgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM2MWQxODI3ZTg0Zjg4MTFjMGJjNWJmNGRjZTcxNTIyZDhiOGQzNDA1NTI1NjE3YTRmMWNmYTcyOGE5MzdiODMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI5OGViOTg0ZDg2NjM3YzAxOWE5ZTQ3OWM0YTYyNzkyNTZmMzJlYzZjYmExODUzZTgwN2FkZmMzNGQ1MGNjMGMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L450-L473",
|
||||
"version": "repo-lines-v1:sha256:965c06543dbae50ff67119b30ae542d45f4e5160e0f2e816d608c8fef3f5c68e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI4MTVhZjQ0Y2NjYmY3M2ZiOGFlYTRkMmE1ZWUwNTFkMTllMmUyMDMzMWQ3ODVlY2MzOThmMjBlMzgwZDk5ZDgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRmMTIwMTgxYmY2YWI3MWJiMmYxYWZhODE1ZTllZjMwZDIyMTkyZDI2ODhhOTRiYzRiZjQxMDFkMjUxMTI3OWEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJiOTg0MmMxZjExMTk5ZmUyZDVhZjJmNzhkOTdiZjQ2NDc5ZjA0NTQ0NzQ5ZmZhNGJjMWQxMGUxMDhjMTUyMTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift",
|
||||
"version": "repo-file-v1:sha256:669be133495ace7709a537d328d7ba5e31fa8159dbd50a7f3e193cc91f807d74"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,18 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:0abbaadf6ae386fe26eba5e0ce8010dfc8cd8a5eba91e389977e9d5ee6c76fb4",
|
||||
"pageVersion": "sha256:8f362367e688c959989324ed232ec7a4516727fe39a97d68b5927fe8f30f2e5e",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_3a403468456840acbfe0a524b90d5717",
|
||||
"statement": "TermindPresentation contains reusable SwiftUI form and presentation types, while ArchitectureBoundaryTests forbids app, AppKit/UIKit, storage and RemoteInfrastructure imports there and separately restricts ListViewKit to approved native-list workloads.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/HostConnectionFields.swift#L1-L111",
|
||||
"version": "repo-lines-v1:sha256:c8f3f7ce1f96c10a867138614a48a5bfccede52e85b3a3d71bb485b3d2d1dd16:eyJzZWxlY3RlZExpbmVDb3VudCI6MTExLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI5ZThiYWYzZWNjYWU4YmFhMzJlODZlNDBmOTIxZDI2YTEzMGJhNzRjMjNmMDIxOWE3ZDI2ZWRmNzdjMmQ1YWEwIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiI0MTJjYTM0NWNjZjc1YmY5YzA4MDZiY2U2OTViZThkZTgwOGI3OTk4NDI1MWE3YTU0ZDIwMmNmNjEwMWRkNDUxIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MCwicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MCwiZm9sbG93aW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1In0"
|
||||
"resource": "repo://Frameworks/TermindPresentation/HostConnectionFields.swift",
|
||||
"version": "repo-file-v1:sha256:bb9245bcbfc3ea5dcfb136c816635cf8d4257e9eca6f7518fa59b4cec7e0ef74"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L109-L136",
|
||||
"version": "repo-lines-v1:sha256:b450e65c0342f68e65c8a351124b15b9007545d00dc02109ed5fe96e7c557c7b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjhjOGQ4ODMzMDg3NGVkMGZhMzg1NTE5YTJkMjRiNjUyNTUyMjM3ZjBmNmIyYzhkMzAzNzY5ZTQ5Mjk0OWVmZmEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE5NjRiODI3ZGRhNjlhZDUzYmU4NzU4ZTNmYTBkOTc0NzU5YzFlM2Q2OTgyNGY3NzI1NmZmOGVlNDA0YTA1Y2UifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L164-L189",
|
||||
"version": "repo-lines-v1:sha256:6c4d5d5c4c175c000011e3bd3f9bdf066ac2595cafd11058e3f0ea3bb1fda5ec:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijk3OTk5ZWY4ZDk0Y2NkYzU3ZmJhZDE1NzllYmJkZTM4YjIwYTUyNDk0ZGMyYWYxNGFiZGU2MjY5NmJiMTMwOGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQ3NDI5ODQ5YmU0MTZhMzMzMmY5NTcyYmY1NTM5ZDkzOTZjNDEzMjY1MWE4MzhiZGRhZGIzN2IwNzg1OWViMmUifQ"
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -98,15 +94,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/HostConnectionFields.swift",
|
||||
"version": "repo-file-v1:sha256:c8f3f7ce1f96c10a867138614a48a5bfccede52e85b3a3d71bb485b3d2d1dd16"
|
||||
"version": "repo-file-v1:sha256:bb9245bcbfc3ea5dcfb136c816635cf8d4257e9eca6f7518fa59b4cec7e0ef74"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift",
|
||||
"version": "repo-file-v1:sha256:d2792158c62c3eecca3fef18c90e4eb26e3c51ec782431baa50bf2277e7f3e27"
|
||||
"version": "repo-file-v1:sha256:0ca046969bd969fa4d4f4d245220726eb709fe97d4df67d7969b19807a8aae32"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/HostEditor/HostEditorView.swift",
|
||||
"version": "repo-file-v1:sha256:a71a870383335276f0190eb1f90be657a7ce100f5ad68ec0fb6bb067fbbcd499"
|
||||
"version": "repo-file-v1:sha256:f41c78c72a142dce4b642c6e9a9a9efd93f550d9e040e15cbd2993ab0cf2f08a"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -215,8 +211,8 @@
|
||||
"version": "repo-file-v1:sha256:50d5bcef66143d4630cd81b0fbfe5f6a2b3a83db89335b55651ef00174fc8230"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Settings/MobileTerminalSettingsView.swift#L6-L27",
|
||||
"version": "repo-lines-v1:sha256:f318db7e58e16b49c51697738acb5c9f01dd3ed4b82431898a5ff6ccbd86e50c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFlZWQ0ODIzYWM5OWFkMjBjNDQ4YTY5NTNiZDAxMDI0ZjhmZTNiZGE5YWE4Nzk4NTI3Yzk3MmVmN2I2NzRiNGEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdmODMzMmZhOTk2MTExMDJiYjgyOTEzYTZjMDFlYWU5N2Q3OTMyN2JlNTViZTY1ODYxMDM3Y2Y0OGRmYWQ5MjIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjdjODk1ZjdlZDQ0MWRhOTBjNGEwMzliZjFkNzg2YWYzMjg2YmY2YmZjMjgxZjM3ODQ5MzIzNTczNjk4M2YzYjMifQ"
|
||||
"resource": "repo://TFI/Features/Settings/MobileTerminalSettingsView.swift",
|
||||
"version": "repo-file-v1:sha256:cfb01c8d066071c9afa9d47891ed093923acb2a0217b29755e356ec701663546"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Platform/TerminalFontCatalog.swift",
|
||||
@@ -224,7 +220,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Settings/SettingsPageView.swift",
|
||||
"version": "repo-file-v1:sha256:5758c713210354b4146d35075de36a9650a9acd0025e9fbdfefbc5e2db82d3ed"
|
||||
"version": "repo-file-v1:sha256:302951c6d2364dacb597c0374f419d44acd4952eb20ba1b313e31a4b9c059cf8"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Platform/TerminalFontCatalog.swift",
|
||||
@@ -260,19 +256,19 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/Terminal/TerminalThemePicker.swift",
|
||||
"version": "repo-file-v1:sha256:c176d88acd7707b28fc4a829b43c3cf6d21f5a8409f25d781577cf6c539c82cd"
|
||||
"version": "repo-file-v1:sha256:5f480c53b4436421893d8973b28150d18a61262d3ce85e0ecf278ea06f901b0e"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Settings/MobileTerminalSettingsView.swift",
|
||||
"version": "repo-file-v1:sha256:697847e04d47b8b2778aefe44d33faf3b45719383c7bf550bbb68d3255c91b1a"
|
||||
"version": "repo-file-v1:sha256:cfb01c8d066071c9afa9d47891ed093923acb2a0217b29755e356ec701663546"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Settings/SettingsPageView.swift",
|
||||
"version": "repo-file-v1:sha256:5758c713210354b4146d35075de36a9650a9acd0025e9fbdfefbc5e2db82d3ed"
|
||||
"version": "repo-file-v1:sha256:302951c6d2364dacb597c0374f419d44acd4952eb20ba1b313e31a4b9c059cf8"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Settings/TerminalCustomConfigurationEditorSheet.swift",
|
||||
"version": "repo-file-v1:sha256:81c17619a61afda1bce2d52d47ca85416b0ecb9af055a8e591b5593a8738aa71"
|
||||
"version": "repo-file-v1:sha256:997f839f7997ef70dcaec824b727553f8df7aa8ad6fdf5bb0ecd6c396f6397b3"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -300,11 +296,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Assistant/AssistantView.swift",
|
||||
"version": "repo-file-v1:sha256:b5f2848d1ec5b805462acf73134e0af907ae7845501b70c3f11761a32cfb0553"
|
||||
"version": "repo-file-v1:sha256:8afffffbb974da8b4c7e4629ccac060f2b0cae5164ffa4f932dee2e083cbc15f"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Sidebar/WindowSidebarView.swift",
|
||||
"version": "repo-file-v1:sha256:6c3b55dff7d302c6c87b804a2dde9aaf9de4941747f65049ddbc6d1ba6e8d672"
|
||||
"version": "repo-file-v1:sha256:e2f23f2dff6d1fba8ec85ae36c7e68960694da2a669507bdeb6e4f57ff3e5463"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -314,11 +310,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Ports/MobileForwardingView.swift",
|
||||
"version": "repo-file-v1:sha256:95018dc2360759c42e609df416a46361413accd1818726e824ec1a3e736b2aad"
|
||||
"version": "repo-file-v1:sha256:13b6986ee3423852474b8ada4b92d132e5bdf505445570be2d2c0ca156e5e533"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Ports/PortForwardingView.swift",
|
||||
"version": "repo-file-v1:sha256:d7b009e88acd4d7cbb688a5baf212f85632617d62863ce909c860da83125024e"
|
||||
"version": "repo-file-v1:sha256:1db68464c1095b5915eb9c2b3bb6bfa09d4339a35180ac72009021b75963d4cb"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -328,11 +324,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Snippets/MobileSnippetsView.swift",
|
||||
"version": "repo-file-v1:sha256:877ba966713da9e0c3d45559ccd607112baff1aecefa4d9e50440b33e90c4cc1"
|
||||
"version": "repo-file-v1:sha256:1ba5269491357e2fc2677b2c69d987d9a144ff0d26589f481ff7161aceb27032"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Snippets/SnippetsPageView.swift",
|
||||
"version": "repo-file-v1:sha256:8d4e7573123311fc852fedc7357d0ed3a74a2b55cd642c1476bb4d019640d8e9"
|
||||
"version": "repo-file-v1:sha256:5791561607e1b423d46cb1eb986f3faeb72c036ab4035bdfe22fbb2b45b83ae7"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -341,16 +337,12 @@
|
||||
"statement": "Mobile Host cards activate through scene routing on tap, while their context menu groups protocol-filtered SSH/Telnet/SFTP connection actions separately from Edit/Duplicate and destructive Delete; even a Host with no enabled protocol retains editing and deletion actions.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L16-L44",
|
||||
"version": "repo-lines-v1:sha256:3fadb0523a363711191ac025b2a2be70dca696c5d1189ef587e89c1687da7ecb:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZkZmUzZTM2OTM5MTg5ZDg3NGU0NzlhZjFlYjJhNjg1OTY4Y2M1MDg0YTM2MDYwMTcwM2E3NjU2ZmZmYTdjYWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNhMGQ4NTMzZDViNDMxOTM5YTVlZGI0MzY3N2Q3NjYyYTU0NWM2MWIxNjNlOWI4MzFjZWI3ZGZhZGRmYzVkYzYifQ"
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift#L767-L834",
|
||||
"version": "repo-lines-v1:sha256:76b7cb173f7633d307e7f14d3725dbcd4d31003375122a62624beac5ae94cd9c:eyJzZWxlY3RlZExpbmVDb3VudCI6NjgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAyMTExNDcyZWQ0MmE0NDkxZjc5OTQ0MzNjMTM5ZTBlY2M3ZTczZmZhZjI4ZTZlYzIzZDI3OGIyMmRjZmYyMTUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjkzOTgxNDU1ZTQyYTZiNzRiOWU5N2ZiYTY0MjM2NTQxM2Q4YTNlOTJkY2JlNjU5NjY1ZDUyODA0OGExZmU0MjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYzYzUyYWM5YmUwN2MwNzljNTRhZDgwOGMzNDEzNDMwMjFmYmM4M2NiZDVmZDk2ZGNlZTk4MGY4YTI2ZTU4YzMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift#L33-L68",
|
||||
"version": "repo-lines-v1:sha256:1ea05d84f5bbde850a612da2de508f4c2c278de3fd5ce0ee1710e12e4ecfa25d:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjgwNzEyOWY5ZDgxMzg1NTc0NWI4NDZhM2Y5MDNhZDRlOTk2MmIwMTJiMGVmZjdhNGM1MjI0ZTAyNzVhZDBjYjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImI3OTE4NTE4YmYyODg1NTFhYWVkOGRlMzU5YTQ1NTQwNWUxOGMxYmRjMjEyNDgzMGI5NjA4ZmJjMjU0MGI2MWIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE0YWIwODlkMDRjOTQxYmEzYTg2NGI0ZjEzODE5NDM5ZmNhZjk1MTgyNjk5MjdlZTZkYjQ3Mzg5OTNjNDc2ZWQifQ"
|
||||
"resource": "repo://TFITests/MobileVaultFeatureTests.swift",
|
||||
"version": "repo-file-v1:sha256:0288f63f82aaa2fb09baff8ab6bcb8cfcb1a3c6cf6f119777e26380c2723620d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -360,15 +352,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:846cccb0bc643b8f8c6c54dc70c1928a29218a885598274f1ef689e239b1aa80"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:19fc7789a96e909c77b51a2b1149d8ce29449c22068fd0084b19e8a286a64d06"
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Hosts/HostActions.swift",
|
||||
"version": "repo-file-v1:sha256:91019e1a233737662d6cc3576b3ad19c075827060cd9e3c5e798f38aada6f64b"
|
||||
"version": "repo-file-v1:sha256:38924a7fa91cdc9577edccd4e0b09cc167e15cdc951b027d56919d5db8dc906c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -377,16 +369,12 @@
|
||||
"statement": "MobileRootView binds the selected destination to a scene model and preserves one NavigationStack per registered feature inside a sidebar-adaptable TabView; adaptive tests assert the same native tab controller, five available tabs and scene/native selection with visible titles across compact and regular sizes and language/Dynamic Type variants.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift#L110-L118",
|
||||
"version": "repo-lines-v1:sha256:b041a5d2b709e696a2ca470b6ad5af3b2ae30da547be4fc0b5cbb2e206bcfaac:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiODI1ZWU4NTA4ODhhMjdhODRlNTc1ZTBiMGIzN2Q3YWI5ZGFjMmE0ZGQ3YTE2ZWE1ZWM5NTkyNTdlNDRmMTJiNyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiOTYzYWE0YWM3N2U2Y2I1YWNlMjZmOTZjNjA1NGRmMmFiOTc1OGU4YzY3NDNmNjU2MjQyNzI1ZTNhMjRkZjQ0YyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjEsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSJ9"
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift#L28-L40",
|
||||
"version": "repo-lines-v1:sha256:c77852cad0f3f351d8578c25f73cc6b2f69300d496c4c48d8d3b58b497fda049:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNiYTQxMjgyYjkyN2Y1MzU3ODhjMzBmOWVhNzYyYWNkZjQ0YzQwYmY5OGM5YzU5OWViOWI2NzJmODgzNjY1MWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc4MGM2OTYyYmY5ZDg3ZWFlM2QzNDZiYWE1NGNlYmJkOTc5ZjBhN2RjNmIxYWUwMjk5ZDZkNTlkNzNjYzZhYjEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ0ZDhiNmFhZTdkZTg4YjQ5MzJhMjFhNWVmMTMzMmFiYTEyZmNhYTA2NWM3OWQ1OTJkYjczY2JhNTU4MGNkMGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBmYWJhZWJmNDA0MWQyNTAwY2U2MDZkNmFlZjI0NDdiZTFiMjg3MWIyMmQ5NjExOGFhY2ExYWIwMjkzMGU0M2EifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAdaptiveLayoutTests.swift#L131-L176",
|
||||
"version": "repo-lines-v1:sha256:9ff692e72ae5bc6ec980c25f35b1b34b7926bd49ab3afaf1930f3316bdd7bf13:eyJzZWxlY3RlZExpbmVDb3VudCI6NDYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRlYmZhYTQxMjcwNWM3ZGQ3NTg2ZTI4MjcwZTJiZmJiODBmMzNlZDMzMjRkMWVkYzZhZGVlMmZhYmY1OTc2MDkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA2ODYwN2ZkMGY0M2NjZDAzZDU2MzZhMWFlOWJiNWVmMTEwM2YyNmQzZDQ0OWI1NGMwNTEyOTk2NGQ3NjYxMGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhmNzU0NTFmY2MwMTA4Y2RmYjZjY2U0NGMxNDAzMTExOWRkNjdlODYzYmUyY2ZiZGY5MTA4M2UzZTc2MTQ4NGYifQ"
|
||||
"resource": "repo://TFITests/MobileAdaptiveLayoutTests.swift",
|
||||
"version": "repo-file-v1:sha256:e9acaf0cde5c2fc6c94b78739cfcdd483f74e97266a4a750b1743e93b05de665"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -435,28 +423,12 @@
|
||||
"statement": "MobileAppModel stores recent workspace descriptors apart from connected workspaces; a restored selection publishes a shared live workspace before connecting, while cold launch does not reconnect all descriptors, explicit close disconnects/removes them, and background expiration suspends live work until scene activity resumes it.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L431-L446",
|
||||
"version": "repo-lines-v1:sha256:cd1f7502bc33ef6ea75833837ae3b8bab7622950871f307371b2e0e00dad750b:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjMwMjY2NWE4ODQwY2FlOTY3MWE1NmZmM2IyMzk3Mzg2MGU1YmI0NDVmYmM0YTE5OGQ5NzlkYTk0YmNjMmU0MjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM4MDU1NTIyN2IxNGM1ZmEwYTQ0NTA1NjhmM2U0N2RmNzAxMDg1NjFlZDU4NjM3ZTZiODlkZDc5ZmVhOGE3NzgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk0ZGZkNDg3YzJhZjFmZDE5NTFlOWE5OTUwNzRlYWM1NjM5M2ZmNjZlOGRkM2UwYmUyYjhjOWQ5YjUyYTM0MDgifQ"
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L560-L579",
|
||||
"version": "repo-lines-v1:sha256:0569dc2b10c701c3b0c48b14a14a2521ba0f40ec2645f7220d7e5a61e98501d2:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjExYjYwOWM3ODJiMmM2NDVhM2M2ZDFmOWMyMDA3YzdjMGVlMWI5MTI1YjJjOGIxOTU0YTFlMTVjY2UxM2VkYjMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjExMGVhYzUyYWE2NjM0MDczNjQ0MjU1MTg2YTc5NGIxMjdmYzQ5MTA2NTRmYTNhMjBiOTgzMjMxOTIxZWU2ZWEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjYwZTJhMWYwNzIwY2I4YWNhODQ4ZjIzNzM0N2E4YjUzNGY2YTEzZDVhZTBmMTQ3MDE4ODQ5ZmZjYjkxOTRlZWMifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L643-L698",
|
||||
"version": "repo-lines-v1:sha256:4c247980d6a2ceef0cb2a5e32f83942cb2ef6fdfb7d9e498c6dbdebe7c110d51:eyJzZWxlY3RlZExpbmVDb3VudCI6NTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY2MTg5YTNmOTZjYWI4YzM1ZjZkODNkMWQyMGE2N2U2MmUxOTJiZDgxMjQ5MjI5MjFjM2M4NTMyYzE2MjlmZGUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImYxNzMxNDIwMjQzNGQ0Yzg0MjI5MGRkYmY3M2RkNDg5ZTM2YmI4M2UzYTIyOTY2MmI2YjI3MWQxYmNiYWZjMDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE5MDlmNTg5MzgzODA2NjM1OTVhOTFhNDhlYjQzNWFhNjI1OGNiZWVlZDc1MjAzMDUxODZiYjBiMGI4MTZjMDIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L748-L767",
|
||||
"version": "repo-lines-v1:sha256:009a2acb4cd53659b0f5811f41e299f4d746f4be8f1f4352ff30ad7118fd662b:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUxODI4YWZmNmM2MDJhZDBjNDkzM2FhYjA1ZmQzZTgzOTVmYmI4ZjY3NTI1OGU4NzBiMmE4MGY5MjhjYzhmZWIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjVhNzhhMmQzMGFkYTcwNjU3OTM0MDdhOGM1ODY5NmMxMmM3NjAyZTc0OTVlM2IwZmE5MDRmMDE3NmI0YzY5NmEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUxNmNkYmM5MDJkOTFjMzE5NWYwNWM4NzZmZjcyYmM3NTdiNDdlZGE3ZjYwNmU4NTRjNDMyNTgyOTRhMDk3MGIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift#L94-L119",
|
||||
"version": "repo-lines-v1:sha256:e6e303e3b91444e7690cc8aa70d6e6eea8ec2eb542e89cca79f46e6fc0192ab2:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijk0NWQzYzBlZDI0Zjk2MWU0ODEzNTI0YzRkNjM4NWVkMTZhNzNiMTMwOTA2YzBjOTcyMjg2ZTRmMzU3OTg5Y2IiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjBkZjUxODQwNmQxYWNhOTYzYTJlMjBjZmFhMzViZWMzZjdlMDg0MTNjZWU1MDkxNTAyYjIzODhjNjYxZDk1NDciLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhmNTM5ZTRiNDZhNWI3NzZlYjg3ZDY5NDIwOGFhZGU1MjczNjY2NDA1MWIyOWEwZmFiZGMwYmZiNTIwZmNkZGEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileAdaptiveLayoutTests.swift#L609-L668",
|
||||
"version": "repo-lines-v1:sha256:4c7184dd57b66ea0769dc47d28d7535c98477ead53bbed893ca94b4a0999da70:eyJzZWxlY3RlZExpbmVDb3VudCI6NjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdmY2U1Njg1OTU0NTBiZWM0OTYwNjlmOTQxMmI1MDE1OWRlNjIyNTI4MDA2NTlkZWIwYTMwMDgxYzRiYjdmNWUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjIzYTVhMzJkOGE2M2M0ZTY5MGYyMGE2ZTFkOTVlMWIxYzk0YWM4YjNkMTZhYmM1OWQyYmQxYzAzYWE1Mjg3ZTEifQ"
|
||||
"resource": "repo://TFITests/MobileAdaptiveLayoutTests.swift",
|
||||
"version": "repo-file-v1:sha256:e9acaf0cde5c2fc6c94b78739cfcdd483f74e97266a4a750b1743e93b05de665"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -503,20 +475,12 @@
|
||||
"statement": "Desktop Navigator workspace drops use a native overlay on the List and measured row frames to show an insertion boundary while computing the move index without the dragged row; drops detach panes or reorder workspaces only inside the workspace section.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L144-L209",
|
||||
"version": "repo-lines-v1:sha256:4736d054e0b253e867e3b433eea2420794c77dcadf7e8ba7bcbcd21c803fdc34:eyJzZWxlY3RlZExpbmVDb3VudCI6NjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImFmMWZiMDUyYzFiMmM1Y2YwYTFkYmExNWNiODM1MjE5ZGE5NTVkNDBmMzM5M2E1YzJiZDg4ODNjNzllYTE3OTIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJjOTk5ZGJkMGY3MDRlZjZiOTljMmE2Zjg2NDFmYjcwNjI2YjZlMDNmMjM1OGMyNTI1ODg0MmY4NTdiY2Q5OGUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZmMDY3MmE0MDRhM2Q1MGRjYWYyMWQ2ZjgxNGNmOGViODQwODAyYTc4YjQ1NDJiMzc1YjRhYjFkOTQ1ZDU2ZDEifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift",
|
||||
"version": "repo-file-v1:sha256:d313a5cd993d79e7820782ec1317c58bf4bd5483e03f9019245667f260b210f4"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L215-L301",
|
||||
"version": "repo-lines-v1:sha256:db133ba93e0ef74d84a3c80e3353e783a3de2fa1d58044be861a7eacd7ac769a:eyJzZWxlY3RlZExpbmVDb3VudCI6ODcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU0NThmMzc1OWM3ZDY1YmMzZGE3ZDY1Y2I2NDc1ZGMxOTY2ZGE5N2YyYWMzYmQwMWU0MGIwNDhlMDFkMGRkZTAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcwYzY4Yzg0YzZjNjNlMDQwY2E4NzRiMzkxN2JkMWQwNDY4ZTllMmU2NmNkYjNiZTZjZTBmMTEyYjlmZTc4MGIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijc3MTJmY2NjOWY2YTFmZGU3MmQ3YTQ2NGMzYmMyNmUyYzUyYjgwNjBjMzlmODZiNDQxMzg0NDRlOTZkNGQ4ZjYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WorkspaceNavigatorView.swift#L389-L415",
|
||||
"version": "repo-lines-v1:sha256:f1528f5a42351f4b9b0f50ae64a5a34cfd7409ee9cae6e8a8a68e2be016a6884:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMzZDlkYjVhNWRkZDU4N2IyMmYyMTE3OGNhMDk1NzA1N2NiNWI0ZmI5MWQ3NDlhOWMzODA2ZjQ0NDU0MDU1NDgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImZiODU1NjQyYzRlNzU5YzA3ZmI2ODI3YTUyYWQ4ODBjM2U2MjYxNzQ4ODhhNWNjM2Q0YTY0MjI4YzVlNTE3NDQifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/PersistentWorkspaceDeckLayoutTests.swift#L16-L73",
|
||||
"version": "repo-lines-v1:sha256:416d896921af35bcc580f0aa68bc3489a3576e6664e4aac3ba89f6945fb7692a:eyJzZWxlY3RlZExpbmVDb3VudCI6NTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImMwNDU1YWQ1ZGVkMTQyYzVhNWY3NDA3NGE2MmM2YzhmY2FhM2Q4Mzg1MjgzNzBiNDI2ODgwMDBkNTlmMDk5YWQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA0ZDY2Nzg1NzQzNDllZjRkMzljYzQ4YzJmZWUwOWU4ZGFhZDFhZDE3Y2ZkYzg5ZTIzN2FmMzIwMjhhN2M5NzgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJkOTNkYjZhYjc4NWQxYWRlNDI1MzhmMGE3NjM2MGMwNzIyNGRhMmIyMGZiMzdlM2I3MTM1ZDM3YTA1ODIzMWIifQ"
|
||||
"resource": "repo://TFMTests/PersistentWorkspaceDeckLayoutTests.swift",
|
||||
"version": "repo-file-v1:sha256:34130ea4db7eb1ab3d0a72aa0ac66e78d487ca3fea6986a0d48631c41ea56e60"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -526,15 +490,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/HostConnectionFields.swift",
|
||||
"version": "repo-file-v1:sha256:c8f3f7ce1f96c10a867138614a48a5bfccede52e85b3a3d71bb485b3d2d1dd16"
|
||||
"version": "repo-file-v1:sha256:bb9245bcbfc3ea5dcfb136c816635cf8d4257e9eca6f7518fa59b4cec7e0ef74"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift",
|
||||
"version": "repo-file-v1:sha256:d2792158c62c3eecca3fef18c90e4eb26e3c51ec782431baa50bf2277e7f3e27"
|
||||
"version": "repo-file-v1:sha256:0ca046969bd969fa4d4f4d245220726eb709fe97d4df67d7969b19807a8aae32"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Vault/MobileVaultView.swift",
|
||||
"version": "repo-file-v1:sha256:19fc7789a96e909c77b51a2b1149d8ce29449c22068fd0084b19e8a286a64d06"
|
||||
"version": "repo-file-v1:sha256:4d6cb5a6d8fa8731e3c787f44930a19e846a92aeeb8ff4b732f2e9190d40d31c"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -548,11 +512,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift",
|
||||
"version": "repo-file-v1:sha256:d2792158c62c3eecca3fef18c90e4eb26e3c51ec782431baa50bf2277e7f3e27"
|
||||
"version": "repo-file-v1:sha256:0ca046969bd969fa4d4f4d245220726eb709fe97d4df67d7969b19807a8aae32"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/HostEditor/HostEditorView.swift",
|
||||
"version": "repo-file-v1:sha256:a71a870383335276f0190eb1f90be657a7ce100f5ad68ec0fb6bb067fbbcd499"
|
||||
"version": "repo-file-v1:sha256:f41c78c72a142dce4b642c6e9a9a9efd93f550d9e040e15cbd2993ab0cf2f08a"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -566,7 +530,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/HostEditor/MobileHostEditor.swift",
|
||||
"version": "repo-file-v1:sha256:d2792158c62c3eecca3fef18c90e4eb26e3c51ec782431baa50bf2277e7f3e27"
|
||||
"version": "repo-file-v1:sha256:0ca046969bd969fa4d4f4d245220726eb709fe97d4df67d7969b19807a8aae32"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -576,7 +540,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/UI/Components/MobileEditorSheet.swift",
|
||||
"version": "repo-file-v1:sha256:f45f9043646b512f8fa210254172e922b2f2322339321d45b65b5e7f810095a6"
|
||||
"version": "repo-file-v1:sha256:1ac73af36fbba10f888b4b6d14c6ae03505f9033159e218888aeb7f4954a1e4b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileEditorToolbarTests.swift",
|
||||
@@ -590,7 +554,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift",
|
||||
"version": "repo-file-v1:sha256:2bc72f38966ee4942aff636233d023f6fd7899afa834a4c6d3899e56e382e7d1"
|
||||
"version": "repo-file-v1:sha256:8ede24734501a15d123f6d1578103ea2386d2a44c797e4723b1dcdfa15455944"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -600,7 +564,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/UI/Components/WindowToolbar.swift",
|
||||
"version": "repo-file-v1:sha256:2bc72f38966ee4942aff636233d023f6fd7899afa834a4c6d3899e56e382e7d1"
|
||||
"version": "repo-file-v1:sha256:8ede24734501a15d123f6d1578103ea2386d2a44c797e4723b1dcdfa15455944"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -610,7 +574,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindPresentation/AgentToolPresentation.swift",
|
||||
"version": "repo-file-v1:sha256:51672921c0a7180ee5ebe102540f2ea500e272801e87c31ed9fc83ad3640b91d"
|
||||
"version": "repo-file-v1:sha256:9065cd3b8a95a963dd472af0623de9ae5241b3c8ca8768ba5dd71817ee1c0767"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -620,7 +584,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFITests/MobileCardTests.swift",
|
||||
"version": "repo-file-v1:sha256:45c1ade664772060183a9c8babc283fd04b1698c2e7ec6879724c5373b657622"
|
||||
"version": "repo-file-v1:sha256:667200b9f2a179409df921dc6d6471f4ff081a98c462dfc0dda8fe9a08d35f24"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileEditorToolbarTests.swift",
|
||||
@@ -631,6 +595,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:d346d4ae2b393ff1fa231f3fdb05e737eded8665a2627acc44df7c382333a96c",
|
||||
"pageVersion": "sha256:462d6503cb6b0ad2bd0a90ca359bc490fec86311945bb735c8dfd20e4b83ed5b",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_b47979774aa94e7dae517a6894c508d4",
|
||||
@@ -8,11 +8,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:846cccb0bc643b8f8c6c54dc70c1928a29218a885598274f1ef689e239b1aa80"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/MCPServerController.swift",
|
||||
"version": "repo-file-v1:sha256:7374829e1807503b67c654c88edc8dba34bbd50a8499c6beec23170a73745c99"
|
||||
"version": "repo-file-v1:sha256:c5176c9083a21a9f97844730e93608df4897b24b4cadbc328e81dfb46f88641a"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Infrastructure/Networking/LoopbackHTTPServer.swift",
|
||||
@@ -47,20 +47,16 @@
|
||||
"statement": "The server token is generated from 32 secure random bytes, stored in this-device Keychain, and migration from a legacy iCloud value verifies the local copy before removing the cloud copy.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/MCPServerController.swift#L129-L152",
|
||||
"version": "repo-lines-v1:sha256:ab4b08773d9d8a61cc5c04655ea8f810639d3bd7ab78278d08394f677647eb32:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJiNmIxYzBkZDkwZjExYjQ2ZWVkMDlkMTUwZjA2N2UyZTYzY2RkNmY4N2NjZGVmZTg1MTRlOTRkZGRkOGVlNjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZmMGQ3NTk1MGRmMGZmOWEzZWU5NjYzOWRjYzhmZjVlYWVkYjQwZDY4MmJlYTkyNjIyYjUyMGRkODg3ZDkzZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjllNjc4ZmFlYWE5YmQxNTRlYmUxOTU1NjMwMDIyYzM1MGI5Mjc3MWUyYTRiNDdjNzkwMzJlNDk5NzY0ZjRkNWEifQ"
|
||||
"resource": "repo://TFM/App/MCPServerController.swift",
|
||||
"version": "repo-file-v1:sha256:c5176c9083a21a9f97844730e93608df4897b24b4cadbc328e81dfb46f88641a"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/MCPServerController.swift#L233-L242",
|
||||
"version": "repo-lines-v1:sha256:520a64029cab5c469abb1bde7c8c95300edd2cef0e0a8ddfd43159a7e4a5da9a:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ1ZjZjYTcyNzNiYThjNTMwMTZhNTM3ZjcwMzhkOWQ3OGYzOWRmZjQwOGM0NjRlYWVmODhhZmZmMmNiZjQyYTMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRlODJhY2NlMzljN2VkNmY1NDNlZDc3MTFlY2ViNjM5ZmQyNTBhMWUzYTlmYzJmZTY2MDg2OTM4NGE3NjNiYWYifQ"
|
||||
"resource": "repo://TFM/Infrastructure/Security/MCPServerTokenStore.swift",
|
||||
"version": "repo-file-v1:sha256:c9e2fd8b5799e2600c1579b442843811d577872115102655a406fced6468a6e7"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Infrastructure/Security/MCPServerTokenStore.swift#L5-L53",
|
||||
"version": "repo-lines-v1:sha256:f66f4dcd12dae6f36149c831148c27a30308219521c8d4559dc0fe0ed2d51866:eyJzZWxlY3RlZExpbmVDb3VudCI6NDksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVhNTVlNThlNTkxODdlOTY4YWJmZGQ3YTA4ZTYzYmExNGQ4MWM3Zjg4ZDNkYzMwMjNlZWE2YWQwMjc1MzAzZDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVkZGI4NTc4MDBhNWQ3MjQ3ZmYyM2M1Y2Q1ZTUyYzU0N2JiZjRiYzM2NWI5YTc0MjY5OWVlMzNkYmIyODkyYzAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoxLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/MCPServerTokenStoreTests.swift#L10-L66",
|
||||
"version": "repo-lines-v1:sha256:9eaa24bc68f6e54b118f88a95b778b036a9796deb0ddae0e3b59ad724a652610:eyJzZWxlY3RlZExpbmVDb3VudCI6NTcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJlNWQ2MmM2MjE0NTk1MzVlNmE4MGJmOTJjMTA2MDZlNzY4ZDFiYjZlNGZlNjFmZWQxYWJjMjMyYTFiNjVjODEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJlZGFjMjZiMzJhOTI3NjVhOGFhODNhNDk4MTFiY2RlYzNhMWMzYjMyNmJhMjhlNjU2M2Y1MGU0Zjg4YWU5ZDQifQ"
|
||||
"resource": "repo://TFMTests/MCPServerTokenStoreTests.swift",
|
||||
"version": "repo-file-v1:sha256:5c60f36c92325f7cbcc52f3ee817c478207b8ff366242fa15858f9a6c36e3e62"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -69,16 +65,16 @@
|
||||
"statement": "Rotating the server token stops transfers and MCP sessions, replaces the HTTP token, disconnects active HTTP connections, and requires clients to use updated configuration.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/MCPServerController.swift#L129-L152",
|
||||
"version": "repo-lines-v1:sha256:ab4b08773d9d8a61cc5c04655ea8f810639d3bd7ab78278d08394f677647eb32:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImJiNmIxYzBkZDkwZjExYjQ2ZWVkMDlkMTUwZjA2N2UyZTYzY2RkNmY4N2NjZGVmZTg1MTRlOTRkZGRkOGVlNjkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZmMGQ3NTk1MGRmMGZmOWEzZWU5NjYzOWRjYzhmZjVlYWVkYjQwZDY4MmJlYTkyNjIyYjUyMGRkODg3ZDkzZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjllNjc4ZmFlYWE5YmQxNTRlYmUxOTU1NjMwMDIyYzM1MGI5Mjc3MWUyYTRiNDdjNzkwMzJlNDk5NzY0ZjRkNWEifQ"
|
||||
"resource": "repo://TFM/App/MCPServerController.swift",
|
||||
"version": "repo-file-v1:sha256:c5176c9083a21a9f97844730e93608df4897b24b4cadbc328e81dfb46f88641a"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Infrastructure/Networking/LoopbackHTTPServer.swift#L148-L152",
|
||||
"version": "repo-lines-v1:sha256:86543ac0371093fc5a685ec526cd2647bbe8532141e51f837d23557ab6542ab3:eyJzZWxlY3RlZExpbmVDb3VudCI6NSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYmM5ZWRjZTdmMDVhNjVmNGMwODA4ZTEyYjBiODJjZWZjMjlmMTQ1MDFmZjZlZDE5ZDJjNmRjZmRkMGYxYWZkYyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiOTk5YmRlZmVlYWNhNjM0MGUwMjkwZGM4NmU4ODljODlkNWUxODlhYTViYTQ0YjU4NWIzYjcwNzM0ZjRhNjJkOCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNDdlMWY4ZWE3MTgyZTZmYTMyMGU0YjAzN2MxOGIzYzk0MDk1NzhmNjVjMTYxZjhhOTlmNzA2NjBlOTliNzY0OCJ9"
|
||||
"resource": "repo://TFM/Infrastructure/Networking/LoopbackHTTPServer.swift",
|
||||
"version": "repo-file-v1:sha256:5a91a4b29083f71858834b4b1adee9fb64551de704e850ebe8026926ff9a6b9b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/MCPClientSetupCommandTests.swift#L64-L82",
|
||||
"version": "repo-lines-v1:sha256:023204a2c6d366443d1203918643935a10d0404b36cef8c7ce1c6521a982a527:eyJzZWxlY3RlZExpbmVDb3VudCI6MTksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI4YzY3YjYwMGU3NzcxMzRhZGFjNDEzNjMwNTZiNzc5ZDczMmE5MjUwN2FhYmM2NDdiOGY2YmMxMzkwMzRhODIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImFkZGNmZTI4ZDdlYTUxZmY4NzRiYTM4OTExMjA5NWY3Y2M4ZTg1MDgxZmVlMDkyOTY0MGJhMWUxMTViZWY4NTgifQ"
|
||||
"resource": "repo://TFMTests/MCPClientSetupCommandTests.swift",
|
||||
"version": "repo-file-v1:sha256:1d55562948bf055111339f081871ee9095a9daae5b806d648e7583615fc496ef"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -135,24 +131,12 @@
|
||||
"statement": "The external registry is an allowlist of Termind host tools plus request_user_secret and transfer tools; disabled tools are omitted from discovery and cannot be called, while disabling upload or download revokes that direction's coordinator.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPServerTools.swift#L183-L211",
|
||||
"version": "repo-lines-v1:sha256:e65acffc19af44a25ec55b13ae180d24988b848bf32107c1dc55fdbb203c10dd:eyJzZWxlY3RlZExpbmVDb3VudCI6MjksImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjY5OGU0MzcyYjgwNTM0ZmI5NjNmYzVlNGFmZDlhY2JlZGQ0NTNhZWEzYjU0ODAzMThmMWE2MWZmZTQzNGMyMTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU2YjA0NDkxNDY5NzIyZTgzNjNhOTRlNDA0NDUzOGUwMTNhMmEyMTdlMzZiMWU1NjhiYTYwYWNiN2I0YzhmMmUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImVlYTYxNGM5ZTJkZjc0NWU4Y2ZkZTdiNGIwZThiMmE5OWYxYTNjMTM3YmEzMmE5YjE4YzQ4MzBkMDg1NTY0M2IiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUifQ"
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPServerTools.swift",
|
||||
"version": "repo-file-v1:sha256:11a618b54c8c7c8cf212423feb11ef58ee507f58a852a9fa4a7e5fd06bdf2800"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPServerTools.swift#L7-L13",
|
||||
"version": "repo-lines-v1:sha256:37e1cc2fd471a7feaba49f4edbfcbc40f04e035bbf4b08b3f68416aa598e3d88:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMGI0NjVkOWExMDQwNDZiYTI3NTgwNTQ3ZjNlZDgwMmEyNWExYWUxZjhjZWYxODYyNjMyZTY0ZGQwYjUwN2U3OCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYWRkMjQ0NTgyYjZmYjAzZDIzYjg0MTVhYmVjZDM0NmIwYzlmNDY2YjZmNzUyYjA2ODE4OWNlN2U5YTJkYzM1MCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMmE0ZDY1ODhmOWI3YWQwODA5MzgyODExMDk1NTQ3ZTJjZDE4OGEzYTM0ZDMzM2E0OGQ4YmM5NzgxZDY0NTM5NyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMGY0ZWNlYzhkOWUyZDdhM2I4MjVjMTVlOTc2MjQwMmExZDZlZDIxMGI1YzVhNTQ5NWEwMjBjYmJiZDU1MzA1ZiJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Application/MCPServer/MCPServerTools.swift#L81-L118",
|
||||
"version": "repo-lines-v1:sha256:7f52edfeccd8a684b8b897873405fa21702498b14be32417802dd124eaa3b2ae:eyJzZWxlY3RlZExpbmVDb3VudCI6MzgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE4ZWM0MWMzYmVkYjQ5MGE1MzIyZDJkZWRmNGYzZDYyY2U0NjE5YzIwOWNlNmY5ODk2NWM5ZjgzMzRlMDVmYTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImRmNTYyYzdmNzMzNjJhZTBlYzk1MmM4M2ViMGJjYjIxYmE2YjBjNTM4MzY0YjExYzAwMGNlM2ZkZWU2NjNhZDUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjQwOWQxYTBlZGQxY2RmNzllMjI1Yzg3ZDFlODMxYmMwMTU0ZGExNzA1NTZhZTFkMzBlMzZkNDg2ZjhkZTg3OTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjE3ZmZjZjA0MWQ2MGRmODliNjFiYTQ4MDFmZGUxMmE0ZDI0MTBiZjJiZmJiZjRiZjc3YTcxOWQ4MTNhYzg4NWIifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/MCPServerToolsTests.swift#L100-L140",
|
||||
"version": "repo-lines-v1:sha256:bbe609256f29f5d3f57df07fd079fd2175c599b92d24faf60060b97a17b592d7:eyJzZWxlY3RlZExpbmVDb3VudCI6NDEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA0MWJjMzU3ZWE2YzA2MmNiNjE1MGRiZmIwY2Q3YTBhZTM4ZTA3MTllYzU1Y2QwOWY0OGY3Y2U4MGVjOTcyZmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU4ZWFmM2UxZGIyODRmNmE2ZmQ0ZTA2NmFlMmZiNjU0YWU2OGZkZmNmM2U3ZTRkY2E0YzJkZDIxNGE0OWI5ZDAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhjYzgwYmFjZGQ0ZWUwOTdkYmRlMzFjZTEzNGIzM2YyODlhMzVhMWM1ZTBmZjNhYmFhZWI3YTVhNmY5ZmVmNDEifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/MCPServerToolsTests.swift#L163-L175",
|
||||
"version": "repo-lines-v1:sha256:bdac8ae222cc6ca064fa19fd6dff53d846496c96a833df866044e6f194e139c4:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImE5MTFhNjcyMTJjNDdjOGU2Zjc3YzQyOWVmM2YyYmIzMTQ3MDY3OWVhNjEzMDc1OWJkZDZkZWUyYzVhY2MwNmIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJkZDA4NDk0MjZmMmNmMDE4MTZiNTkwMzQ0YTBkZTI0NDUzNTVkZjliNDdmNjYyMGY4YjA0ZTI1OWYyMDg0YzgifQ"
|
||||
"resource": "repo://TFMTests/MCPServerToolsTests.swift",
|
||||
"version": "repo-file-v1:sha256:81652bfa7ed8a9fcce7ddb2e714c8b13bdb94006619b036a5e614ff613088433"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -345,6 +329,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:18c4ab0086670df59a492485fb84903a16daf0e41e8c32cff217d1330fd49d7d",
|
||||
"pageVersion": "sha256:29aa2f5bf72e8583c20c85dcea07ef8830297cf0f9ced9fa799a8490fd45c01a",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_d34d7b16495a44a4a946d3dc9e0456f4",
|
||||
@@ -73,8 +73,8 @@
|
||||
"statement": "`Scripts/check-zh-localization.sh` validates the target catalog JSON and, for both `zh-Hans` and `zh-Hant`, rejects missing locale entries, unfinished or empty translated string units, and specified Chinese/Latin or punctuation spacing violations.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Scripts/check-zh-localization.sh#L3-L63",
|
||||
"version": "repo-lines-v1:sha256:b37758f253f9959a2d7753b617b2cbeabf5d669ea6e0a24b89b4deaa44fb6e82:eyJzZWxlY3RlZExpbmVDb3VudCI6NjEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg4ZmM2MzM2NjdkMDMwMDczMWJkZDg0NDcyZGM0MjRlMWY5YzY0MTc1ZWEyYmFkYjY2NjQ3MmQ5MWFlYjRlZmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQxMTdmYTAwNmJhOTIwODUwMGIyOTMwY2U2OWNiZGU0MzZjNjQ3YWZhOTE3Y2I3Mzk2YTliYzkxMTFhNDZkZDIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjoyLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQ5NjIyZmFlMmFiMDJmZTM1OWVkMTUwOTY0YTkyNjUzNjk3YmZiMjM1ZTIwOTQ3YWEzYzNmMzg1NDg0ZTk3YmYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjoyLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijc4OTQ2ODJhNmM3OGFiNDA4MTM1NDJjNWNhZjRhYTFiYTAzNTc4YzUxY2Y3YTI4ZTU0MDVlZDJhMDUyMzBhNWEifQ"
|
||||
"resource": "repo://Scripts/check-zh-localization.sh",
|
||||
"version": "repo-file-v1:sha256:305b4c1458a71783b51720861f2a4a1452bd28a8b9478ddae38b4c775f52eb97"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -83,8 +83,8 @@
|
||||
"statement": "App-facing text belongs in `Frameworks/Resources/Localizable.xcstrings` and metadata in `InfoPlist.xcstrings`; changed English strings require finished Simplified and Traditional Chinese translations in the same commit, while AgentKit’s catalog must be built with `../AgentKit/Scripts/build-localizations.sh`.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md#L46-L48",
|
||||
"version": "repo-lines-v1:sha256:5e69d5ddf8b0181f834edfe8f463b1ddc71ce0c0c26beaa6f4dc0cb63b7f1c67:eyJzZWxlY3RlZExpbmVDb3VudCI6MywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiN2ViNmVkNjM3YmU2ODNjNzYxMmY2NzdlYTllMWE1NmI5NjU5OWU3NzJmNmQ3NjkwYjQyMzc0MGNkMTRhZmZmNyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiODQ1MThlZDQyNWZhZWNhNTgxNGExYzEwMTU0ZjEzMjgxOGViM2VjMGI2ZTgzOThkZjQ5NGI4YWRmN2MzYTI0NiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNjZhNzFhZDgxY2FlOGI3MGJiZDYwMzkxNzllYTExZmU0OGExODY0YzdmMDcwNzU2MDQwYWJlOTYxNmVhNmMyYSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMGVkYzQzMzI5OGFkNTgxMjllZTBhODg1MmMxM2Y1MjkyMGRhYWY5NGE4YzY0YTQ4NzFlZWVmNDZlMTMxNWVkMiJ9"
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -293,6 +293,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:40b2afc40830a574689fa94f4912436c70b25c0f10741b865ad55d6364fe7f1d",
|
||||
"pageVersion": "sha256:c888af748fedf1b3bb6c77aec9cbb46ff10d9b838e412cd4b69eeff363e79aa4",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_bf6e7f1d333040099a25edc9d0d96b84",
|
||||
@@ -21,8 +21,8 @@
|
||||
"statement": "The mobile screenshot runner uses iOS/iPadOS 27, captures English, Simplified Chinese, and Traditional Chinese through `MobileMarketingScreenshotTests`, validates expected counts, and supports scoped device/scene runs without requiring an iPhone for iPad-only capture.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Marketing/README.md#L14-L48",
|
||||
"version": "repo-lines-v1:sha256:14443f6764d44ce29817ccd4f7d2083a64a9fef3a1aba87d02c19be27da5400f:eyJzZWxlY3RlZExpbmVDb3VudCI6MzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjJmMWY1YzVlZWVlOTQ1NjZhZGFkOTQ5YmQ1ODhmY2IyN2YxMzkzMDVhNTFlZDk4ZjBmMmY3MmQwOTBlYjVjYmMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJkZjI4NTlmYjAyYWVlMjI5NGVkNjljZTJkOWZjMjE1NTcwNGU1ZTUzZjg4YWZjYTcxNmQ5MjZhODE2NTBmNzQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImViNDFiYmQ1MmFjOWEwMDUxMjRjNWM4ZmZkNTM5NGQzY2ViNjZmMGY2OGVjZjlkZTljOTA1NWYxNWNlZTVjMzgifQ"
|
||||
"resource": "repo://Marketing/README.md",
|
||||
"version": "repo-file-v1:sha256:97866af84c8b01df60e0e125b61a85836eaa9156052aeac3c3ddb0c234cad81f"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Scripts/run-mobile-marketing-screenshots.sh",
|
||||
@@ -30,7 +30,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileMarketingScreenshotTests.swift",
|
||||
"version": "repo-file-v1:sha256:e6d64ebc5a15d70f6184596ceba3d177f624ba0de28b2eaf66b129db499ca629"
|
||||
"version": "repo-file-v1:sha256:0f8ab7edddd7f46eff7dd9243f22784bf17088e42b5d014ec07f21a30afce0f3"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -165,6 +165,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:08:51.776Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:ed6123ee29f371389d58e4ef425a381efb7f9a251c135b317d168b2e7ec27e70",
|
||||
"pageVersion": "sha256:6a6857a00d792e9e7b897cf3f286dd9e8566f45c5e69a055a099f5e38b25d3d7",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_83870f4f1ad6403ea0d8bd8775729a76",
|
||||
@@ -26,19 +26,19 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:f7b86ed89575ed3b8d34683c776d646efa81ead11ae75f125ed47b2ae384e99c"
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:a6722f9b8e04de670c0e17ec823b23cd344c8cdfe9286052edb9bca9854f43f4"
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:fcf66bc2cd5aa8569f2f1a7074d91ede68b5509b387d5c14508affb8f79ba8a0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift#L17-L49",
|
||||
"version": "repo-lines-v1:sha256:5378245de6560216abc946f80d35ae4ac1d05326e7dee33f0f8b484c8de1cbdc:eyJzZWxlY3RlZExpbmVDb3VudCI6MzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU0MzA5NzdmMDljNjhmODk4Yzg4ZGI3MTdiYjU2M2QxMTU4OGZlODRjYzRmOGU0MDVmODE4NDg5YzFkOWZhYTEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBiMWE5YmJlNjcwYmE1NGE2ZWNiNDlmZGE3NmJiMjNiYTgxNzFmNGFlMTYxY2NkY2YwNDkwMmZjNGNhOTY2MzUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImEyNDgzZjMxMjRhMTUxZjE0YjJjNmU4ZjRkMTEwYzc1ODVmZTE0NWM0OTdkZDE0YjEyYWJmNjAwN2IxNTA5YjAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjI3MWYxYmM2OWQ3YmZkYjJjNjU0ODUzOTY2MTllNTYwYjk2Y2I0M2QzNTZmZGQwNzdiMGM1MzZlOGNlZTJkODkifQ"
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -48,7 +48,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:fcf66bc2cd5aa8569f2f1a7074d91ede68b5509b387d5c14508affb8f79ba8a0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -58,7 +58,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:a6722f9b8e04de670c0e17ec823b23cd344c8cdfe9286052edb9bca9854f43f4"
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -107,12 +107,8 @@
|
||||
"statement": "Routine Xcode validation must use `-onlyUsePackageVersionsFromResolvedFile`; the repository defines TFM/TFI build entrypoints, strict Swift formatting, and a localization validation script.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md#L26-L34",
|
||||
"version": "repo-lines-v1:sha256:a91f88bee69fc799fe765bb122f6b5106642c565be05fb945780ea3d3248ebf3:eyJzZWxlY3RlZExpbmVDb3VudCI6OSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNTczYmEyNjc2YzMzZGE1MjMyNTFkNWNjZjUzNjViODFhMGEwMjMyZWU3MGI3OTFlNmJjMTNmYTIyNTFhMGQ4MiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYjNkZGYwYjM4NzRlMWFmZmJlMzgwYTg1YWUxM2E2MDNhMzNjZmNmMDQ4YzBmNDM0NTNmYThkOTY4OTcyOTk2OCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMzE4ODJlOTJlMDU3MTI0MDRlN2M4MWQ2Mjc2NTIzMWQ5Y2VkZjg5MGNlNmUwZTVlMDBhZDk2NzIzOTA5YzA3OSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNTMwM2VlYzhlNjU1MjZiMzI1MWUyNDRmNjljMGIwOTMwY2ZmNTFiZDhiODRkMzZhMzk1NzJlZDg3YjIyOWZkOSJ9"
|
||||
},
|
||||
{
|
||||
"resource": "repo://AGENTS.md#L40-L48",
|
||||
"version": "repo-lines-v1:sha256:1504391daf2c6128093191cf4154eebb7c2a830ea322086e3cbf2a30066708cc:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijk3ZmM5ODZlZjAxZWU1ZjU4YzZmMWZhMjY1YjhhNjQxMzExNjhmOGFhNTk5M2Q3ODg2ZDk2YzZlMTg5ODk0MzIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijg0NTE4ZWQ0MjVmYWVjYTU4MTRhMWMxMDE1NGYxMzI4MThlYjNlYzBiNmU4Mzk4ZGY0OTRiOGFkZjdjM2EyNDYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQxZGE4Nzc5OGNjOTU3NTdiNzc0NDU4ZWM0OWI4NDFkY2FjMzgwNTFkOTI5Y2RiOTgxOTBiYjE3YjI3ZGZkODgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjBlZGM0MzMyOThhZDU4MTI5ZWUwYTg4NTJjMTNmNTI5MjBkYWFmOTRhOGM2NGE0ODcxZWVlZjQ2ZTEzMTVlZDIifQ"
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -132,11 +128,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:b24747ff9dedd849a5aabeba6b978fa6c7e3b61954033dcee5163d5ed8064123"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:f7b86ed89575ed3b8d34683c776d646efa81ead11ae75f125ed47b2ae384e99c"
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -146,7 +142,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:fcf66bc2cd5aa8569f2f1a7074d91ede68b5509b387d5c14508affb8f79ba8a0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -156,15 +152,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:197fa5f7cbf890923e277a7e68154263c39a7c6751f07f399bf960ab016ebb41"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:fcf66bc2cd5aa8569f2f1a7074d91ede68b5509b387d5c14508affb8f79ba8a0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/AppTerminationTests.swift",
|
||||
"version": "repo-file-v1:sha256:b20c89cdeef69667b3220ca2e4ce86656855ed4b9d942a4b1dfd0f046bb4ecdc"
|
||||
"version": "repo-file-v1:sha256:61e14261971e275798d4cde5275e5c3e0dc0d5552beace53b81e1ed3842358eb"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -174,15 +170,15 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:b24747ff9dedd849a5aabeba6b978fa6c7e3b61954033dcee5163d5ed8064123"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileRootView.swift",
|
||||
"version": "repo-file-v1:sha256:f7b86ed89575ed3b8d34683c776d646efa81ead11ae75f125ed47b2ae384e99c"
|
||||
"version": "repo-file-v1:sha256:b2e3a927ec2eeb48b6bcf9b186a3c5541d86848d10425a29d6cb9383ecd900d0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/App/TermindIOSApp.swift",
|
||||
"version": "repo-file-v1:sha256:a6722f9b8e04de670c0e17ec823b23cd344c8cdfe9286052edb9bca9854f43f4"
|
||||
"version": "repo-file-v1:sha256:62d2846629487dc148a1113d7d21298d7389693debd1c2f51b61ed640ada69fa"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -192,7 +188,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:7c19a99ec73d4473ac94bb134b62a1306c62d1285e5b8af26430f1d466de35a7"
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFITests/MobileEditorToolbarTests.swift",
|
||||
@@ -210,13 +206,13 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://AGENTS.md",
|
||||
"version": "repo-file-v1:sha256:7c19a99ec73d4473ac94bb134b62a1306c62d1285e5b8af26430f1d466de35a7"
|
||||
"version": "repo-file-v1:sha256:d7c3eef4470b008b0c7d11eca7bf62d8d73533fa170f82d085e3d45376adec6b"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:15029cc4d76549f995f92d10b81402f0764575eeb49c402d9577fa1bc5c8756d",
|
||||
"pageVersion": "sha256:bfbd13a0e66214bc1898aa094fae604d76fbba1105f9b57fee0124dfe0d5ad5b",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_b7fbd64158554b8b8ca80a0a613b3bc3",
|
||||
@@ -21,12 +21,8 @@
|
||||
"statement": "ArchitectureBoundaryTests protects import and model ownership, rejects local AgentKit type redefinitions, and checks that all three CloudKit coordinators retain the shared safety gates while the lifecycle stays independent of SwiftData and Persistence imports.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L137-L223",
|
||||
"version": "repo-lines-v1:sha256:46de22dba5c1a56c0f11f63a5dc40aca60e3e250d1e6327a2ae912dc2bd4330c:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAxLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiIwYzliZjYxNmRjZjUzOWEwZDU0YTEzNmM2NjRjNTNhMjU5ZWZhZDljZjVhZmE2OTA2OWZhMzhiNTMxOTk0NGM1IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MywicHJlY2VkaW5nQ29udGV4dEhhc2giOiJhNDdjYWI2Nzc1MTJkY2VkNGEyMjBlZGRkODYzZWQxZTQzNTkzNDZkYmE5OGQ5Y2I5MGQwZmY5NjI4YzNiMzRhIiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MywiZm9sbG93aW5nQ29udGV4dEhhc2giOiIwMzllYTJhOTc0NjI1OTdjMDZlNzgxMmQ2ZmFkZDcyZDEzZjE2MTA5YmEwZGU4MDlkNzI0ZTNhNzU0NWY2YTc5In0"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift#L64-L106",
|
||||
"version": "repo-lines-v1:sha256:08c476cc632f29ebd0f9b7221558d60dc77bb9ac8d88d819e4d8841a8372d835:eyJzZWxlY3RlZExpbmVDb3VudCI6NDMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRjZjA5ZWIwYzU3NDRmYjk3MzMxYjk4ZmYzZmJmMDVhNjAyYmEzZjdmNjdlNWRhNWJlOTA5NTAzM2Y2MjU4MjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM4NWJlNTRjNmM2MGZmZjQ5ZTllOTU1Mzg1YjMzZTc4ZTRkNGQ4ZDJkNmUwMWQzMzJkNjhiNjg3MTA0OTkxYTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNiZDllMTYwYTMyNWIzNzgxZTQ5M2JlYjYxM2EzZjhjZWMyZTNkZDQ1OTVjODgzMDg2MTQzMTVkODZhYjdjYTgifQ"
|
||||
"resource": "repo://TFMTests/ArchitectureBoundaryTests.swift",
|
||||
"version": "repo-file-v1:sha256:7909f5be1f0742e4dae9989a00e7801c7ddc9e6cf72be4d24bc1108e2c393cfd"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -224,7 +220,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/ConnectionHistoryTests.swift",
|
||||
"version": "repo-file-v1:sha256:a7e161c0b2e3a5b47a1b33440a679238d66ae75666621b4fa529b79d860de0d2"
|
||||
"version": "repo-file-v1:sha256:f3b747511e6cffcb8b8117b78bff299e9f17e98dd2b0161ccd9c4cd82aa1e8a2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/VaultSyncTests.swift",
|
||||
@@ -439,6 +435,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:bcad80bdae1c2dda36b882117fd053a20bce47dd9c10174cdbaec582ae1b38a5",
|
||||
"pageVersion": "sha256:b60d62fe8a8dc744b46cd92cf5cac00e7c8f44d64f4bc7ddc94dabcaa5ba3be6",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_5ca6241ea6cc4ebbb915ccbe304f8430",
|
||||
@@ -125,16 +125,16 @@
|
||||
"statement": "SFTP preferences default to 30 global and 10 per-host transfers, normalize limits to supported ranges, and in Smart mode select channels for unknown sizes and files through 64,000,000 bytes but prefer connections above that threshold.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindDomain/Transfers/SFTPPreferences.swift#L3-L46",
|
||||
"version": "repo-lines-v1:sha256:fb21f79fbec67a7addfb826ee8cb8cb2c60fe1b9db9b9c64446c343b13460ced:eyJzZWxlY3RlZExpbmVDb3VudCI6NDQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjZkYmFjZDY2ZTAwMmIyMjBjZmJmODIwNjAyMGI4YmY3NDhiMjU2MTM3Mjk1YTQxYjY0NDg1ZmM4N2Q1NjhkZDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjoyLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjExOGJmY2MwNWRhNWVkOWI1NWRjNTcyNWE0ZmNkYWVjNWMyNTc1ZmRmNGNlMjJhMTk5MDliMWIzZjRkZTgxZmQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg1NjlhODFjNDA0OGI5NGZlYjQ5OTE5ZDA4ZDkwNDU1NTBjNzNjZTMwMGE1NjQ5Y2I0NDMyZWU0NmYyZmU1NzUifQ"
|
||||
"resource": "repo://Frameworks/TermindDomain/Transfers/SFTPPreferences.swift",
|
||||
"version": "repo-file-v1:sha256:e89a7a8dbb9f06e1fb09caa64aafd1cb723a387dfc10298190ac0eca63968274"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Transfers/SFTPConcurrencyScheduler.swift#L169-L182",
|
||||
"version": "repo-lines-v1:sha256:6ede6cd5e9b2351dbd9fd55c595e761d34c268db3f909d18087b64fa1ecf06d3:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjVkNjQzODE2N2U1MmE1YjVlOTM5OTdiNzcxZDBhMzcxOTc4ZjdmYzU4M2FiMjE4MDZjNzlhNWUwYTJjZTIwYTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjY4YWNlOWI3NWYyZWQ5ZTRiMDk4NTZlNGJjYjFhMDJiMzVjNzY1MzRjNzhiZjM0MjZlYjllYWQxNWM2YmUyYTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFmNjU1MDc5MjZlNjQ1MWUzZmYzNWIyNWUzNTM0MmU5N2ZiY2YzYTI2YTgwNzdmNzFjMTJkYmQ1YjM4OTYwMzMifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Transfers/SFTPConcurrencyScheduler.swift",
|
||||
"version": "repo-file-v1:sha256:5de1464ab564c4f8e6f070cfcfb9b58d10ce2ed5db963787ea3e9a1b412755cd"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFMTests/SFTPConcurrencySchedulerTests.swift#L7-L30",
|
||||
"version": "repo-lines-v1:sha256:17ec895194d1226bd9693c140cb453d4f30add3eb193a93ae0c527e6da2cb426:eyJzZWxlY3RlZExpbmVDb3VudCI6MjQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhZDhjODFjZmIyYTA0ODQ3MTVmZGVhY2E4NTI1NDA1NjVkNDIzMTU5YWVmMWM4NGM0MDE2YmZjZWMyMjcyODIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImNkMTZmOTdkOTZhZjllZjZjYjY3NGUyNzIxZTU3MmQ2YTFlNWRkOTY4MDJmOGIwZmIxM2RhZGVkNGI3NjYwNGEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjZjZWM0NGYyMzYxNDlmOTRhMjViZjU1ODMyODM3YWMzOTIxMGIyYjc4ZGFiYTNhYzM2NTMzMzNjMjE3YTc1YWYifQ"
|
||||
"resource": "repo://TFMTests/SFTPConcurrencySchedulerTests.swift",
|
||||
"version": "repo-file-v1:sha256:e9869b4861a2b8e6254f0cc5147eea37d97e79c7425a7fd875f81b2b1ab35a34"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -585,6 +585,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"pageVersion": "sha256:557605f4c9e89cf5b14379eef061940a994954d683d87ed5f0e24b963c46f493",
|
||||
"pageVersion": "sha256:503379f21394a5ffaf194d839a1d25373ac2362438ec7b26230e68367bc3c414",
|
||||
"claims": [
|
||||
{
|
||||
"id": "claim_69a9de4ce918417c8a44c6c87c9f6564",
|
||||
@@ -122,11 +122,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:b24747ff9dedd849a5aabeba6b978fa6c7e3b61954033dcee5163d5ed8064123"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Features/Workspaces/MobileWorkspace.swift",
|
||||
"version": "repo-file-v1:sha256:3d05ec07c3ea60a68e5a292a2c934ae7f24cc1fd674b1b76dc1003b84fed0059"
|
||||
"version": "repo-file-v1:sha256:c2f5bd4b56b1c901b8f139b34372452037e6c95315e1dc3e50b08f3215f5d748"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Infrastructure/MobileWorkspaceStore.swift",
|
||||
@@ -134,11 +134,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:fcf66bc2cd5aa8569f2f1a7074d91ede68b5509b387d5c14508affb8f79ba8a0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/Features/Workspaces/WindowModel.swift",
|
||||
"version": "repo-file-v1:sha256:4bd147972cb9d30bebe48592542710683383b5deaa2e3d1a49ac0dbbcce44644"
|
||||
"version": "repo-file-v1:sha256:ad326c25de97ff0db512504dc76b0a54803262a431d22b354c91044dd55b9cd0"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -147,20 +147,8 @@
|
||||
"statement": "Telnet uses an independent direct-or-proxied TCP transport with generation-guarded callbacks, incremental Telnet negotiation and charset conversion, and consumes an automated password once; it is not an SSH trust, jump-host, or SFTP transport.",
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L151-L233",
|
||||
"version": "repo-lines-v1:sha256:9b13be41cf88cf1e5213f4db60fbd614dae3df88b619b0434559fe7e8ad24548:eyJzZWxlY3RlZExpbmVDb3VudCI6ODMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImI1NzA0M2EzYmQxMzJiYzI1MGJlMmZhMzZiODg4NzQyYTkxYWJlMzg1ZGQ2NjdlYmE0ZGJlN2U0Yjc3YTlkZTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijg0YjdkMWExNGNjOTYxYjRiYmZmZjVjZDc2NGM3MmJjYWI3MGNiNGIyYTJkODgxOTlkYTFlZjkzZjNjYjJlYjYifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L318-L405",
|
||||
"version": "repo-lines-v1:sha256:307f9a8afc7e3e83c78636303370bebf741309df69f1208f98d6877953d43159:eyJzZWxlY3RlZExpbmVDb3VudCI6ODgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjM2MWQxODI3ZTg0Zjg4MTFjMGJjNWJmNGRjZTcxNTIyZDhiOGQzNDA1NTI1NjE3YTRmMWNmYTcyOGE5MzdiODMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6Ijk5OWJkZWZlZWFjYTYzNDBlMDI5MGRjODZlODg5Yzg5ZDVlMTg5YWE1YmE0NGI1ODViM2I3MDczNGY0YTYyZDgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhlYWZhZDVkYjRkNmZiMjYxNjIyMTdiYjE5N2Y5NmRkOTMyZWUxNTY0NzIxMDEwNDUwYjYzNDhhMzExODNmYTcifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L450-L474",
|
||||
"version": "repo-lines-v1:sha256:4c6b3a1f973a949680625cbe83559a1107ebdaa8482afd87b6b5e3f4e0b4df16:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjI4MTVhZjQ0Y2NjYmY3M2ZiOGFlYTRkMmE1ZWUwNTFkMTllMmUyMDMzMWQ3ODVlY2MzOThmMjBlMzgwZDk5ZDgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJiOTg0MmMxZjExMTk5ZmUyZDVhZjJmNzhkOTdiZjQ2NDc5ZjA0NTQ0NzQ5ZmZhNGJjMWQxMGUxMDhjMTUyMTIiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjgyMWVhZDE2YTdlMjJmMzJkNWNhOWM2NzRmOGUzNWY0YmNkN2RmZWZhNmQ4MjViYjQwOTc3YTJjMzdiNzViY2UifQ"
|
||||
},
|
||||
{
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift#L77-L149",
|
||||
"version": "repo-lines-v1:sha256:28ad85483155b381f658e4828ea80953cc7a916b4bd99ad962ba6fd23a75db0b:eyJzZWxlY3RlZExpbmVDb3VudCI6NzMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdiMGE4OWZhY2U5NDE1ODFiNTg4NDc4OTU5Y2YzMTJkNTEwMzdmZWViZTgzMjFmN2MzNDNjMmM1M2QzMTg2YmIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImQzNDU2OWJiNmExNjBkOTQxMzM3ZmVkMDI5N2ZmZGU4YTUyMDdiZGVmNTZkZTFmNWYyZjRmOTYzMDk1ODExYTYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFlNDczYWE3ODczOTlhYzQyMzgyZjdiYWUzZWU3ZmI2ZWU5MTc2OTczOTdlOGVmMGNiZjI5MjU1N2EzNWExYjMifQ"
|
||||
"resource": "repo://Frameworks/TermindRemoteInfrastructure/Telnet/TelnetConnection.swift",
|
||||
"version": "repo-file-v1:sha256:669be133495ace7709a537d328d7ba5e31fa8159dbd50a7f3e193cc91f807d74"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -174,11 +162,11 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:197fa5f7cbf890923e277a7e68154263c39a7c6751f07f399bf960ab016ebb41"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:fcf66bc2cd5aa8569f2f1a7074d91ede68b5509b387d5c14508affb8f79ba8a0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -192,7 +180,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:197fa5f7cbf890923e277a7e68154263c39a7c6751f07f399bf960ab016ebb41"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -240,7 +228,7 @@
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:197fa5f7cbf890923e277a7e68154263c39a7c6751f07f399bf960ab016ebb41"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -260,11 +248,11 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFM/App/AppModel.swift",
|
||||
"version": "repo-file-v1:sha256:197fa5f7cbf890923e277a7e68154263c39a7c6751f07f399bf960ab016ebb41"
|
||||
"version": "repo-file-v1:sha256:e9aef4633beb47f5d7db513235051e9a8375646b70a2dbd93da8fb13554d47c2"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFM/App/TermindApp.swift",
|
||||
"version": "repo-file-v1:sha256:fcf66bc2cd5aa8569f2f1a7074d91ede68b5509b387d5c14508affb8f79ba8a0"
|
||||
"version": "repo-file-v1:sha256:764b75fc1f9a5603ab0b5365bf1630477ec4fd4bea524c347f1e3746fe12961d"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -274,7 +262,7 @@
|
||||
"evidence": [
|
||||
{
|
||||
"resource": "repo://TFI/App/MobileAppModel.swift",
|
||||
"version": "repo-file-v1:sha256:b24747ff9dedd849a5aabeba6b978fa6c7e3b61954033dcee5163d5ed8064123"
|
||||
"version": "repo-file-v1:sha256:225a23bf523aaefea05aa7d4b4e0a361dff1fc5dce78a4241bc5b38fc7d169da"
|
||||
},
|
||||
{
|
||||
"resource": "repo://TFI/Application/Agent/MobileAssistantModel.swift",
|
||||
@@ -289,6 +277,6 @@
|
||||
],
|
||||
"verification": {
|
||||
"by": "openwiki/0.5.2",
|
||||
"at": "2026-09-23T10:36:38.039Z"
|
||||
"at": "2026-09-23T14:05:10.244Z"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"updatedAt": "2026-09-23T11:41:12.352Z",
|
||||
"updatedAt": "2026-09-23T14:09:42.944Z",
|
||||
"command": "update",
|
||||
"gitHead": "25b88f90fcbb3b535d07481665cdbe3e9cef9f38",
|
||||
"model": "gpt-6-sol",
|
||||
"status": "interrupted",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"model": "host-agent/codex",
|
||||
"status": "complete",
|
||||
"language": "en"
|
||||
}
|
||||
+111
-111
@@ -2,130 +2,130 @@
|
||||
"schemaVersion": 1,
|
||||
"pages": {
|
||||
"/openwiki/architecture/desktop-ui.md": {
|
||||
"pageVersion": "sha256:b9ac495e361094b701333dbc6741fb9eb235201a3428a88baa539e85b899368f",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:2982b1391ab0cc4693ecb8b635762eee92406f0dc4e73d3f8a0d9fbbaebb213e",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/engineering-invariants.md": {
|
||||
"pageVersion": "sha256:b3cf2c3e75779877055fc98f5005afa3c2c3ca927da6b0232fbf035d108cfe52",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:01dff4e055d1d84f2ae10051b53bc73764eeb76dc2728ac14e0298625517d395",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/mobile-ui.md": {
|
||||
"pageVersion": "sha256:1804e1b56dad3aff397363c08ac6c2af77f136d8fee3b4d6e8a2b80fa040f948",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:60126295756822200145e81f286554dbb9bfafd08b019f04aed82b04d9a8c067",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/module-map.md": {
|
||||
"pageVersion": "sha256:bca96ac65afae5b3c664cba51d37fdd56b978934b1d494d475e95d057226bf98",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:3dbe70c12c4d9e377a7282f38eba5a02c2eb396d5d044254044e125cefe0ad07",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/native-app-directories.md": {
|
||||
"pageVersion": "sha256:6fcee3a37158ff40799ce0b4dc356338d80ec4b9e1bc658f5d856c466618b2fe",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:292b2eb72af811fc62750a5dadf871d3b272b65a49013ce5fd8e551a35437b1f",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/platform-runtime.md": {
|
||||
"pageVersion": "sha256:b2e31af1e23b8eb56a0e9eaabf4e5a5b0a0ad90c94c725aa451f629dbe390f3f",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:100eead559d1039723780eb0c8f8415c71f74a88dbe7627c0fc93b11de49343c",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/shared-module-directories.md": {
|
||||
"pageVersion": "sha256:1d94baed34a4a63a7a933c51f451945882a2778972ab6bd10350dbd195285613",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:75e670dfa0509344b9ab0328cbe127991d80d0198d1c7aeeaae2d502ee71c83b",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/supporting-system-directories.md": {
|
||||
"pageVersion": "sha256:28aa0deba6ac872df151035ac04d0aba9eb9619b16b76c706ecd36c2dbe08425",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:4d74f05a7122684c6b96ed5356b6f6195a539e57beb0e540084accada9d032af",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/architecture/system-boundaries.md": {
|
||||
"pageVersion": "sha256:a6f8d86c38688d119e171586b5b7c1c46a68416470c47cda9fbe3cbee3d02f9a",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:248082c1704843420a73915262422310cbc8c586ce590a5808d2052a4a65f23a",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/concepts/agent-runtime-and-assistant.md": {
|
||||
"pageVersion": "sha256:40e0ea051b8758c505d4264ef66de5fe3e767ee52a8afa2858337c6827d609d1",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:374ccfb1b67779f7dfab5f96e532a7acd4676fbb1505fa9d05c6dabf3898791b",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/concepts/commerce-localization-and-product-surfaces.md": {
|
||||
"pageVersion": "sha256:c9bc2c85241afa99871ff2b9d281f17d45acb8c76ef353b5c20844561140d378",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:49d4c96b5e9397c0c6e417bd17e4747f23d72190fbba7da9f191fe57862801f2",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/concepts/persistence-and-secrets.md": {
|
||||
"pageVersion": "sha256:1faf5315736b44da4aab78615dbdfeb81fd8888d3b52b10b884f9ac33af15aa6",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:65e25f241d21cc316af8149e2f5040e22ec0737d9dee0e11d55f1447f76919b4",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/concepts/remote-services-and-forwarding.md": {
|
||||
"gitHead": "25b88f90fcbb3b535d07481665cdbe3e9cef9f38",
|
||||
"sourceFingerprint": "sha256:ee2bf42987f687d1217a632cdf8c816e2ecf304111a2ae7daa0fffd7042c7704",
|
||||
"pageVersion": "sha256:9e0486ea1b4ef480f9b2de430e2beed9fdef98ddab424b93f4369fdc0b05748f",
|
||||
"pageVersion": "sha256:f145a23828c8bc1bc62a776d07d4f5245ebcf376c7f06c8b902eb1d64c18d9c0",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "926e6b73-de8e-49f4-a260-18e94f16fa8d"
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/concepts/shell-integration.md": {
|
||||
"pageVersion": "sha256:ae4a3bccb3836edf9362314d853ddc4634ebac972ee4c7f16eaf1c9c77c95123",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:ed30aee242a42146cd75d69d5a4e30ca8dc8fd7d5dc8db4ca3d401b8a73e894a",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/concepts/ssh-multiplexing-and-scheduling.md": {
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac",
|
||||
"pageVersion": "sha256:ff1be2ef80ee4380d12600b617927c4a697e8a40d38e6b740cde639c9f25cc8d",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74"
|
||||
},
|
||||
"/openwiki/concepts/ui-design-principles.md": {
|
||||
"pageVersion": "sha256:0abbaadf6ae386fe26eba5e0ce8010dfc8cd8a5eba91e389977e9d5ee6c76fb4",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:8f362367e688c959989324ed232ec7a4516727fe39a97d68b5927fe8f30f2e5e",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/integrations/mcp-server-and-bridge.md": {
|
||||
"pageVersion": "sha256:d346d4ae2b393ff1fa231f3fdb05e737eded8665a2627acc44df7c382333a96c",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:462d6503cb6b0ad2bd0a90ca359bc490fec86311945bb735c8dfd20e4b83ed5b",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/operations/build-test-and-release.md": {
|
||||
"pageVersion": "sha256:18c4ab0086670df59a492485fb84903a16daf0e41e8c32cff217d1330fd49d7d",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:29aa2f5bf72e8583c20c85dcea07ef8830297cf0f9ced9fa799a8490fd45c01a",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/operations/cloudkit-release-readiness.md": {
|
||||
"gitHead": "25b88f90fcbb3b535d07481665cdbe3e9cef9f38",
|
||||
@@ -135,11 +135,11 @@
|
||||
"completedRunId": "926e6b73-de8e-49f4-a260-18e94f16fa8d"
|
||||
},
|
||||
"/openwiki/operations/marketing-assets-and-app-icons.md": {
|
||||
"gitHead": "25b88f90fcbb3b535d07481665cdbe3e9cef9f38",
|
||||
"sourceFingerprint": "sha256:ee2bf42987f687d1217a632cdf8c816e2ecf304111a2ae7daa0fffd7042c7704",
|
||||
"pageVersion": "sha256:40b2afc40830a574689fa94f4912436c70b25c0f10741b865ad55d6364fe7f1d",
|
||||
"pageVersion": "sha256:c888af748fedf1b3bb6c77aec9cbb46ff10d9b838e412cd4b69eeff363e79aa4",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "926e6b73-de8e-49f4-a260-18e94f16fa8d"
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/operations/port-forwarding-benchmarks.md": {
|
||||
"gitHead": "25b88f90fcbb3b535d07481665cdbe3e9cef9f38",
|
||||
@@ -156,18 +156,18 @@
|
||||
"completedRunId": "926e6b73-de8e-49f4-a260-18e94f16fa8d"
|
||||
},
|
||||
"/openwiki/quickstart.md": {
|
||||
"pageVersion": "sha256:ed6123ee29f371389d58e4ef425a381efb7f9a251c135b317d168b2e7ec27e70",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:6a6857a00d792e9e7b897cf3f286dd9e8566f45c5e69a055a099f5e38b25d3d7",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/testing/behavioral-boundaries-and-fixtures.md": {
|
||||
"pageVersion": "sha256:15029cc4d76549f995f92d10b81402f0764575eeb49c402d9577fa1bc5c8756d",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:bfbd13a0e66214bc1898aa094fae604d76fbba1105f9b57fee0124dfe0d5ad5b",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/workflows/port-forwarding-pool-and-dispatch.md": {
|
||||
"gitHead": "25b88f90fcbb3b535d07481665cdbe3e9cef9f38",
|
||||
@@ -184,18 +184,18 @@
|
||||
"completedRunId": "926e6b73-de8e-49f4-a260-18e94f16fa8d"
|
||||
},
|
||||
"/openwiki/workflows/sftp-transfer-and-external-edit.md": {
|
||||
"pageVersion": "sha256:bcad80bdae1c2dda36b882117fd053a20bce47dd9c10174cdbaec582ae1b38a5",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:b60d62fe8a8dc744b46cd92cf5cac00e7c8f44d64f4bc7ddc94dabcaa5ba3be6",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
},
|
||||
"/openwiki/workflows/ssh-session-lifecycle.md": {
|
||||
"pageVersion": "sha256:557605f4c9e89cf5b14379eef061940a994954d683d87ed5f0e24b963c46f493",
|
||||
"completedBy": "openwiki/0.5.2",
|
||||
"completedRunId": "30c2e3a7-893f-43e0-b809-385cb93a0b74",
|
||||
"gitHead": "69adfd3f51210783aeae565485b3571a1d186603",
|
||||
"sourceFingerprint": "sha256:3c9219886395ca00b7a26127792532b09bf4478762382ef78648f6892c5725ac"
|
||||
"pageVersion": "sha256:503379f21394a5ffaf194d839a1d25373ac2362438ec7b26230e68367bc3c414",
|
||||
"completedBy": "codex",
|
||||
"completedRunId": "fc7572ac-a53a-48cd-abc4-310696cf6103",
|
||||
"gitHead": "4b4aa2adffa2e7c597ba3ac221ddd151221ce5fd",
|
||||
"sourceFingerprint": "sha256:4b26a1aa5d212d0baedeb9cdfb9605e606712722095bebf2d003d408c1307677"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ description: "How the macOS app composes its native window shell, persistent wor
|
||||
tags: [macos, tfm, ui, navigation, workspaces, swiftui, appkit, design]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
sources:
|
||||
- id: openwiki-source-e09fb7bc8e7ca0579f6d446e
|
||||
resource: repo://Frameworks/TermindApplication/FeatureModels/DeviceDirectoryModel.swift
|
||||
@@ -49,13 +49,15 @@ sources:
|
||||
resource: repo://TFMTests/PersistentWorkspaceDeckLayoutTests.swift
|
||||
- id: openwiki-source-dceb8d7e7c5bb09359e70052
|
||||
resource: repo://TFMTests/ResponsivePageLayoutTests.swift
|
||||
- id: openwiki-source-578f30372fe67f8688f44b76
|
||||
resource: repo://TFMTests/WindowStateTests.swift
|
||||
- id: openwiki-source-91826a88f242f001f33fff89
|
||||
resource: repo://TFMTests/WindowToolbarFindTests.swift
|
||||
- id: openwiki-source-a3093a0c1d98ecc1cdbc0279
|
||||
resource: repo://TFMTests/WorkspaceNavigatorDropTests.swift
|
||||
- id: openwiki-source-05f0aeba12df8388b97b3c76
|
||||
resource: repo://TFMTests/WorkspaceNavigatorRenameTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
generated: { by: "codex", at: "2026-09-23T14:05:10.244Z" }
|
||||
---
|
||||
|
||||
# TFM Desktop UI Architecture
|
||||
@@ -242,7 +244,7 @@ The renderer resolves a pointer to a section and insertion slot; it does not nee
|
||||
|
||||
The full Assistant destination and the workspace's compact Assistant are different presentation surfaces. Opening a conversation in the compact sidebar does not replace the foreground terminal. Its transcript region and interaction/composer region can be composed separately, and terminal context/actions are passed deliberately.
|
||||
|
||||
Archive presentation is one `WindowModel.isAssistantArchivePresented` flag shared by these two surfaces within the window, not a second flag on `WindowSidebarState` and not app-wide navigation state. Conversation selection remains surface-specific. `AssistantConversationMenuSurface` reads the current shared flag when constructing the native blank-area menu, so both **Show Archive** checkmarks agree. Its action still respects the invoking surface: the sidebar route clears the compact conversation and shows the archive without replacing the foreground workspace; the full-screen route clears compact selection and selects the Assistant destination. Opening or closing a compact conversation clears the shared archive flag, and the compact archive's **Open Full Screen** control explicitly promotes the archive to the main destination.
|
||||
The compact Sidebar and full Assistant share one window-local Chat/Archive route. `AssistantLibraryModel.selectedConversationID` identifies the open chat, while `WindowModel.isAssistantArchivePresented` overrides it for Archive; entering Archive or returning to the chat landing state clears the selected conversation so the two surfaces cannot diverge. Surface actions still differ in navigation effect: a Sidebar action updates the shared route while leaving the workspace in front, whereas its full-screen counterpart also selects the Assistant destination. Closing the last workspace promotes a visible compact chat or Archive into that destination. The contextual Sidebar draft and focused-session context remain Sidebar-owned, and transcript owners remain keyed by conversation plus surface, so navigation is shared without merging draft or native-rendering lifetimes.
|
||||
|
||||
Native transcript ownership adds another boundary:
|
||||
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture-contract
|
||||
title: Cross-Cutting Engineering Invariants
|
||||
description: Cross-platform safety boundaries for durable Host deletion, Assistant preparation and run persistence, workspace restoration, and app-scoped services. Use this page to check ordering and lifecycle assumptions before changing shared behavior.
|
||||
tags: [architecture, invariants, lifecycle, security, persistence, remote-sessions, agent, mobile]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-8037e2358a2c4f9b2c722a11
|
||||
resource: repo://AGENTS.md
|
||||
@@ -138,6 +135,9 @@ sources:
|
||||
- id: openwiki-source-9442022b3dba1be62a55f0f0
|
||||
resource: repo://TFMTests/TerminalThemeTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Cross-Cutting Engineering Invariants
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture guide
|
||||
title: TFI Mobile UI Architecture
|
||||
description: "How the iPhone/iPad app composes registered feature stacks, scene-local navigation, shared runtimes, adaptive content regions, native terminal/transcript surfaces and mobile interaction policies."
|
||||
tags: [ios, ipados, tfi, ui, navigation, adaptive-layout, swiftui, uikit]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-d1d534769c300d5fb8dbe9d7
|
||||
resource: repo://Frameworks/TermindApplication/FeatureModels/HostCustomIdentityDraft.swift
|
||||
@@ -66,6 +63,9 @@ sources:
|
||||
- id: openwiki-source-11c91698354a4f95be3c4654
|
||||
resource: repo://TFITests/MobileWorkspaceMenuTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# TFI Mobile UI Architecture
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture map
|
||||
title: Module and Directory Architecture Map
|
||||
description: A concise map of Termind's modules, second-level functional directories, build dependencies, and responsibility boundaries, with links to the detailed directory guides.
|
||||
tags: [architecture, modules, directories, dependencies, ownership]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-ed77bc20b48d193bace3dde6
|
||||
resource: repo://.gitmodules
|
||||
@@ -56,6 +53,9 @@ sources:
|
||||
- id: openwiki-source-0f8d0f9d08d6674698dd054c
|
||||
resource: repo://WorkspaceActivitySupport/WorkspaceActivityAttributes.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Module and Directory Architecture Map
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture directory guide
|
||||
title: Native App Directory Responsibilities
|
||||
description: Directory ownership in the macOS and iOS apps, including desktop window composition, MCP transfer policy, and mobile scene, sync, and background lifetimes.
|
||||
tags: [architecture, directories, macos, ios, ipados, navigation, lifecycle]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-c4b6e224fdbea6dcd393344d
|
||||
resource: repo://Frameworks/TermindRemoteInfrastructure/Transfers/SFTPTransferCoordinator.swift
|
||||
@@ -73,8 +70,6 @@ sources:
|
||||
resource: repo://TFM/Application/MCPServer/MCPServerTools.swift
|
||||
- id: openwiki-source-396f97a332870d48c065d7e9
|
||||
resource: repo://TFM/Application/MCPServer/MCPUploadCoordinator.swift
|
||||
- id: openwiki-source-1d68a7282b3e48afbfe75c6f
|
||||
resource: repo://TFM/Application/Repositories/ToolAuditRepository.swift
|
||||
- id: openwiki-source-1bc9e5a8d0e790c70a371d60
|
||||
resource: repo://TFM/Application/Serial/SerialPortService.swift
|
||||
- id: openwiki-source-d35453512ef488d0cacdc06e
|
||||
@@ -93,8 +88,6 @@ sources:
|
||||
resource: repo://TFM/Features/Vault/VaultView.swift
|
||||
- id: openwiki-source-22b9fca540c3029c5ace451e
|
||||
resource: repo://TFM/Features/Workspaces/WindowModel.swift
|
||||
- id: openwiki-source-261f22416c57a70890569544
|
||||
resource: repo://TFM/Infrastructure/Database/SwiftDataToolAuditRepository.swift
|
||||
- id: openwiki-source-3cccceaeda63a663e84b5bfa
|
||||
resource: repo://TFM/Infrastructure/MCP/MCPServerSession.swift
|
||||
- id: openwiki-source-9d465cf017037915bf209e49
|
||||
@@ -118,6 +111,9 @@ sources:
|
||||
- id: openwiki-source-ea148dc5de8cabfc00dc07ae
|
||||
resource: repo://TFMTests/WindowSidebarTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Native App Directory Responsibilities
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture
|
||||
title: Platform Runtime, App Composition, and Lifetimes
|
||||
description: How Termind composes shared services and persistence on macOS and iOS, and where app-wide, window-local, scene-local, and session state begin and end.
|
||||
tags: [architecture, runtime, macos, ios, lifecycle, dependency-injection]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-875da2c4f1040409e53757af
|
||||
resource: repo://Frameworks/TermindApplication/Events/HostDeletionHandlers.swift
|
||||
@@ -70,6 +67,9 @@ sources:
|
||||
- id: openwiki-source-32c251eb2f83ec0be2f1a0e8
|
||||
resource: repo://TFMTests/RepositoryOutboxTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Platform Runtime, App Composition, and Lifetimes
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture directory guide
|
||||
title: Shared Framework Directory Responsibilities
|
||||
description: Responsibilities and boundaries of Termind's shared frameworks and bundle resources, including agent execution, durable replay, SSH charset handling, and synchronized Xcode target membership.
|
||||
tags: [architecture, directories, frameworks, domain, persistence, presentation, ssh]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-cd70c531c7abdbbdcb0ea290
|
||||
resource: repo://AgentKit/Sources/AgentKit/Providers/ModelCapabilityResolver.swift
|
||||
@@ -130,6 +127,9 @@ sources:
|
||||
- id: openwiki-source-d3d065330c730839f5cc6112
|
||||
resource: repo://TFMTests/ArchitectureBoundaryTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Shared Framework Directory Responsibilities
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture directory guide
|
||||
title: Supporting Products, Packages, and Tooling
|
||||
description: Directory responsibilities and integration relationships for AgentKit, the MCP bridge, Live Activities, tests, benchmarks, the Astro site, marketing assets, scripts, and repository automation.
|
||||
tags: [architecture, directories, agentkit, mcp, widgets, testing, website, tooling]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-6d4b4e707b8d60b6ccfa3425
|
||||
resource: repo://.github/workflows/openwiki-update.yml
|
||||
@@ -84,6 +81,9 @@ sources:
|
||||
- id: openwiki-source-0f8d0f9d08d6674698dd054c
|
||||
resource: repo://WorkspaceActivitySupport/WorkspaceActivityAttributes.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Supporting Products, Packages, and Tooling
|
||||
|
||||
@@ -3,9 +3,6 @@ type: architecture boundaries
|
||||
title: System Boundaries and Dependency Ownership
|
||||
description: Static framework layers, platform composition roots, persistence ownership, and the external AgentKit boundary that keep Termind changes dependency-safe.
|
||||
tags: [architecture, modularity, dependencies, persistence, agentkit, swift]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-8037e2358a2c4f9b2c722a11
|
||||
resource: repo://AGENTS.md
|
||||
@@ -44,6 +41,9 @@ sources:
|
||||
- id: openwiki-source-d3d065330c730839f5cc6112
|
||||
resource: repo://TFMTests/ArchitectureBoundaryTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# System Boundaries and Dependency Ownership
|
||||
|
||||
@@ -3,9 +3,6 @@ type: agent runtime concept
|
||||
title: Assistant, Agent Runtime, Skills, and Memory
|
||||
description: How Termind assembles AgentKit into durable assistant conversations, applies approval and host-security boundaries, and manages skills, scratch workspaces, and device-local Hermes memory.
|
||||
tags: [assistant, agent-runtime, approval, persistence, skills, memory, ssh, sftp]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-0e8cfe7d74554d8a17af60b7
|
||||
resource: repo://AgentKit/Sources/AgentKit/Runtime/AgentRuntime.swift
|
||||
@@ -92,6 +89,9 @@ sources:
|
||||
- id: openwiki-source-8d265a8732f0af93c5d4e274
|
||||
resource: repo://TFMTests/MCPServerToolsTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Assistant, Agent Runtime, Skills, and Memory
|
||||
|
||||
@@ -3,9 +3,6 @@ type: product-surface-concept
|
||||
title: Commerce, Localization, and Product Surfaces
|
||||
description: Explains StoreKit-derived Pro access, native paywall and review ownership, localization completion rules, and the app, widget, screenshot, and marketing-site surfaces that present the product.
|
||||
tags: [commerce, storekit, localization, product-surfaces, marketing, widgets]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-8037e2358a2c4f9b2c722a11
|
||||
resource: repo://AGENTS.md
|
||||
@@ -80,6 +77,9 @@ sources:
|
||||
- id: openwiki-source-0f8d0f9d08d6674698dd054c
|
||||
resource: repo://WorkspaceActivitySupport/WorkspaceActivityAttributes.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
## Scope and ownership
|
||||
|
||||
@@ -3,9 +3,6 @@ type: persistence and security concept
|
||||
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]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-685b7f8e7dbcf91b4e2a50e2
|
||||
resource: repo://Frameworks/TermindApplication/Agent/AssistantConversationOperations.swift
|
||||
@@ -94,6 +91,9 @@ sources:
|
||||
- id: openwiki-source-1d1efb20e239b1f2142f6cb7
|
||||
resource: repo://TFMTests/SettingsSyncTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Persistent Data, Migrations, and Secret Boundaries
|
||||
|
||||
@@ -36,7 +36,7 @@ sources:
|
||||
generated: { by: "omp", at: "2026-09-22T02:43:23.140Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:08:51.776Z
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
|
||||
|
||||
@@ -3,9 +3,6 @@ type: implementation guide
|
||||
title: "Shell Integration: Bootstrap, OSC Events, and Terminal State"
|
||||
description: "How SSH PTY shell hooks bootstrap and decode command and cwd events, and how remote charset conversion differs between SSH PTY and Telnet terminal data paths."
|
||||
tags: [ssh, telnet, terminal, shell-integration, osc, command-history, charset, lifecycle]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-209392b5f97bd72d0bd87a15
|
||||
resource: repo://Frameworks/TermindApplication/Agent/TerminalCommandDraftController.swift
|
||||
@@ -30,6 +27,9 @@ sources:
|
||||
- id: openwiki-source-b1446950c4c60caef12aa43a
|
||||
resource: repo://TFMTests/ShellIntegrationBootstrapTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Shell Integration: Bootstrap, OSC Events, and Terminal State
|
||||
|
||||
@@ -3,9 +3,6 @@ type: design guide
|
||||
title: UI Design Principles and Shared Presentation Boundaries
|
||||
description: "Source-backed UI principles for TFM and TFI: semantic visual systems, native interaction, shared forms and presentation values, stable rendering identity, accessibility, localization and safe extension boundaries."
|
||||
tags: [ui, design-system, presentation, accessibility, localization, macos, ios]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-d1d534769c300d5fb8dbe9d7
|
||||
resource: repo://Frameworks/TermindApplication/FeatureModels/HostCustomIdentityDraft.swift
|
||||
@@ -124,6 +121,9 @@ sources:
|
||||
- id: openwiki-source-1c583949c6f00d5acc015c90
|
||||
resource: repo://TFMTests/WorkspaceLayoutDropTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# UI Design Principles and Shared Presentation Boundaries
|
||||
|
||||
@@ -3,9 +3,6 @@ type: integration guide
|
||||
title: MCP Server, Transfer APIs, and Stdio Bridge
|
||||
description: How the desktop MCP listener and stdio bridge expose local host tools and scoped HTTP SFTP transfers, including ticket states and failure recovery. Distinguishes macOS server ownership from the iOS remote MCP client.
|
||||
tags: [mcp, macos, loopback, authentication, sftp, bridge]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-1fc00d0407016efa5a0378eb
|
||||
resource: repo://Frameworks/TermindRemoteInfrastructure/Agent/AgentBuiltInSSHTools.swift
|
||||
@@ -48,6 +45,9 @@ sources:
|
||||
- id: openwiki-source-47dc468698b2904f0004ee04
|
||||
resource: repo://TFMTests/MCPUploadTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# MCP Server, Transfer APIs, and Stdio Bridge
|
||||
|
||||
@@ -3,9 +3,6 @@ type: release operations
|
||||
title: Build, Test, and Release
|
||||
description: Targeted validation gates for Termind's resolved-package Xcode builds, opt-in UI and StoreKit tests, localization, screenshots, website, and AgentKit releases.
|
||||
tags: [operations, build, testing, localization, release, agentkit, screenshots]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-ea70eb6c045047448e446296
|
||||
resource: repo://.gitignore
|
||||
@@ -48,6 +45,9 @@ sources:
|
||||
- id: openwiki-source-a08489338be00125d646c77e
|
||||
resource: repo://TFMTests/VisibleWindowTestTrait.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Build, Test, and Release
|
||||
|
||||
@@ -47,7 +47,7 @@ sources:
|
||||
generated: { by: "codex", at: "2026-09-22T01:13:21.371Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:08:51.776Z
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Marketing Assets, Screenshot Production, Figma Exports, and App Icons
|
||||
|
||||
@@ -3,9 +3,6 @@ type: engineering quickstart
|
||||
title: Termind Engineering Quickstart
|
||||
description: Task-oriented routes to Termind's owning layer, startup and shutdown lifetimes, focused tests, and build gates.
|
||||
tags: [engineering, architecture, routing, testing, macos, ios]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-8037e2358a2c4f9b2c722a11
|
||||
resource: repo://AGENTS.md
|
||||
@@ -36,6 +33,9 @@ sources:
|
||||
- id: openwiki-source-0dd012e3740bcc348fc36ccb
|
||||
resource: repo://TFMTests/StoreKitTrialTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Termind Engineering Quickstart
|
||||
|
||||
@@ -3,9 +3,6 @@ type: testing strategy
|
||||
title: Testing Strategy and Behavioral Boundaries
|
||||
description: Focused regression strategy for Termind's shared frameworks and macOS and mobile targets, with fixtures that protect persistence, security, lifecycle, architecture, and UI contracts.
|
||||
tags: [testing, regression, fixtures, architecture, persistence, security, lifecycle, ui]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-8037e2358a2c4f9b2c722a11
|
||||
resource: repo://AGENTS.md
|
||||
@@ -72,6 +69,9 @@ sources:
|
||||
- id: openwiki-source-a08489338be00125d646c77e
|
||||
resource: repo://TFMTests/VisibleWindowTestTrait.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# Testing Strategy and Behavioral Boundaries
|
||||
|
||||
@@ -3,9 +3,6 @@ type: workflow
|
||||
title: SFTP Transfer, Scheduling, and External Edit Workflow
|
||||
description: How browser SFTP jobs are scheduled and resumed, how Agent SFTP leases reuse authenticated SSH connections, and how MCP uploads and external edits remain separate workflows.
|
||||
tags: [sftp, file-transfer, ssh, scheduling, external-editing, lifecycle]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-46ef2fcd9e3aba751015021b
|
||||
resource: repo://Frameworks/TermindDomain/Transfers/SFTPPreferences.swift
|
||||
@@ -52,6 +49,9 @@ sources:
|
||||
- id: openwiki-source-53e2b2fd2e661123f63e69e1
|
||||
resource: repo://TFMTests/SFTPTransferContextTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
## Scope and operating model
|
||||
|
||||
@@ -3,9 +3,6 @@ type: workflow
|
||||
title: SSH, Telnet, Trust, and Workspace Session Lifecycle
|
||||
description: Traces how Termind prepares SSH and Telnet connections, routes them through proxies and jump hosts, authorizes server identity, consumes credentials, and retires or restores live workspace sessions.
|
||||
tags: [ssh, telnet, connection-lifecycle, host-keys, proxy, workspace, security]
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T10:36:38.039Z
|
||||
sources:
|
||||
- id: openwiki-source-cb178f0d078ab3218679c80e
|
||||
resource: repo://Frameworks/TermindApplication/Connections/RemoteSessionConnectionController.swift
|
||||
@@ -54,6 +51,9 @@ sources:
|
||||
- id: openwiki-source-85c3f954351f96433cb1fb4b
|
||||
resource: repo://TFMTests/ConnectionJourneyTests.swift
|
||||
generated: { by: "openwiki/0.5.2", at: "2026-09-23T10:36:38.039Z" }
|
||||
verified:
|
||||
- by: openwiki/0.5.2
|
||||
at: 2026-09-23T14:05:10.244Z
|
||||
---
|
||||
|
||||
# SSH, Telnet, Trust, and Workspace Session Lifecycle
|
||||
|
||||
Reference in new issue
Block a user