Loading...
Loading...
Compare original and translation side by side
"A matemática não mente. A elegância de uma prova é proporcional à profundidade da verdade que ela revela." — Inspirado em Terence Tao, Euler, Grothendieck, Von Neumann e Gödel
“数学不会说谎。证明的优雅程度与其揭示的真理深度成正比。” —— 受陶哲轩、欧拉、格罗滕迪克、冯·诺依曼和哥德尔启发
Para cada algoritmo/pipeline, calcular:
- Complexidade de tempo: T(n) com constantes explícitas
- Complexidade de espaço: S(n) incluindo stack frames
- Complexidade amortizada: Φ(estrutura) com potencial de Banach
- Complexidade de comunicação: para sistemas distribuídos/BTModelar como grafo dirigido G = (V, E) onde:
- V = componentes/módulos/funções
- E = dependências/chamadas/fluxo de dados
- Detectar: ciclos (dependências circulares), cliques (acoplamento excessivo)
- Calcular: centralidade de betweenness (single points of failure)
- Analisar: componentes fortemente conectados (SCCs)Representar máquinas de estado como matrizes de transição M:
- M[i][j] = probabilidade de i→j
- Eigenvalues de M = estados estacionários
- Matriz de acessibilidade R = I + M + M² + ... + MⁿPara cada interface/API, calcular:
- Entropia H(X) = -Σ p(x)log₂p(x) dos estados possíveis
- Informação mútua I(X;Y) entre inputs e outputs
- Capacidade de canal C = max I(X;Y) para otimização de throughputPara cada algoritmo/pipeline, calcular:
- Complexidade de tempo: T(n) com constantes explícitas
- Complexidade de espaço: S(n) incluindo stack frames
- Complexidade amortizada: Φ(estrutura) com potencial de Banach
- Complexidade de comunicação: para sistemas distribuídos/BTModelar como grafo dirigido G = (V, E) onde:
- V = componentes/módulos/funções
- E = dependências/chamadas/fluxo de dados
- Detectar: ciclos (dependências circulares), cliques (acoplamento excessivo)
- Calcular: centralidade de betweenness (single points of failure)
- Analisar: componentes fortemente conectados (SCCs)Representar máquinas de estado como matrizes de transição M:
- M[i][j] = probabilidade de i→j
- Eigenvalues de M = estados estacionários
- Matriz de acessibilidade R = I + M + M² + ... + MⁿPara cada interface/API, calcular:
- Entropia H(X) = -Σ p(x)log₂p(x) dos estados possíveis
- Informação mútua I(X;Y) entre inputs e outputs
- Capacidade de canal C = max I(X;Y) para otimização de throughputProcesso P = (S, s₀, Σ, δ, F) onde:
- S = conjunto de estados
- s₀ = estado inicial
- Σ = alfabeto de eventos
- δ: S × Σ → S = função de transição
- F ⊆ S = estados de aceitação
Verificar:
- Deadlock: estado s onde ∄ evento e: δ(s,e) definido
- Livelock: ciclo de estados não-produtivos
- Race condition: ∃ dois processos P, Q onde P ≻ Q ≠ Q ≻ P (não-comutatividade)Propriedades a verificar:
- Safety: AG(¬bad_state) — "nunca acontece algo ruim"
- Liveness: AG(AF(good_state)) — "sempre eventualmente algo bom"
- Fairness: GF(enabled) → GF(executed) — "habilitado implica executado"Relação → (happens-before):
- a → b se ∃ sequência de comunicações a₁→a₂→...→b
- Race condition iff ∃ a,b: ¬(a→b) ∧ ¬(b→a) ∧ acessam mesmo dadoProcesso P = (S, s₀, Σ, δ, F) onde:
- S = conjunto de estados
- s₀ = estado inicial
- Σ = alfabeto de eventos
- δ: S × Σ → S = função de transição
- F ⊆ S = estados de aceitação
Verificar:
- Deadlock: estado s onde ∄ evento e: δ(s,e) definido
- Livelock: ciclo de estados não-produtivos
- Race condition: ∃ dois processos P, Q onde P ≻ Q ≠ Q ≻ P (não-comutatividade)Propriedades a verificar:
- Safety: AG(¬bad_state) — "nunca acontece algo ruim"
- Liveness: AG(AF(good_state)) — "sempre eventualmente algo bom"
- Fairness: GF(enabled) → GF(executed) — "habilitado implica executado"Relação → (happens-before):
- a → b se ∃ sequência de comunicações a₁→a₂→...→b
- Race condition iff ∃ a,b: ¬(a→b) ∧ ¬(b→a) ∧ acessam mesmo dadoPara pipelines de dados (voz → STT → LLM → TTS):
- Modelar como rede de Jackson: M/M/1 ou M/M/k queues
- λ = taxa de chegada, μ = taxa de serviço
- ρ = λ/μ = utilização (deve ser < 1 para estabilidade)
- E[W] = ρ/(μ(1-ρ)) = tempo médio de espera
- E[N] = ρ/(1-ρ) = número médio de itensPara problemas de scheduling e alocação de recursos:
- Reformular como min f(x) s.t. g(x) ≤ 0, h(x) = 0
- Verificar convexidade: ∇²f(x) ⪰ 0 (Hessiana PSD)
- Dual de Lagrange: máx L(x,λ,ν) = f(x) + λᵀg(x) + νᵀh(x)
- Condições KKT para otimalidade globalPara sistemas de tempo real (Bluetooth SCO, STT latency):
- Modelar como processo estocástico {X_t}
- Calcular: média μ, variância σ², autocorrelação R(τ)
- Detectar: estacionariedade (ADF test), outliers (Grubbs test)
- Predizer: ARIMA(p,d,q) para latência futura
- Bounds probabilísticos: P(latência > T) com concentração de Markov/ChebyshevPara pipelines de dados (voz → STT → LLM → TTS):
- Modelar como rede de Jackson: M/M/1 ou M/M/k queues
- λ = taxa de chegada, μ = taxa de serviço
- ρ = λ/μ = utilização (deve ser < 1 para estabilidade)
- E[W] = ρ/(μ(1-ρ)) = tempo médio de espera
- E[N] = ρ/(1-ρ) = número médio de itensPara problemas de scheduling e alocação de recursos:
- Reformular como min f(x) s.t. g(x) ≤ 0, h(x) = 0
- Verificar convexidade: ∇²f(x) ⪰ 0 (Hessiana PSD)
- Dual de Lagrange: máx L(x,λ,ν) = f(x) + λᵀg(x) + νᵀh(x)
- Condições KKT para otimalidade globalPara sistemas de tempo real (Bluetooth SCO, STT latency):
- Modelar como processo estocástico {X_t}
- Calcular: média μ, variância σ², autocorrelação R(τ)
- Detectar: estacionariedade (ADF test), outliers (Grubbs test)
- Predizer: ARIMA(p,d,q) para latência futura
- Bounds probabilísticos: P(latência > T) com concentração de Markov/ChebyshevPara cada função/método, escrever:
{Pré-condição P} código {Pós-condição Q}
Onde:
- P = conjunto de estados válidos de entrada (em lógica predicativa)
- Q = conjunto de estados válidos de saída
- Invariante de loop I: P→I, {I∧B}corpo{I}, I∧¬B→Q
Exemplos para Kotlin:
{token ≠ null ∧ |token| > 0} sendRequest(token) {result.isSuccess ∨ result.isError}
{isConnected = true} startSCO() {isRecording = true ∨ throws BluetoothException}Em Kotlin, tipos são proposições:
- A? = A ∨ ⊥ (nullable = pode falhar)
- Result<A,E> = A ∨ E (pode ser sucesso ou erro)
- Flow<A> = □A (sempre A, eventualmente)
- suspend fun = continuação monadica
Analisar: força o compilador a provar propriedades? Ou há "buracos" (force unwrap `!!`)?Para cada função/método, escrever:
{Pré-condição P} código {Pós-condição Q}
Onde:
- P = conjunto de estados válidos de entrada (em lógica predicativa)
- Q = conjunto de estados válidos de saída
- Invariante de loop I: P→I, {I∧B}corpo{I}, I∧¬B→Q
Exemplos para Kotlin:
{token ≠ null ∧ |token| > 0} sendRequest(token) {result.isSuccess ∨ result.isError}
{isConnected = true} startSCO() {isRecording = true ∨ throws BluetoothException}Em Kotlin, tipos são proposições:
- A? = A ∨ ⊥ (nullable = pode falhar)
- Result<A,E> = A ∨ E (pode ser sucesso ou erro)
- Flow<A> = □A (sempre A, eventualmente)
- suspend fun = continuação monadica
Analisar: força o compilador a provar propriedades? Ou há "buracos" (force unwrap `!!`)?Para arquitetura MVVM:
- Model: categoria de dados (objetos = tipos, morfismos = transformações)
- ViewModel: functor F: Model → ViewModel que preserva estrutura
- View: functor G: ViewModel → View
Composição: G∘F: Model → View (deve ser functorial — preservar identidades e composição)
Verificar: naturalidade das transformações (não depende de implementação específica)Identificar padrões monádicos no código:
- Maybe/Option: computação que pode falhar
- IO/Suspend: computação com efeitos colaterais
- State: computação com estado mutável
- Reader: computação com ambiente/configuração
Uma mônada M deve satisfazer:
1. Left identity: return a >>= f ≡ f a
2. Right identity: m >>= return ≡ m
3. Associativity: (m >>= f) >>= g ≡ m >>= (λx. f x >>= g)
Violações dessas leis = bugs sutis de composiçãoPara arquitetura MVVM:
- Model: categoria de dados (objetos = tipos, morfismos = transformações)
- ViewModel: functor F: Model → ViewModel que preserva estrutura
- View: functor G: ViewModel → View
Composição: G∘F: Model → View (deve ser functorial — preservar identidades e composição)
Verificar: naturalidade das transformações (não depende de implementação específica)Identificar padrões monádicos no código:
- Maybe/Option: computação que pode falhar
- IO/Suspend: computação com efeitos colaterais
- State: computação com estado mutável
- Reader: computação com ambiente/configuração
Uma mônada M deve satisfazer:
1. Left identity: return a >>= f ≡ f a
2. Right identity: m >>= return ≡ m
3. Associativity: (m >>= f) >>= g ≡ m >>= (λx. f x >>= g)
Violações dessas leis = bugs sutis de composiçãoreferences/auri-analysis.mdreferences/auri-analysis.mdVoicePipeline.ktModelar como máquina de Mealy M = (S, I, O, δ, λ, s₀):
S = {IDLE, RECORDING, TRANSCRIBING, QUERYING_LLM, SPEAKING, ERROR}
I = {startRecording, stopRecording, sttResult, llmResult, ttsComplete, error}
O = {audioCapture, sttRequest, llmRequest, ttsRequest, notification}
Verificar:
- Completude: δ definida para todos (s,i) ∈ S×I?
- Determinismo: δ é função (não relação)?
- Alcançabilidade: todos estados em S são alcançáveis?
- Ausência de deadlock: ∄ s ∈ S: ∀i, δ(s,i) = s (estado absorvente indesejado)BluetoothController.ktAudioRouteController.ktSistema de prioridade de roteamento como função monotônica:
priority: AudioSource → ℤ
priority(BLE) > priority(SCO) > priority(USB) > priority(WIRED) > priority(BUILTIN)
Invariante: O sistema sempre usa o source disponível de maior prioridade.
Verificar: quando um source de maior prioridade aparece, ocorre switching correto?
Corolário: sem starvation — source de alta prioridade não é ignorado indefinidamenteLlmClientFactory.ktFactory como functor F: Provider → LlmClient
F deve ser:
- Total: definido para todos providers
- Determinístico: mesmo provider → mesmo tipo de cliente
- Composável: F(provider).send(msg) tem semântica consistente para todos providers
Análise de interface: LlmClient.send() deve satisfazer contrato uniforme:
{msg ≠ null ∧ apiKey válida} send(msg) {result é LlmResponse ∨ throws tipificado}AuriToolExecutor.kt9 ferramentas = 9 operações com side effects sobre sistema Android
Cada tool é uma IO monad: IO<Result<ToolResult, ToolError>>
Analisar:
- Idempotência: tool(x) = tool(tool(x))? (critical para retry logic)
- Comutatividade: executar tool A então B = B então A? (para paralelização)
- Atomicidade: tool falha parcialmente ou tudo-ou-nada?MainViewModel.ktStateFlow como processo reativo S = (State, EvVoicePipeline.ktModelar como máquina de Mealy M = (S, I, O, δ, λ, s₀):
S = {IDLE, RECORDING, TRANSCRIBING, QUERYING_LLM, SPEAKING, ERROR}
I = {startRecording, stopRecording, sttResult, llmResult, ttsComplete, error}
O = {audioCapture, sttRequest, llmRequest, ttsRequest, notification}
Verificar:
- Completude: δ definida para todos (s,i) ∈ S×I?
- Determinismo: δ é função (não relação)?
- Alcançabilidade: todos estados em S são alcançáveis?
- Ausência de deadlock: ∄ s ∈ S: ∀i, δ(s,i) = s (estado absorvente indesejado)BluetoothController.ktAudioRouteController.ktSistema de prioridade de roteamento como função monotônica:
priority: AudioSource → ℤ
priority(BLE) > priority(SCO) > priority(USB) > priority(WIRED) > priority(BUILTIN)
Invariante: O sistema sempre usa o source disponível de maior prioridade.
Verificar: quando um source de maior prioridade aparece, ocorre switching correto?
Corolário: sem starvation — source de alta prioridade não é ignorado indefinidamenteLlmClientFactory.ktFactory como functor F: Provider → LlmClient
F deve ser:
- Total: definido para todos providers
- Determinístico: mesmo provider → mesmo tipo de cliente
- Composável: F(provider).send(msg) tem semântica consistente para todos providers
Análise de interface: LlmClient.send() deve satisfazer contrato uniforme:
{msg ≠ null ∧ apiKey válida} send(msg) {result é LlmResponse ∨ throws tipificado}AuriToolExecutor.kt9 ferramentas = 9 operações com side effects sobre sistema Android
Cada tool é uma IO monad: IO<Result<ToolResult, ToolError>>
Analisar:
- Idempotência: tool(x) = tool(tool(x))? (critical para retry logic)
- Comutatividade: executar tool A então B = B então A? (para paralelização)
- Atomicidade: tool falha parcialmente ou tudo-ou-nada?MainViewModel.ktStateFlow como processo reativo S = (State, Evundefinedundefined| Rank | Risco | Severidade | P(ocorrência) | Score |
|---|---|---|---|---|
| 1 | ... | 9/10 | 0.8 | 7.2 |
| 排名 | 风险 | 严重性 | 发生概率 | 得分 |
|---|---|---|---|---|
| 1 | ... | 9/10 | 0.8 | 7.2 |
// código concreto
---// 具体代码
---viewModelScope: Ciclo = onCreate → onCleared()
- Sobrevive a rotações de tela (Configuration Changes)
- Cancela apenas quando ViewModel é destruído (backstack pop, finish())
- Usado para: operações de dados, observação de StateFlow
lifecycleScope: Ciclo = onCreate → onDestroy()
- Cancela em qualquer destruição, incluindo rotações
- Menos útil que repeatOnLifecycle para maioria dos casos
repeatOnLifecycle(State.STARTED): Ciclo = onStart → onStop (cicla!)
- O padrão moderno correto para coletar Flows na UI
- A cada onStop, cancela o collect; a cada onStart, reinicia
- Evita processamento de updates quando app está em background
Invariante crítico para Auri VoicePipeline:
observeSttResults() usa viewModelScope → collect() continua em background
Correto para voice assistant (queries LLM mesmo em background)
Mas: STT callbacks chegam mesmo com UI destruída → UI updates tentam
atualizar Compose que não existe mais → crash potencial se não há guarda
Verificar: toda emissão para _state (StateFlow de UI) deve verificar
se há collector ativo, OU usar repeatOnLifecycle na UIviewModelScope: 生命周期 = onCreate → onCleared()
- 可在屏幕旋转(配置变更)时存活
- 仅在ViewModel被销毁时取消(返回栈弹出、finish())
- 用于:数据操作、StateFlow观察
lifecycleScope: 生命周期 = onCreate → onDestroy()
- 在任何销毁场景下都会取消,包括屏幕旋转
- 对于大多数场景,repeatOnLifecycle更实用
repeatOnLifecycle(State.STARTED): 生命周期 = onStart → onStop(循环!)
- 在UI中收集Flow的现代正确模式
- 每次onStop时取消collect;每次onStart时重启
- 避免应用在后台时处理更新
Auri VoicePipeline的关键不变量:
observeSttResults()使用viewModelScope → collect()在后台继续运行
这对于语音助手是正确的(即使在后台也会查询LLM)
但:STT回调在UI销毁后仍会到达 → UI更新尝试更新已不存在的Compose → 若无防护则可能崩溃
验证:所有向_state(UI的StateFlow)的发射都必须检查是否有活跃的收集器,或在UI中使用repeatOnLifecycleSeja L = (CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED)
repeatOnLifecycle(State.X) define um processo que:
- ACTIVE quando lifecycle.state >= X
- CANCELLED quando lifecycle.state < X
Para cada transição de ciclo de vida → restart automático do Flow collect
Semantica: exatamente como ligar/desligar uma tomada em onStart/onStop
Quando usar o quê:
- StateFlow de UI state → repeatOnLifecycle(STARTED)
- StateFlow de dados de negócio → viewModelScope (sem parar)
- Events one-shot (toast, navigation) → SharedFlow ou Channel + viewModelScope设L = (CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED)
repeatOnLifecycle(State.X)定义一个进程:
- 当lifecycle.state >= X时处于ACTIVE状态
- 当lifecycle.state < X时处于CANCELLED状态
每次生命周期变更时自动重启Flow收集
语义:完全等同于在onStart/onStop时开关插座
何时使用:
- UI状态StateFlow → repeatOnLifecycle(STARTED)
- 业务数据StateFlow → viewModelScope(不停止)
- 一次性事件(提示、导航)→ SharedFlow或Channel + viewModelScopeStateFlow<T>:
- Buffer = 1 (apenas último valor)
- Replay = 1 (novo subscriber recebe último valor imediatamente)
- Fusão: emissões rápidas são fundidas — estados intermediários PERDIDOS
- Invariante: _state.value sempre reflete o estado ATUAL
SharedFlow<T>(replay=0, extraBufferCapacity=N):
- Buffer = N (configurgável)
- Replay = configurgável (0 = sem replay para novos subscribers)
- Sem fusão: cada emissão distinta é entregue (se buffer não transborda)
- Uso: eventos one-shot (erros, navegação, toasts)
Channel<T>(BUFFERED):
- Produção-consumo: cada item entregue exatamente uma vez
- Sem replay
- Hot: produção pode bloquear se buffer cheio
- Uso: comunicação ponto-a-ponto entre coroutines
Decisão matemática para cada caso em Auri:
pipelineState → StateFlow ✅ (UI quer estado atual, não histórico)
erros para toast → SharedFlow(extraBufferCapacity=10) ✅ (one-shot events)
audio PCM chunks → Channel(BUFFERED) ✅ (stream point-to-point)
sttResult → StateFlow ✅ (UI quer resultado atual)StateFlow<T>:
- Buffer = 1(仅保留最新值)
- Replay = 1(新订阅者立即接收最新值)
- 合并:快速发射会被合并——中间状态丢失
- 不变量: _state.value始终反映当前状态
SharedFlow<T>(replay=0, extraBufferCapacity=N):
- Buffer = N(可配置)
- Replay = 可配置(0 = 新订阅者无重播)
- 无合并:每个不同的发射都会被传递(如果缓冲区未溢出)
- 用途:一次性事件(错误、导航、提示)
Channel<T>(BUFFERED):
- 生产-消费:每个项目恰好被传递一次
- 无重播
- 热流:若缓冲区已满,生产可能阻塞
- 用途:协程间点对点通信
Auri中各场景的数学决策:
pipelineState → StateFlow ✅(UI需要当前状态,而非历史)
erros para toast → SharedFlow(extraBufferCapacity=10) ✅(一次性事件)
audio PCM chunks → Channel(BUFFERED) ✅(流式点对点)
sttResult → StateFlow ✅(UI需要当前结果)// ERRADO: usar StateFlow para eventos one-shot
private val _error = MutableStateFlow<String?>(null)
// Problema 1: novo observer recebe o erro antigo ao se registrar
// Problema 2: para "consumir" o erro, precisa emitir null depois
// Problema 3: race condition entre emitir null e próxima leitura
// CORRETO: SharedFlow para eventos one-shot
private val _error = MutableSharedFlow<String>(extraBufferCapacity = 1)
fun sendError(msg: String) { _error.tryEmit(msg) }// 错误:用StateFlow处理一次性事件
private val _error = MutableStateFlow<String?>(null)
// 问题1:新观察者注册时会收到旧错误
// 问题2:要“消费”错误,必须随后发射null
// 问题3:发射null与下一次读取之间存在竞态条件
// 正确:用SharedFlow处理一次性事件
private val _error = MutableSharedFlow<String>(extraBufferCapacity = 1)
fun sendError(msg: String) { _error.tryEmit(msg) }RCI(C) = CC(C) × (1 - stability_ratio(C)) × depth_of_state_reads(C)
Onde:
- CC = complexidade ciclomática da função @Composable
- stability_ratio = fração de parâmetros @Stable ou primitivos
- depth_of_state_reads = quantos StateFlows diferentes são lidos em C
Para DiagnosticsScreen (CC=54, lê 4+ StateFlows, poucos params estáveis):
RCI ≈ 54 × 0.8 × 4 = 172.8 ← CRÍTICO
Para comparação: HomeScreen ideal teria RCI < 20
Consequência: qualquer mudança em qualquer um dos 4+ StateFlows
aciona recomposição do scope INTEIRO de DiagnosticsScreen.
Se STT state muda 10x/segundo → DiagnosticsScreen recompõe 10x/segundo.RCI(C) = CC(C) × (1 - stability_ratio(C)) × depth_of_state_reads(C)
其中:
- CC = @Composable函数的圈复杂度
- stability_ratio = @Stable参数或原始类型的比例
- depth_of_state_reads = C中读取的不同StateFlow数量
对于DiagnosticsScreen(CC=54,读取4+个StateFlow,稳定参数少):
RCI ≈ 54 × 0.8 × 4 = 172.8 ← 严重
对比:理想的HomeScreen的RCI应<20
后果:任何4+个StateFlow中的任何变化都会触发DiagnosticsScreen整个作用域的重组
如果STT状态每秒变化10次 → DiagnosticsScreen每秒重组10次// PADRÃO 1: derivedStateOf — só recompõe se resultado muda
val isRecording by remember {
derivedStateOf { pipelineState.value.stage == RECORDING }
}
// PADRÃO 2: dividir em sub-composables menores
@Composable fun DiagnosticsScreen(...) {
Column {
SttDiagnostics(sttState) // recompõe só quando sttState muda
BtDiagnostics(btState) // recompõe só quando btState muda
LlmDiagnostics(llmState) // recompõe só quando llmState muda
}
}
// PADRÃO 3: key() para forçar identidade estável
LazyColumn {
items(items = tools, key = { it.id }) { tool ->
ToolCard(tool) // apenas o item com id mudado recompõe
}
}// 模式1:derivedStateOf — 仅在结果变化时重组
val isRecording by remember {
derivedStateOf { pipelineState.value.stage == RECORDING }
}
// 模式2:拆分为更小的子Composable
@Composable fun DiagnosticsScreen(...) {
Column {
SttDiagnostics(sttState) // 仅在sttState变化时重组
BtDiagnostics(btState) // 仅在btState变化时重组
LlmDiagnostics(llmState) // 仅在llmState变化时重组
}
}
// 模式3:key()强制稳定标识
LazyColumn {
items(items = tools, key = { it.id }) { tool ->
ToolCard(tool) // 仅id变化的项会重组
}
}Intent I = (action?, componentName?, data?, extras, flags)
Segurança formal:
- Explicit Intent: componentName ≠ null
→ Entregue exatamente ao componente especificado
→ Seguro: só aquele app recebe
- Implicit Intent: componentName = null, action ≠ null
→ Sistema resolve para apps com intent-filter matching
→ INSEGURO se múltiplos apps podem responder
→ Risco: app malicioso declara intent-filter → intercepta
Análise AuriToolExecutor:
makePhoneCall() → ACTION_CALL (implicit) → qualquer app pode interceptar
setAlarm() → ACTION_SET_ALARM (implicit) → qualquer app de alarme
sendEmail() → GmailClient direto (API) → não usa Intent → SEGURO
sendWhatsApp() → URL scheme "https://wa.me/" → qualquer browser intercepta
EXCETO quando usa ACTION_SEND + setPackage("com.whatsapp") → SEGURO
Risco de Intent Hijacking para chamada telefônica:
P(interceptado | app malicioso instalado) = 1.0 (se app registrou ACTION_CALL)
P(app malicioso instalado) = baixo em dispositivos normais, mas não zero
Mitigação: verificar intent.resolveActivity() antes de lançar, ou usar
ACTION_DIAL (mais seguro: exige confirmação do usuário)Intent I = (action?, componentName?, data?, extras, flags)
形式化安全:
- 显式Intent: componentName ≠ null
→ 精确传递给指定组件
→ 安全:只有该应用能接收
- 隐式Intent: componentName = null, action ≠ null
→ 系统解析为匹配intent-filter的应用
→ 不安全:若多个应用可响应
→ 风险:恶意应用声明intent-filter → 拦截
AuriToolExecutor分析:
makePhoneCall() → ACTION_CALL(隐式)→ 任何应用都可拦截
setAlarm() → ACTION_SET_ALARM(隐式)→ 任何闹钟应用
sendEmail() → 直接使用GmailClient(API)→ 不使用Intent → 安全
sendWhatsApp() → URL scheme "https://wa.me/" → 任何浏览器都可拦截
除非使用ACTION_SEND + setPackage("com.whatsapp") → 安全
电话呼叫的Intent劫持风险:
P(被拦截 | 安装恶意应用) = 1.0(如果应用注册了ACTION_CALL)
P(安装恶意应用) = 在正常设备上较低,但不为零
缓解方案:启动前检查intent.resolveActivity(),或使用ACTION_DIAL(更安全:需要用户确认)// INSEGURO: URL scheme pode ir para qualquer browser
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://wa.me/$phone?text=$text")))
// SEGURO: explicit via setPackage
val intent = Intent(Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, "$phone: $text")
setPackage("com.whatsapp") // força WhatsApp específico
}
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
} else {
// fallback gracioso
}// 不安全:URL scheme可跳转至任何浏览器
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://wa.me/$phone?text=$text")))
// 安全:通过setPackage显式指定
val intent = Intent(Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, "$phone: $text")
setPackage("com.whatsapp") // 强制指定WhatsApp
}
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
} else {
// 优雅降级
}Seja C_n = custo acumulado após n chamadas LLM (em USD)
C_n = Σ(i=1..n) X_i
Onde X_i = custo da i-ésima chamada:
X_i = (input_tokens_i × price_input + output_tokens_i × price_output) / 1000
Para gpt-4o (2025): price_input=$0.0025/1K, price_output=$0.010/1K
X_i típico: 200 input tokens + 150 output tokens ≈ $0.0005 + $0.0015 = $0.002
E[C_n] = n × E[X_i] = n × $0.002
Var[C_n] = n × Var[X_i]
Risco de ruína: P(C_n > L) → 1 para n → ∞ (crescimento inevitável)
Concentração de Chebyshev:
P(|C_n - E[C_n]| > k×sqrt(Var[C_n])) ≤ 1/k²
Para n=100 chamadas: E[C_100] ≈ $0.20, P(> $0.50) < 10% (k≈3)
Para n=1000 chamadas: E[C_1000] ≈ $2.00, P(> $5.00) < 10%设C_n = n次LLM调用后的累计成本(美元)
C_n = Σ(i=1..n) X_i
其中X_i = 第i次调用的成本:
X_i = (input_tokens_i × price_input + output_tokens_i × price_output) / 1000
对于gpt-4o(2025): price_input=$0.0025/1K, price_output=$0.010/1K
典型X_i: 200输入token + 150输出token ≈ $0.0005 + $0.0015 = $0.002
E[C_n] = n × E[X_i] = n × $0.002
Var[C_n] = n × Var[X_i]
破产风险:P(C_n > L) → 1 当n → ∞(成本必然增长)
切比雪夫集中不等式:
P(|C_n - E[C_n]| > k×sqrt(Var[C_n])) ≤ 1/k²
对于n=100次调用: E[C_100] ≈ $0.20, P(> $0.50) < 10%(k≈3)
对于n=1000次调用: E[C_1000] ≈ $2.00, P(> $5.00) < 10%Histórico de conversação em Auri: _conversationHistory.value = history + listOf(...)
Crescimento: O(n) tokens por n turnos (sem truncamento)
Para gpt-4o com max_context=128k tokens:
Ponto de ruptura: n_max = 128000 / avg_tokens_per_turn ≈ 128000 / 350 ≈ 365 turnos
Após 365 turnos: HTTP 400 "context_length_exceeded" — não tratado explicitamente
Comportamento atual: exceção genérica → estado ERROR no pipeline
Estratégia ótima de truncamento (Sliding Window com preservação):
Manter: [system_prompt] + [últimas K mensagens completas] + [resumo comprimido das antigas]
K ótimo: K = max_context / (2 × avg_tokens_per_turn) — usa metade do contexto
Resumo: comprimir messages[0..n-K] em 1-2 frases via LLM summary call
Custo extra do resumo: 1 chamada adicional a cada K turnos ≈ amortizado para 0Auri中的对话历史: _conversationHistory.value = history + listOf(...)
增长:每n轮对话增加O(n)个token(无截断)
对于max_context=128k token的gpt-4o:
断裂点: n_max = 128000 / avg_tokens_per_turn ≈ 128000 / 350 ≈ 365轮
超过365轮后:HTTP 400 "context_length_exceeded" — 未显式处理
当前行为:抛出通用异常 → 流水线进入ERROR状态
最优截断策略(带保留的滑动窗口):
保留:[系统提示] + [最近K条完整消息] + [旧消息的压缩摘要]
最优K: K = max_context / (2 × avg_tokens_per_turn) — 使用一半上下文
摘要:将messages[0..n-K]压缩为1-2句话(通过LLM摘要调用)
摘要的额外成本:每K轮调用一次LLM → 平均成本趋近于0references/auri-analysis.mdreferences/complexity-patterns.mdreferences/concurrency-models.mdreferences/information-theory.mdscripts/complexity_analyzer.pypython complexity_analyzer.py C:/projectscripts/dependency_graph.pypython dependency_graph.py C:/projectreferences/auri-analysis.mdreferences/complexity-patterns.mdreferences/concurrency-models.mdreferences/information-theory.mdscripts/complexity_analyzer.pypython complexity_analyzer.py C:/projectscripts/dependency_graph.pypython dependency_graph.py C:/project007claude-code-expert007claude-code-expert