Skip to content

fix: provenance closure — evidence chain, operator trust, Tauri security (v1.8.0)#48

Merged
elasticdotventures merged 13 commits into
mainfrom
fix/review-gaps-p0-p1
May 1, 2026
Merged

fix: provenance closure — evidence chain, operator trust, Tauri security (v1.8.0)#48
elasticdotventures merged 13 commits into
mainfrom
fix/review-gaps-p0-p1

Conversation

@promptexecutionerr
Copy link
Copy Markdown
Collaborator

Summary

  • Evidence chain closed: EvidenceBuilder wired throughout ingest/classify/export; ValidationIssue nodes emitted from low-confidence classify path; WorkbookRow nodes emitted on export; work_queue_summary() projection replaces manual counting in TodayQueue
  • Operator trust fixed: provider_status(settings) now requires AppSettings so cloud readiness reflects actual configuration; cloud_readiness rejects internal endpoints and placeholder keys; resolve_chat_settings returns (ChatSettings, Option<ProviderReadiness>) so callers surface fallback warnings
  • Tauri security hardened: CSP null → restrictive policy; unsafe_code = "allow" → workspace lint inheritance; review_log_text: Option<String> preserves existing log on error path
  • Foundry Local robustness: foundry_local_chat_settings returns Err on undiscovered endpoint instead of silently falling back to hardcoded port 5272; discovery probe uses 2s/1s timeouts
  • ledger-core as type authority: From<ArtifactKind> for NodeType bridge + 12 arc-kit-au re-exports behind feature gate satisfy PRD-4 AC-4.1.1
  • Invariant fixes: let _ = on evidence ops → ensure_* idempotent builder methods + tracing::warn!; mutex poison surfaces error instead of silently recovering; settings V1→V2 migration write separated from load path; evidence_path() method eliminates duplicated sidecar path computation
  • Test fixes: tests relocated inside #[cfg(test)] mod tests; .unwrap() removed from unit-returning build_full_chain; cloud_readiness test correctly uses external endpoint + real key to assert Ready

Closes

All P0/P1/P2/P3 gaps from the review of PR #47 + harmonization rounds H1–H8 + Copilot concerns C1–C5.

Test plan

  • cargo test -p arc-kit-au — 41 passed, 0 failed
  • cargo test -p ledgerr-host — 49 passed, 0 failed
  • cargo test -p ledgerr-mcp — all passed, 0 failed
  • cargo test -p ledger-core — all passed, 0 failed
  • Windows binaries built: host-tray.exe (241 MB), ledgerr-mcp-server.exe (188 MB)
  • Version bumped 1.7.0 → 1.8.0 via cog bump --minor

🤖 Generated with Claude Code

Claude Sonnet (coordinator) and others added 13 commits May 2, 2026 00:11
…, cloud readiness, provider fallback, evidence emission for export/validation
…t EvidenceBuilder, ValidationIssue emission, work_queue_summary, bridge, resolve_chat
…idation field, H7 From<NodeType> bridge + re-exports
…P, unsafe_code, review_log_text Option, doc placement
…test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AppSettings::default() uses the local demo endpoint/key/model — all
non-empty — causing cloud_readiness to return Ready for unconfigured
cloud settings. Exclude localhost/127.x endpoints and known placeholder
keys (local-tool-tray, local-foundry) so Ready requires a genuine
external endpoint and real credentials.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Brian Horakh <35611074+elasticdotventures@users.noreply.github.com>
@elasticdotventures elasticdotventures merged commit 87bfbc0 into main May 1, 2026
1 check failed
use thiserror::Error;

use crate::edge::{EdgeType, EvidenceEdge};
use crate::missing::{ProvenanceScanner, ProvenanceGap};
use thiserror::Error;

use crate::edge::{EdgeType, EvidenceEdge};
use crate::missing::{ProvenanceScanner, ProvenanceGap};
#[cfg(test)]
mod tests {
use super::*;
use crate::node::{Classification, SourceDoc, Transaction};
use crate::node::{Classification, SourceDoc, Transaction};
use chrono::TimeZone;
use chrono::Utc;
use rust_decimal::Decimal;
}

pub fn hash(&self) -> &str {
self.0.splitn(2, ':').nth(1).unwrap_or(&self.0)
}

pub fn hash(&self) -> &str {
self.0.splitn(2, ':').nth(1).unwrap_or(&self.0)
Comment on lines +1434 to +1436
reason: format!(
"{} unavailable, fell back to Local Demo. {}",
settings.model_provider.display_name(),
row: &TransactionInput,
tx_id: &str,
) -> Result<(), ToolError> {
use arc_kit_au::EdgeType;
row: &TransactionInput,
tx_id: &str,
) -> Result<(), ToolError> {
use arc_kit_au::EdgeType;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants