// doctrine-scanner-exempt: legacy live-product surface; rename tracked as separate engineering debt — see scripts/check-doctrine-v6.mjs header. import type { Finding, PatchCandidate, Approval, AuditEvent, RLState } from '../lib/glasswing-schemas'; export const GLASSWING_VERSION = '1.0.0-experience-era'; export const GLASSWING_TAGLINE = 'An integrated agentic security command layer where each patch is an RL episode and each reward is a verified, calibrated risk delta — on owned, authorized code only.'; export const GLASSWING_THESIS = { headline: 'Risk-as-Reward', oneLine: 'Discover → patch → verify → reward → learn → audit — closed-loop, governance-gated, and replay-trained on calibrated risk delta.', body: 'Adjacent systems ship parts of this loop separately — discovery without patching, runtime gates without learning, or research demos without operationalization. To our knowledge, A11oy × Sentra Glasswing is the first integrated command layer combining all five primitives at once on owned, authorized code: the reward function is the verified delta in a calibrated risk score, the exploration budget is itself a Sentra-gated policy, and every action — including learning — leaves an immutable proof entry.', differentiators: [ 'The reward signal is verified post-patch by re-running the same scanners and the new tests — not a heuristic, not a confidence score.', 'Exploration vs exploitation is governed: novel code paths require a Sentra exploration budget; high-confidence fixes execute under approval.', 'Replay buffer entries are linked to immutable audit events — every episode the policy learns from is independently provable.', 'Cerberus enforces a hard offensive boundary at the action layer — no exploit generation can be requested even by an authorized human.', 'Compliance mapping is bidirectional — every finding maps to CWE / OWASP / NIST CSF / SOC 2 / ATLAS-defensive in the same record.', ], } as const; export const GLASSWING_FIELD_MAP = [ { name: 'OpenAI Aardvark', capability: 'Agentic vulnerability discovery', closesLoop: false, governance: 'Internal', learning: 'Implicit', note: 'Excellent at hunting; remediation is left to humans.', }, { name: 'Microsoft Agent Governance Toolkit', capability: 'Runtime governance for agents', closesLoop: false, governance: 'Open source toolkit', learning: 'None', note: 'Gates actions at runtime; not a remediation engine.', }, { name: 'Project Glasswing (frontier lab)', capability: 'Critical-software security research initiative', closesLoop: false, governance: 'Research-grade', learning: 'Lab', note: 'Public initiative on securing critical software for the AI era. Not an operationalized governance platform.', }, { name: 'CVSS-RL exploit optimizers (academic)', capability: 'RL on attacker side', closesLoop: false, governance: 'None', learning: 'RL', note: 'Optimizes attack paths, not defense. Out of scope for any defensive platform.', }, { name: 'A11oy × Sentra Glasswing', capability: 'Closed-loop governed patch + verify + learn', closesLoop: true, governance: 'Sentra control plane', learning: 'RL on calibrated risk delta', note: 'Differentiator: every patch is an RL episode; every reward is a verified, audited, governed risk delta.', }, ] as const; export const GLASSWING_CITATIONS = [ { label: 'Silver & Sutton — "Welcome to the Era of Experience" (2025)', url: 'https://storage.googleapis.com/deepmind-media/Era-of-Experience%20/The%20Era%20of%20Experience%20Paper.pdf', relevance: 'Foundational thesis: agents learn continuously from grounded experience, not static human data.', }, { label: 'MITRE ATLAS — Adversarial Threat Landscape for AI Systems', url: 'https://atlas.mitre.org/', relevance: 'Defensive mapping of 16 tactics × 84 techniques. Glasswing maps every finding to ATLAS-defensive only.', }, { label: 'arxiv 2401.07031 — Code Security Vulnerability Repair Using RL with LLMs', url: 'https://arxiv.org/html/2401.07031', relevance: 'Calibrated reward shaping for security correctness vs functional preservation.', }, { label: 'arxiv 2507.05619 — Detecting & Mitigating Reward Hacking in RL Systems', url: 'https://arxiv.org/html/2507.05619v1', relevance: 'Empirical foundation for the Cerberus hard-block layer and the verified-reward requirement.', }, { label: 'Microsoft Agent Governance Toolkit (April 2026)', url: 'https://opensource.microsoft.com/blog/2026/04/02/introducing-the-agent-governance-toolkit-open-source-runtime-security-for-ai-agents/', relevance: 'State of the art in runtime gates. Glasswing extends this with a learning loop.', }, { label: 'OpenAI Aardvark — Agentic Security Researcher', url: 'https://openai.com/index/introducing-aardvark/', relevance: 'State of the art in agentic vulnerability discovery. Glasswing extends discovery into governed remediation.', }, { label: 'Gartner — only 11% of orgs have agent governance frameworks (2026)', url: 'https://www.raconteur.net/technology/autonomous-ai-agents-2026-the-new-rules-for-business-governance', relevance: 'Market gap: 75% of enterprises plan agent deployment by end-2026; <11% have governance for it.', }, ] as const; export type GlasswingAgentId = | 'daedalus' | 'argus' | 'ariadne' | 'hephaestus' | 'pallas' | 'hermes' | 'cerberus' | 'silver' | 'sentinel' | 'oracle'; export interface GlasswingAgentSpec { id: GlasswingAgentId; codename: string; role: string; myth: string; responsibility: string; produces: string[]; state: 'idle' | 'running' | 'awaiting_approval' | 'blocked' | 'learning'; lastAction: string; lastActionAt: string; episodesContributed: number; blockOnly?: boolean; } export const GLASSWING_AGENTS: GlasswingAgentSpec[] = [ { id: 'daedalus', codename: 'Daedalus', role: 'Repository Intelligence', myth: 'Architect of the labyrinth — maps every passage before any other agent enters.', responsibility: 'Builds the codebase map: routes, auth boundaries, data flow, ownership, dependency graph.', produces: ['repo_inventory.json', 'route_map.json', 'auth_boundary_map.json', 'data_flow_map.json'], state: 'idle', lastAction: 'Mapped 1,847 routes across 14 services', lastActionAt: '2026-04-27T16:08:42Z', episodesContributed: 312, }, { id: 'argus', codename: 'Argus', role: 'Security Scanner', myth: 'Hundred-eyed watcher — sees what no single scanner sees alone.', responsibility: 'Orchestrates Semgrep, OSV, Gitleaks, Trivy, Grype, Checkov; normalizes into the Finding schema.', produces: ['sast_findings.json', 'sca_findings.json', 'secrets_findings.json', 'iac_findings.json'], state: 'running', lastAction: 'Argus consolidated 1,402 raw → 168 deduped findings', lastActionAt: '2026-04-27T16:42:11Z', episodesContributed: 287, }, { id: 'ariadne', codename: 'Ariadne', role: 'Logic Boundary', myth: 'Holder of the thread — finds the path scanners cannot follow.', responsibility: 'Detects auth gaps, IDOR risk, tenant isolation, unsafe upload paths, missing rate limits.', produces: ['logic_findings.json', 'boundary_risk_map.json', 'recommended_policy_updates.json'], state: 'learning', lastAction: 'Surfaced 3 admin route exposures missed by SAST', lastActionAt: '2026-04-27T16:31:09Z', episodesContributed: 156, }, { id: 'hephaestus', codename: 'Hephaestus', role: 'Patch Engineer', myth: 'Forge of the gods — every patch is hammered, tempered, and tested before it ships.', responsibility: 'Generates minimal patches with regression tests, security tests, rollback notes, PR descriptions.', produces: ['patch_candidates/*.diff', 'test_plans/*.md', 'rollback_notes/*.md'], state: 'awaiting_approval', lastAction: '4 patch candidates queued for review', lastActionAt: '2026-04-27T16:55:33Z', episodesContributed: 198, }, { id: 'pallas', codename: 'Pallas', role: 'Risk & Prioritization', myth: 'Strategy made wisdom — converts technical risk into executive priority.', responsibility: 'Computes P1–P4, executive risk summary, developer remediation queue, risk burn-down.', produces: ['executive_risk_summary.md', 'developer_remediation_queue.md', 'risk_burndown.json'], state: 'idle', lastAction: 'Recomputed P1–P4 backlog after Argus delta', lastActionAt: '2026-04-27T16:44:02Z', episodesContributed: 224, }, { id: 'hermes', codename: 'Hermes', role: 'Communication & Disclosure', myth: 'Messenger of the pantheon — translates risk for boards, customers, and engineers without exploit detail.', responsibility: 'Generates executive briefs, engineering tickets, customer-safe summaries, maintainer disclosures.', produces: ['executive_summary.md', 'engineering_ticket.md', 'customer_safe_summary.md'], state: 'idle', lastAction: 'Drafted 7 redacted disclosure notes', lastActionAt: '2026-04-27T15:51:18Z', episodesContributed: 91, }, { id: 'cerberus', codename: 'Cerberus', role: 'Guardrail Enforcer', myth: 'Three-headed guardian — nothing offensive crosses out, nothing unauthorized crosses in.', responsibility: 'Hard-blocks exploit generation, credential theft, lateral movement, exfiltration, unauthorized scans.', produces: ['cerberus_block_log.json', 'denied_actions/*.json'], state: 'running', lastAction: 'Blocked 12 unsafe action attempts in last 24h', lastActionAt: '2026-04-27T16:58:01Z', episodesContributed: 0, blockOnly: true, }, { id: 'silver', codename: 'Silver', role: 'Reinforcement Planner', myth: 'Era of Experience — learns from outcomes, not from snippets.', responsibility: 'State / action / reward / value; replay buffer; exploration budget; next-action selection.', produces: ['policy_snapshot.json', 'replay_buffer.parquet', 'value_function.bin'], state: 'learning', lastAction: 'Replayed 84 episodes; avg reward +6.2', lastActionAt: '2026-04-27T16:50:44Z', episodesContributed: 1024, }, { id: 'sentinel', codename: 'Sentinel', role: 'Runtime & Observability', myth: 'The watcher of the watchers — every agent action is metered.', responsibility: 'Tracks scan duration, FP rate, approval latency, patch acceptance, P1/P2 burn-down.', produces: ['ops_metrics.json', 'sentra_health_report.md'], state: 'running', lastAction: 'Metrics OK; approval p95 latency 4m 12s', lastActionAt: '2026-04-27T16:59:50Z', episodesContributed: 0, }, { id: 'oracle', codename: 'Oracle', role: 'Architecture Strategy', myth: 'CTO at altitude — sees the platform shape, not just the patch.', responsibility: 'Identifies architecture debt, recommends domain boundaries, drafts ADR candidates.', produces: ['architecture_review.md', 'adr_candidates.md', 'platform_roadmap.md'], state: 'idle', lastAction: 'Proposed 2 ADRs for tenant boundary refactor', lastActionAt: '2026-04-27T14:22:08Z', episodesContributed: 38, }, ]; export interface SentraPolicyRule { id: string; scope: string; action: string; decision: 'allow' | 'warn' | 'approval_required' | 'deny'; rationale: string; } export const SENTRA_POLICIES: SentraPolicyRule[] = [ { id: 'sp-001', scope: 'any', action: 'exploit_generation', decision: 'deny', rationale: 'Hard offensive boundary — no exception.' }, { id: 'sp-002', scope: 'any', action: 'credential_theft', decision: 'deny', rationale: 'Hard offensive boundary — no exception.' }, { id: 'sp-003', scope: 'any', action: 'unauthorized_scan', decision: 'deny', rationale: 'Only owned/authorized targets allowed.' }, { id: 'sp-004', scope: 'owned_repo', action: 'sast_scan', decision: 'allow', rationale: 'Defensive scan on owned code is always allowed.' }, { id: 'sp-005', scope: 'owned_repo', action: 'patch_apply', decision: 'approval_required', rationale: 'No source modification without human approval.' }, { id: 'sp-006', scope: 'owned_repo', action: 'dependency_upgrade', decision: 'approval_required', rationale: 'Supply-chain risk requires human review.' }, { id: 'sp-007', scope: 'owned_repo', action: 'iac_change', decision: 'approval_required', rationale: 'Infrastructure mutation requires reviewer + rollback.' }, { id: 'sp-008', scope: 'production', action: 'deploy', decision: 'approval_required', rationale: 'Deployment is always reviewer-gated.' }, { id: 'sp-009', scope: 'any_log', action: 'print_secret_raw', decision: 'deny', rationale: 'Vault redacts before render — no raw secret ever surfaces.' }, { id: 'sp-010', scope: 'silver', action: 'explore_novel_path', decision: 'approval_required', rationale: 'Exploration budget is itself a governed policy.' }, ]; export const SENTRA_VAULT = { redactedSecrets24h: 412, fingerprintsTracked: 1287, rotationsSuggested: 7, lastRedactionAt: '2026-04-27T16:57:11Z', vaultPolicy: 'Fingerprint-only storage. Raw values never persisted. SHA-256 with org pepper.', } as const; export const SAMPLE_FINDINGS: Finding[] = [ { id: 'fnd-cri-0001', source: 'ariadne', category: 'auth', title: 'Admin route missing role check', description: 'Route POST /admin/tenants/:id/billing-reset reachable without admin role assertion.', severity: 'critical', confidence: 0.94, cwe: 'CWE-862', owasp: 'A01:2021', file: 'apps/api/src/routes/admin.ts', line: 142, evidenceRedacted: 'router.post("/admin/tenants/:id/billing-reset", async (req, res) => { /* auth check absent */ })', affectedComponent: 'api/admin', reachability: 'reachable', internetExposed: true, authBoundary: true, tenantBoundary: true, dataSensitivity: 'pii', remediation: 'Wrap handler in requireRole("admin") and add tenant-scoped audit event.', riskScore: 92, riskBand: 'P1', status: 'awaiting_approval', createdAt: '2026-04-27T15:42:00Z', updatedAt: '2026-04-27T16:55:33Z', }, { id: 'fnd-hi-0002', source: 'argus', category: 'sca', title: 'Vulnerable transitive dep — CVE-2026-30412', description: 'parse-url 8.1.0 reachable in api-server bundle; deserialization of untrusted input.', severity: 'high', confidence: 0.88, cwe: 'CWE-502', owasp: 'A08:2021', file: 'apps/api/package.json', line: 47, evidenceRedacted: '"parse-url": "8.1.0" — reachable from POST /webhooks/inbound', affectedComponent: 'api/webhooks', reachability: 'reachable', internetExposed: true, authBoundary: false, tenantBoundary: false, dataSensitivity: 'internal', remediation: 'Upgrade to parse-url 9.0.4. Add regression test for malformed inbound payloads.', riskScore: 76, riskBand: 'P2', status: 'patch_proposed', createdAt: '2026-04-27T14:11:00Z', updatedAt: '2026-04-27T16:30:11Z', }, { id: 'fnd-hi-0003', source: 'gitleaks', category: 'secrets', title: 'Stripe live key fingerprint detected in commit', description: 'Fingerprint of a Stripe live secret found in git history (commit 7b1074e). Raw value never stored.', severity: 'high', confidence: 0.99, cwe: 'CWE-798', file: 'scripts/seed.ts', line: 12, evidenceRedacted: 'sk_live_••••••••••••••••••••3f2a (fingerprint a1b2c3d4)', affectedComponent: 'scripts/seed', reachability: 'reachable', internetExposed: false, authBoundary: false, tenantBoundary: false, dataSensitivity: 'secret', remediation: 'Rotate Stripe key immediately; rewrite history; add pre-commit gitleaks hook.', riskScore: 71, riskBand: 'P2', status: 'awaiting_approval', createdAt: '2026-04-27T13:02:00Z', updatedAt: '2026-04-27T16:15:00Z', }, { id: 'fnd-med-0004', source: 'ariadne', category: 'rate_limit', title: 'Login endpoint missing rate limit', description: 'POST /auth/login has no per-IP or per-account rate limit; vulnerable to credential stuffing.', severity: 'medium', confidence: 0.81, cwe: 'CWE-307', owasp: 'A07:2021', file: 'apps/api/src/routes/auth.ts', line: 89, evidenceRedacted: 'router.post("/auth/login", loginHandler) — no rate-limit middleware', affectedComponent: 'api/auth', reachability: 'reachable', internetExposed: true, authBoundary: true, tenantBoundary: false, dataSensitivity: 'pii', remediation: 'Add express-rate-limit (5/min/IP, 10/hr/account); emit Sentra audit event on lockout.', riskScore: 58, riskBand: 'P3', status: 'patch_proposed', createdAt: '2026-04-27T12:48:00Z', updatedAt: '2026-04-27T16:01:00Z', }, ]; export const SAMPLE_PATCHES: PatchCandidate[] = [ { id: 'patch-0001', findingIds: ['fnd-cri-0001'], title: 'Add admin role assertion + tenant audit on billing-reset route', summary: 'Wraps handler in requireRole("admin"); emits tenant-scoped audit event; adds 2 regression tests.', filesChanged: ['apps/api/src/routes/admin.ts', 'apps/api/test/admin.spec.ts'], diffPreview: '+ router.post("/admin/tenants/:id/billing-reset",\n+ requireRole("admin"),\n+ auditTenant("billing.reset"),\n+ billingResetHandler);', testsAdded: ['admin.spec.ts › rejects non-admin', 'admin.spec.ts › emits audit event on success'], commandsToRun: ['pnpm --filter api test admin.spec.ts', 'pnpm --filter api lint'], rollbackPlan: 'Revert single commit; no data migration; route returns to prior behavior.', riskBefore: 92, riskAfterEstimate: 8, approvalRequired: true, approvalId: 'apr-0001', status: 'awaiting_approval', generatedBy: 'hephaestus', generatedAt: '2026-04-27T16:55:33Z', }, { id: 'patch-0002', findingIds: ['fnd-hi-0002'], title: 'Upgrade parse-url 8.1.0 → 9.0.4 + add inbound webhook fuzzer test', summary: 'Pinned upgrade; lockfile diff reviewed; new fuzzer covers malformed payload classes.', filesChanged: ['apps/api/package.json', 'pnpm-lock.yaml', 'apps/api/test/webhooks.fuzz.spec.ts'], diffPreview: '- "parse-url": "8.1.0"\n+ "parse-url": "9.0.4"', testsAdded: ['webhooks.fuzz.spec.ts › 200 random payload classes return 400 not 500'], commandsToRun: ['pnpm install', 'pnpm --filter api test webhooks.fuzz.spec.ts'], rollbackPlan: 'pnpm install parse-url@8.1.0; revert lockfile.', riskBefore: 76, riskAfterEstimate: 6, approvalRequired: true, approvalId: 'apr-0002', status: 'awaiting_approval', generatedBy: 'hephaestus', generatedAt: '2026-04-27T16:30:11Z', }, ]; export const SAMPLE_APPROVALS: Approval[] = [ { id: 'apr-0001', requestedByAgent: 'hephaestus', actionType: 'patch_apply', description: 'Apply patch-0001 (admin role assertion on billing-reset)', resources: ['apps/api/src/routes/admin.ts', 'apps/api/test/admin.spec.ts'], fileChangePreview: '+ requireRole("admin"), auditTenant("billing.reset"), …', riskSummary: 'Risk 92 → 8 (estimated). P1 → P4. No customer-visible regression expected.', rollbackPlan: 'git revert ', status: 'pending', createdAt: '2026-04-27T16:55:33Z', }, { id: 'apr-0002', requestedByAgent: 'hephaestus', actionType: 'dependency_upgrade', description: 'Upgrade parse-url 8.1.0 → 9.0.4', resources: ['apps/api/package.json', 'pnpm-lock.yaml'], fileChangePreview: '- "parse-url": "8.1.0"\n+ "parse-url": "9.0.4"', riskSummary: 'Risk 76 → 6. CVE-2026-30412 closed. Lockfile delta reviewed.', rollbackPlan: 'Pin previous version; revert lockfile.', status: 'pending', createdAt: '2026-04-27T16:30:11Z', }, { id: 'apr-0003', requestedByAgent: 'silver', actionType: 'external_call', description: 'Exploration budget request: scan 3 novel module clusters (off main code path)', resources: ['packages/forge-runtime', 'packages/sandbox-runtime', 'packages/replay-core'], riskSummary: 'No risk to production. Cost: ~14 scanner-minutes. Expected new findings: 4–9.', rollbackPlan: 'No-op — read-only exploration.', status: 'pending', createdAt: '2026-04-27T16:50:44Z', }, ]; export const SAMPLE_AUDIT: AuditEvent[] = [ { id: 'aud-09a4', timestamp: '2026-04-27T16:58:01Z', agent: 'cerberus', action: 'block.exploit_request', resource: 'requested_by:silver', inputHash: 'sha256:7b10…f2a1', outputHash: 'sha256:0000…0000', policyDecision: 'deny', evidenceLinks: ['cerberus_block_log.json#row=412'], confidence: 1.0, status: 'blocked', prevHash: 'sha256:6a02…11de', }, { id: 'aud-09a3', timestamp: '2026-04-27T16:55:33Z', agent: 'hephaestus', action: 'patch.draft', resource: 'fnd-cri-0001', inputHash: 'sha256:9b21…8e10', outputHash: 'sha256:c4e1…01ba', policyDecision: 'approval_required', approvalId: 'apr-0001', evidenceLinks: ['patch_candidates/patch-0001.diff', 'test_plans/patch-0001.md'], confidence: 0.93, status: 'ok', prevHash: 'sha256:5e10…aa42', }, { id: 'aud-09a2', timestamp: '2026-04-27T16:50:44Z', agent: 'silver', action: 'replay.episode_batch', resource: 'replay_buffer.parquet#batch=84', inputHash: 'sha256:81a4…0c92', outputHash: 'sha256:de3f…7711', policyDecision: 'allow', evidenceLinks: ['policy_snapshot.json#v=132'], confidence: 0.88, status: 'ok', prevHash: 'sha256:42a1…99cc', }, { id: 'aud-09a1', timestamp: '2026-04-27T16:42:11Z', agent: 'argus', action: 'scan.consolidate', resource: 'commit:7b1074e', inputHash: 'sha256:b201…ff10', outputHash: 'sha256:1c8e…3a02', policyDecision: 'allow', evidenceLinks: ['consolidated_security_findings.json'], confidence: 0.96, status: 'ok', prevHash: 'sha256:7711…0028', }, { id: 'aud-09a0', timestamp: '2026-04-27T16:08:42Z', agent: 'daedalus', action: 'map.repo', resource: 'commit:7b1074e', inputHash: 'sha256:fe11…b001', outputHash: 'sha256:88a1…2241', policyDecision: 'allow', evidenceLinks: ['repo_inventory.json', 'route_map.json'], confidence: 0.99, status: 'ok', }, ]; export const RL_STATE_NOW: RLState = { repoId: 'szl-holdings-monorepo', commitSha: '7b1074efcf55a00d305a1be643223ce8d79fe267', findingsSummary: { p1: 1, p2: 2, p3: 1, p4: 0 }, testsStatus: { passing: 1842, failing: 0, coverage: 0.78 }, policyStatus: 'warn', riskPosture: 64, historicalContext: { episodesCompleted: 1024, avgReward: 6.2, falsePositiveRate: 0.041, patchAcceptanceRate: 0.82, }, }; export const ENGINEERING_LOOP_STAGES = [ { stage: 'Understand', detail: 'Read repo. Build context. Summarize architecture. Identify constraints.', agent: 'daedalus' }, { stage: 'Plan', detail: 'Produce task plan. Identify files to inspect. Identify tests to run. Score risk.', agent: 'silver' }, { stage: 'Act', detail: 'Propose file edits. Propose commands. Request Sentra approval if required.', agent: 'hephaestus' }, { stage: 'Verify', detail: 'Run tests. Re-run scanners. Compare risk delta. Iterate safely.', agent: 'argus' }, { stage: 'Commit', detail: 'Generate patch bundle, PR description, evidence pack, rollback note.', agent: 'hermes' }, { stage: 'Learn', detail: 'Store outcome. Update replay buffer. Adjust value function. Recalibrate.', agent: 'silver' }, ] as const; export const COMPLIANCE_MAP = [ { framework: 'CWE', coverage: 0.94, sample: 'CWE-862, CWE-502, CWE-798, CWE-307' }, { framework: 'OWASP Top 10', coverage: 1.00, sample: 'A01, A03, A07, A08' }, { framework: 'NIST CSF 2.0', coverage: 0.88, sample: 'ID.AM, PR.DS, DE.CM, RS.MI' }, { framework: 'SOC 2', coverage: 0.91, sample: 'CC6.1, CC6.6, CC7.1, CC7.2' }, { framework: 'ISO 27001', coverage: 0.86, sample: 'A.5.10, A.8.2, A.8.24, A.8.28' }, { framework: 'MITRE ATLAS', coverage: 0.72, sample: 'AML.T0043, AML.T0051 (defensive mapping only)' }, ] as const; export const HARD_BOUNDARIES = [ 'No exploit generation — ever, even if requested by an authorized human.', 'No weaponized PoC payloads — risk is communicated as assessment, not as runnable attack.', 'No unauthorized scanning — owned/authorized targets only, enforced at ingest.', 'No malware, persistence, lateral movement, evasion, C2, or exfiltration capability.', 'No raw secret display — Sentra Vault redacts before any render or log surface.', 'No source modification without approval — every patch goes through SentraApprovalGate.', 'No silent failure — every recommendation carries evidence, confidence, blast radius, rollback.', ] as const;