Skip to content
BreachPilot

Config Reference (Generated)

Config Reference (Generated)

Machine-readable companion to docs/config-reference.md. Every key below was verified to exist in config.yaml at generation time — no invented keys. Lab values (config.yaml) vs schema defaults (tools/config_manager.py:CONFIG_SCHEMA) are both shown where they differ. See docs/configuration/overview.md for loading/precedence and docs/configuration/validation.md for type checks.

Source locations use config.yaml:<top-level-line> + tools/config_manager.py:CONFIG_SCHEMA path. Consumers are primary file:line citations; full call graph is in docs/module-guide.md.

Generated 2026-09-07 from config.yaml (439 leaf keys, 46 top-level blocks). Lab-only keys (not in CONFIG_SCHEMA) are marked.

KeyTypeDefault (schema → lab)AllowedSourceConsumer(s)EffectEnv overrideRestartSubsystemTests
adaptive_exploits.enabledboolTrue—config.yaml:381 + CONFIG_SCHEMA['adaptive_exploits'].enabledcli_exploit_settings.py, mcp_tools/attack_modules.pyMutation engine—noexploittests/test_mutator.py
adaptive_exploits.max_mutationsint5—config.yaml:381 + CONFIG_SCHEMA['adaptive_exploits'].max_mutationscli_exploit_settings.py, mcp_tools/attack_modules.pyMutation engine—noexploittests/test_mutator.py
adaptive_exploits.mutation_strategieslist[str]['parameter_tweak', 'encoding_change', 'delivery_swap', 'context_aware']—config.yaml:381 + CONFIG_SCHEMA['adaptive_exploits'].mutation_strategiescli_exploit_settings.py, mcp_tools/attack_modules.pyMutation engine—noexploittests/test_mutator.py
agent.capability_discovery_enabledboolTrue—config.yaml:513 + CONFIG_SCHEMA['agent'].capability_discovery_enabledattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.decision_log_enabledboolTrue—config.yaml:513 + CONFIG_SCHEMA['agent'].decision_log_enabledattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.generated_code_repair_attemptsint3—config.yaml:513 + CONFIG_SCHEMA['agent'].generated_code_repair_attemptsattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.max_actionsint0—config.yaml:513 + CONFIG_SCHEMA['agent'].max_actionsattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.max_retries_per_taskint2—config.yaml:513 + CONFIG_SCHEMA['agent'].max_retries_per_taskattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.planner_hints_enabledboolTrue—config.yaml:513 + CONFIG_SCHEMA['agent'].planner_hints_enabledattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.reflection_enabledboolTrue—config.yaml:513 + CONFIG_SCHEMA['agent'].reflection_enabledattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.state_tools_enabledboolTrue—config.yaml:513 + CONFIG_SCHEMA['agent'].state_tools_enabledattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
agent.task_graph_enabledboolTrue—config.yaml:513 + CONFIG_SCHEMA['agent'].task_graph_enabledattack_planner.py, decision_log.pyTask graph—noagenttests/test_agent*.py
api.allowed_originslist[]—config.yaml:438 + CONFIG_SCHEMA['api'].allowed_originsapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.enabledboolTrue—config.yaml:438 + CONFIG_SCHEMA['api'].enabledapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.event_buffer_sizeint256—config.yaml:438 + CONFIG_SCHEMA['api'].event_buffer_sizeapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.graph_routeboolTrue—config.yaml:438 + CONFIG_SCHEMA['api'].graph_routeapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.hoststr'127.0.0.1'127.0.0.1 | localhost | ::1 else ERRORconfig.yaml:438 + CONFIG_SCHEMA['api'].hostapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.max_concurrent_runsint3 (lab-only, not in CONFIG_SCHEMA)—config.yaml:438 (lab extra)app.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.multi_operatorboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:438 (lab extra)app.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.portint8765—config.yaml:438 + CONFIG_SCHEMA['api'].portapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.serve_webuiboolFalse (schema) → True (lab)—config.yaml:438 + CONFIG_SCHEMA['api'].serve_webuiapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.shutdown_timeout_secondsint15—config.yaml:438 + CONFIG_SCHEMA['api'].shutdown_timeout_secondsapp.py, api/*, doctor.pyWebUI daemon—yesapi/webuitests/test_api*.py
api.token_filestr'.webui_secret_key'—config.yaml:438 + CONFIG_SCHEMA['api'].token_fileapp.py, api/*, doctor.pyWebUI daemonBREACHPILOT_API_TOKEN overridesyesapi/webuitests/test_api*.py
autonomous.adaptive_replanboolFalse—config.yaml:198 + CONFIG_SCHEMA['autonomous'].adaptive_replanautonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
autonomous.checkpoint_everyint0—config.yaml:198 + CONFIG_SCHEMA['autonomous'].checkpoint_everyautonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
autonomous.dedup_targetsboolFalse (lab-only, not in CONFIG_SCHEMA)—config.yaml:198 (lab extra)autonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
autonomous.hard_target_max_roundsint0 (lab-only, not in CONFIG_SCHEMA)—config.yaml:198 (lab extra)autonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
autonomous.max_cyclesint100—config.yaml:198 + CONFIG_SCHEMA['autonomous'].max_cyclesautonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
autonomous.max_parallel_targetsint1 (lab-only, not in CONFIG_SCHEMA)—config.yaml:198 (lab extra)——noautonomous—
autonomous.max_pivot_depthint0—config.yaml:198 + CONFIG_SCHEMA['autonomous'].max_pivot_depthautonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
autonomous.persistence_phaseboolFalse—config.yaml:198 + CONFIG_SCHEMA['autonomous'].persistence_phaseautonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
autonomous.skip_non_routableboolFalse (lab-only, not in CONFIG_SCHEMA)—config.yaml:198 (lab extra)autonomous_orchestrator.pyOrchestrator Phase 2—noautonomoustests/test_autonomous*.py
benchmark.baseline_pathstr'reports/benchmarks/baseline.json'—config.yaml:276 + CONFIG_SCHEMA['benchmark'].baseline_path——nobenchmark—
benchmark.enabledboolTrue—config.yaml:276 + CONFIG_SCHEMA['benchmark'].enabled——nobenchmark—
benchmark.output_dirstr'reports/benchmarks'—config.yaml:276 + CONFIG_SCHEMA['benchmark'].output_dir——nobenchmark—
benchmark.regression.cost_tolerancefloat0.3—config.yaml:276 + CONFIG_SCHEMA['benchmark'].regression.cost_tolerance——nobenchmark—
benchmark.regression.enabledboolTrue—config.yaml:276 + CONFIG_SCHEMA['benchmark'].regression.enabled——nobenchmark—
benchmark.regression.false_positive_tolerancefloat0.01—config.yaml:276 + CONFIG_SCHEMA['benchmark'].regression.false_positive_tolerance——nobenchmark—
benchmark.regression.median_time_tolerancefloat0.2—config.yaml:276 + CONFIG_SCHEMA['benchmark'].regression.median_time_tolerance——nobenchmark—
benchmark.regression.success_rate_tolerancefloat0.02—config.yaml:276 + CONFIG_SCHEMA['benchmark'].regression.success_rate_tolerance——nobenchmark—
benchmark.regression.tool_actions_tolerancefloat0.3—config.yaml:276 + CONFIG_SCHEMA['benchmark'].regression.tool_actions_tolerance——nobenchmark—
benchmark.sandbox_requiredboolTrue—config.yaml:276 + CONFIG_SCHEMA['benchmark'].sandbox_required——nobenchmark—
benchmark.telemetry.costboolTrue—config.yaml:276 + CONFIG_SCHEMA['benchmark'].telemetry.cost——nobenchmark—
benchmark.telemetry.eventsboolTrue—config.yaml:276 + CONFIG_SCHEMA['benchmark'].telemetry.events——nobenchmark—
benchmark.telemetry.token_usageboolTrue—config.yaml:276 + CONFIG_SCHEMA['benchmark'].telemetry.token_usage——nobenchmark—
benchmark.timeout_secondsint1800—config.yaml:276 + CONFIG_SCHEMA['benchmark'].timeout_seconds——nobenchmark—
benchmark.trialsint3—config.yaml:276 + CONFIG_SCHEMA['benchmark'].trials——nobenchmark—
browser.allow_mutating_actionsboolFalse—config.yaml:299 + CONFIG_SCHEMA['browser'].allow_mutating_actions——nobrowser—
browser.artifact_dirstr''—config.yaml:299 + CONFIG_SCHEMA['browser'].artifact_dir——nobrowser—
browser.backendstr'none' (schema) → 'playwright' (lab)—config.yaml:299 + CONFIG_SCHEMA['browser'].backend——nobrowser—
browser.body_sample_max_bytesint4096—config.yaml:299 + CONFIG_SCHEMA['browser'].body_sample_max_bytes——nobrowser—
browser.capture_consoleboolFalse—config.yaml:299 + CONFIG_SCHEMA['browser'].capture_console——nobrowser—
browser.capture_networkboolTrue—config.yaml:299 + CONFIG_SCHEMA['browser'].capture_network——nobrowser—
browser.capture_screenshotsboolTrue—config.yaml:299 + CONFIG_SCHEMA['browser'].capture_screenshots——nobrowser—
browser.console_max_eventsint200—config.yaml:299 + CONFIG_SCHEMA['browser'].console_max_events——nobrowser—
browser.dom_summary_max_charsint8000—config.yaml:299 + CONFIG_SCHEMA['browser'].dom_summary_max_chars——nobrowser—
browser.enabledboolFalse (schema) → True (lab)—config.yaml:299 + CONFIG_SCHEMA['browser'].enabled——nobrowser—
browser.executable_pathstr''—config.yaml:299 + CONFIG_SCHEMA['browser'].executable_path——nobrowser—
browser.headlessboolTrue—config.yaml:299 + CONFIG_SCHEMA['browser'].headless——nobrowser—
browser.max_sessionsint2—config.yaml:299 + CONFIG_SCHEMA['browser'].max_sessions——nobrowser—
browser.navigation_timeout_secondsint30—config.yaml:299 + CONFIG_SCHEMA['browser'].navigation_timeout_seconds——nobrowser—
browser.network_max_eventsint500—config.yaml:299 + CONFIG_SCHEMA['browser'].network_max_events——nobrowser—
browser.persist_storageboolFalse—config.yaml:299 + CONFIG_SCHEMA['browser'].persist_storage——nobrowser—
browser.session_timeout_secondsint300—config.yaml:299 + CONFIG_SCHEMA['browser'].session_timeout_seconds——nobrowser—
browser.worker_imagestr''—config.yaml:299 + CONFIG_SCHEMA['browser'].worker_image——nobrowser—
caldera.api_key_envstr'CALDERA_API_KEY'—config.yaml:509 + CONFIG_SCHEMA['caldera'].api_key_envplugins/caldera/plugin.pyCaldera emulationCALDERA_API_KEYnoad
caldera.enabledboolFalse (schema) → True (lab)—config.yaml:509 + CONFIG_SCHEMA['caldera'].enabledplugins/caldera/plugin.pyCaldera emulation—noad
caldera.urlstr''—config.yaml:509 + CONFIG_SCHEMA['caldera'].urlplugins/caldera/plugin.pyCaldera emulation—noad
chatgpt.enabledboolFalse (schema) → True (lab)—config.yaml:561 + CONFIG_SCHEMA['chatgpt'].enabledproviders/chatgpt_provider.py, model_router.py, doctor.pyChatGPT proxy—yesproviderstests/test_chatgpt*.py
cve_lookup.api_key_envstr'NVD_API_KEY'—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].api_key_envmcp_shared, cve_lookup.pyNVD + KEV/EPSSNVD_API_KEYnoresearch/cvetests/test_cve_lookup.py
cve_lookup.cache_max_entriesint100—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].cache_max_entriesmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.cache_ttl_secondsint3600—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].cache_ttl_secondsmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.circuit_failure_thresholdint5—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].circuit_failure_thresholdmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.circuit_recovery_timeoutfloat60.0—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].circuit_recovery_timeoutmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.enabledboolTrue—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].enabledmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.epss_enabledboolTrue—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].epss_enabledmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.github.token_envstr'GITHUB_TOKEN'—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].github.token_envmcp_shared, cve_lookup.pyNVD + KEV/EPSSGITHUB_TOKENnoresearch/cvetests/test_cve_lookup.py
cve_lookup.kev_cache_pathstr''—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].kev_cache_pathmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.kev_cache_ttl_secondsint86400—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].kev_cache_ttl_secondsmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.kev_enabledboolTrue—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].kev_enabledmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.max_resultsint5—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].max_resultsmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.rate_limit_secondsfloat6.0—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].rate_limit_secondsmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.search_rate_limit_per_minuteint10—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].search_rate_limit_per_minutemcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
cve_lookup.timeout_secondsint30—config.yaml:112 + CONFIG_SCHEMA['cve_lookup'].timeout_secondsmcp_shared, cve_lookup.pyNVD + KEV/EPSS—noresearch/cvetests/test_cve_lookup.py
embeddings.providerstr'ollama' (schema) → 'none' (lab)—config.yaml:507 + CONFIG_SCHEMA['embeddings'].provider——yesembeddings—
engine_mcp.enabledboolTrue—config.yaml:53 + CONFIG_SCHEMA['engine_mcp'].enabledmcp_engine_server.pyAdvisory MCP enable—yesmcp/engine
engine_mcp.hoststr'127.0.0.1'—config.yaml:53 + CONFIG_SCHEMA['engine_mcp'].hostmcp_engine_server.pyLoopback bind—yesmcp/engine
engine_mcp.portint8002—config.yaml:53 + CONFIG_SCHEMA['engine_mcp'].portmcp_engine_server.pyHTTP port—yesmcp/engine
eval.baseline_pathstr'reports/eval/baseline.json'—config.yaml:268 + CONFIG_SCHEMA['eval'].baseline_path——noeval—
eval.enabledboolTrue—config.yaml:268 + CONFIG_SCHEMA['eval'].enabledeval_harness.pyEval harness—noevaltests/test_eval*.py
eval.max_roundsint30—config.yaml:268 + CONFIG_SCHEMA['eval'].max_roundseval_harness.pyEval harness—noevaltests/test_eval*.py
eval.output_dirstr'reports/eval'—config.yaml:268 + CONFIG_SCHEMA['eval'].output_direval_harness.pyEval harness—noevaltests/test_eval*.py
eval.regression_tolerancefloat0.05—config.yaml:268 + CONFIG_SCHEMA['eval'].regression_tolerance——noeval—
eval.write_htmlboolTrue—config.yaml:268 + CONFIG_SCHEMA['eval'].write_htmleval_harness.pyEval harness—noevaltests/test_eval*.py
eval.write_markdownboolTrue—config.yaml:268 + CONFIG_SCHEMA['eval'].write_markdowneval_harness.pyEval harness—noevaltests/test_eval*.py
exploit.ad_kerberos.adcs_enumboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.adcs_enumcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.ad_kerberos.asrep_roastboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.asrep_roastcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.ad_kerberos.bloodhoundboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.bloodhoundcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.ad_kerberos.enabledboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.enabledcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.ad_kerberos.golden_ticketboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.golden_ticketcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.ad_kerberos.pass_the_hashboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.pass_the_hashcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.ad_kerberos.responder_relayboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.responder_relaycli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.ad_kerberos.smb_signing_checkboolTrue—config.yaml:61 + CONFIG_SCHEMA['exploit'].ad_kerberos.smb_signing_checkcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.allowed_targetslist[str][] (schema) → ['127.0.0.1'] (lab)—config.yaml:61 + CONFIG_SCHEMA['exploit'].allowed_targetscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lockEXPLOIT_TARGET* + EXPLOIT_DISCOVERED_TARGETSnoexploit/agenttests/test_scope_gate.py
exploit.attack_max_commandsint150—config.yaml:61 + CONFIG_SCHEMA['exploit'].attack_max_commandscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.attack_max_duration_minutesint360—config.yaml:61 + CONFIG_SCHEMA['exploit'].attack_max_duration_minutescli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.attack_max_roundsint50—config.yaml:61 + CONFIG_SCHEMA['exploit'].attack_max_roundscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.attack_modeboolTrue—config.yaml:61 + CONFIG_SCHEMA['exploit'].attack_modecli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.attacker_osstr'auto'auto | linux | windowsconfig.yaml:61 + CONFIG_SCHEMA['exploit'].attacker_oscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.auto_post_exploitboolTrue—config.yaml:61 + CONFIG_SCHEMA['exploit'].auto_post_exploitcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.cache_max_entriesint50—config.yaml:61 + CONFIG_SCHEMA['exploit'].cache_max_entriescli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.cache_ttl_secondsint3600—config.yaml:61 + CONFIG_SCHEMA['exploit'].cache_ttl_secondscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.command_timeout_secondsint300—config.yaml:61 + CONFIG_SCHEMA['exploit'].command_timeout_secondscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.context_summarize_everyint10 (schema) → 50 (lab)—config.yaml:61 + CONFIG_SCHEMA['exploit'].context_summarize_everycli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.disallowed_assetslist[]—config.yaml:61 + CONFIG_SCHEMA['exploit'].disallowed_assetscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.enabledboolTrue—config.yaml:61 + CONFIG_SCHEMA['exploit'].enabledcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.forbidden_actionslist[]—config.yaml:61 + CONFIG_SCHEMA['exploit'].forbidden_actionscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.listeners.dnsboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].listeners.dnscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.listeners.https_beaconboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].listeners.https_beaconcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.listeners.socks_pivotboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].listeners.socks_pivotcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.listeners.tlsboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].listeners.tlscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.loot_workspacestr'exploit_workspace/loot'—config.yaml:61 + CONFIG_SCHEMA['exploit'].loot_workspacecli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.max_commands_per_sessionint9999—config.yaml:61 + CONFIG_SCHEMA['exploit'].max_commands_per_sessioncli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.max_pivot_depthint2—config.yaml:61 + CONFIG_SCHEMA['exploit'].max_pivot_depthcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.max_query_charsint200—config.yaml:61 + CONFIG_SCHEMA['exploit'].max_query_charscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.max_roundsint200—config.yaml:61 + CONFIG_SCHEMA['exploit'].max_roundscli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.modestr'standalone'—config.yaml:61 + CONFIG_SCHEMA['exploit'].modecli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.msf.auto_local_exploit_suggesterboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].msf.auto_local_exploit_suggestercli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.msf.recipes_enabledboolFalse—config.yaml:61 + CONFIG_SCHEMA['exploit'].msf.recipes_enabledcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.msfconsole_pathstr'msfconsole'—config.yaml:61 + CONFIG_SCHEMA['exploit'].msfconsole_pathcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.permissionstr'full_access'full_access | approve_only | read_onlyconfig.yaml:61 + CONFIG_SCHEMA['exploit'].permissioncli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.require_explicit_allowlistboolTrue—config.yaml:61 + CONFIG_SCHEMA['exploit'].require_explicit_allowlistcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.searchsploit_pathstr'searchsploit'—config.yaml:61 + CONFIG_SCHEMA['exploit'].searchsploit_pathcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.shellstr'bash'bashconfig.yaml:61 + CONFIG_SCHEMA['exploit'].shellcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.terminalstr'visible'visible | hiddenconfig.yaml:61 + CONFIG_SCHEMA['exploit'].terminalcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.web_searchboolTrue—config.yaml:61 + CONFIG_SCHEMA['exploit'].web_searchcli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lock—noexploit/agenttests/test_scope_gate.py
exploit.workspace_dirstr'exploit_workspace'—config.yaml:61 + CONFIG_SCHEMA['exploit'].workspace_dircli_exploit_settings.py, mcp_tools/terminal, mcp_sharedAttack posture/budgets/allowlist lockEXPLOIT_WORKSPACEnoexploit/agenttests/test_scope_gate.py
fsm.enabledboolFalse—config.yaml:208 + CONFIG_SCHEMA['fsm'].enabled——nofsm—
fsm.max_retries_per_stepint3—config.yaml:208 + CONFIG_SCHEMA['fsm'].max_retries_per_step——nofsm—
hitl.enabledboolTrue—config.yaml:361 + CONFIG_SCHEMA['hitl'].enabled——nohitl—
ics.allow_writeboolFalse—config.yaml:450 + CONFIG_SCHEMA['ics'].allow_writeattack_modules/modules/ics_iot.pyICS write gates—noicstests/test_ics*.py
ics.destructive_icsboolFalse—config.yaml:450 + CONFIG_SCHEMA['ics'].destructive_icsattack_modules/modules/ics_iot.pyICS write gates—noicstests/test_ics*.py
killchain.enabledboolFalse—config.yaml:294 + CONFIG_SCHEMA['killchain'].enabled——nokillchain—
killchain.goal_statestr'shell_as_root'—config.yaml:294 + CONFIG_SCHEMA['killchain'].goal_state——nokillchain—
killchain.graph_dbstr''—config.yaml:294 + CONFIG_SCHEMA['killchain'].graph_db——nokillchain—
killchain.require_verificationboolTrue—config.yaml:294 + CONFIG_SCHEMA['killchain'].require_verification——nokillchain—
long_session.attack_max_commandsint1000—config.yaml:318 + CONFIG_SCHEMA['long_session'].attack_max_commandscli_exploit_settings.py, run_service/service.pyMulti-hour budgets—nolong_sessiontests/test_long*.py
long_session.attack_max_duration_minutesint720—config.yaml:318 + CONFIG_SCHEMA['long_session'].attack_max_duration_minutescli_exploit_settings.py, run_service/service.pyMulti-hour budgets—nolong_sessiontests/test_long*.py
long_session.attack_max_roundsint200—config.yaml:318 + CONFIG_SCHEMA['long_session'].attack_max_roundscli_exploit_settings.py, run_service/service.pyMulti-hour budgets—nolong_sessiontests/test_long*.py
long_session.enabledboolFalse (schema) → True (lab)—config.yaml:318 + CONFIG_SCHEMA['long_session'].enabledcli_exploit_settings.py, run_service/service.pyMulti-hour budgets—nolong_sessiontests/test_long*.py
long_session.persist_messagesboolTrue—config.yaml:318 + CONFIG_SCHEMA['long_session'].persist_messagescli_exploit_settings.py, run_service/service.pyMulti-hour budgets—nolong_sessiontests/test_long*.py
long_session.request_timeout_secondsint600—config.yaml:318 + CONFIG_SCHEMA['long_session'].request_timeout_secondscli_exploit_settings.py, run_service/service.pyMulti-hour budgets—nolong_sessiontests/test_long*.py
long_session.swarm_session_timeout_minutesint30—config.yaml:318 + CONFIG_SCHEMA['long_session'].swarm_session_timeout_minutescli_exploit_settings.py, run_service/service.pyMulti-hour budgets—nolong_sessiontests/test_long*.py
mcp.default_transportstr'stdio'stdio | httpconfig.yaml:51 + CONFIG_SCHEMA['mcp'].default_transportconfig_manager, mcp_session.pystdio|http—yesmcptests/test_config_manager.py
memory.attack_memory_enabledboolTrue—config.yaml:335 + CONFIG_SCHEMA['memory'].attack_memory_enabledtools/exploit_agent/runner/_impl.py, semantic_memory.pyCross-mission memory—nomemorytests/test_memory.py
memory.attack_memory_max_context_charsint6000—config.yaml:335 + CONFIG_SCHEMA['memory'].attack_memory_max_context_charstools/exploit_agent/runner/_impl.py, semantic_memory.pyCross-mission memory—nomemorytests/test_memory.py
memory.cross_mission_learningboolTrue—config.yaml:335 + CONFIG_SCHEMA['memory'].cross_mission_learningtools/exploit_agent/runner/_impl.py, semantic_memory.pyCross-mission memory—nomemorytests/test_memory.py
memory.embedding_modelstr'nomic-embed-text'—config.yaml:335 + CONFIG_SCHEMA['memory'].embedding_modeltools/exploit_agent/runner/_impl.py, semantic_memory.pyCross-mission memory—nomemorytests/test_memory.py
memory.experience_min_samplesint3—config.yaml:335 + CONFIG_SCHEMA['memory'].experience_min_samplestools/exploit_agent/runner/_impl.py, semantic_memory.pyCross-mission memory—nomemorytests/test_memory.py
memory.experience_time_decay_daysint90—config.yaml:335 + CONFIG_SCHEMA['memory'].experience_time_decay_daystools/exploit_agent/runner/_impl.py, semantic_memory.pyCross-mission memory—nomemorytests/test_memory.py
memory.semantic_enabledboolTrue—config.yaml:335 + CONFIG_SCHEMA['memory'].semantic_enabledtools/exploit_agent/runner/_impl.py, semantic_memory.pyCross-mission memory—nomemorytests/test_memory.py
mitre.enabledboolTrue—config.yaml:482 + CONFIG_SCHEMA['mitre'].enabledmitre_export.pyATT&CK export—nomitre
mitre.include_skill_tagsboolTrue—config.yaml:482 + CONFIG_SCHEMA['mitre'].include_skill_tagsmitre_export.pyATT&CK export—nomitre
mitre.navigator_output_dirstr'reports/mitre'—config.yaml:482 + CONFIG_SCHEMA['mitre'].navigator_output_dirmitre_export.pyATT&CK export—nomitre
mitre.technique_mapstr'tools/mitre_technique_map.json'—config.yaml:482 + CONFIG_SCHEMA['mitre'].technique_mapmitre_export.pyATT&CK export—nomitre
models.auto_updateboolTrue—config.yaml:6 + CONFIG_SCHEMA['models'].auto_update——yesmodels—
models.default_aliasstr'glm'—config.yaml:6 + CONFIG_SCHEMA['models'].default_aliasconfig_manager, run_service/service.pyActive alias—yesmodelstests/test_config_manager.py
models.info.deepseek.context_windowint1000000—config.yaml:6 + CONFIG_SCHEMA['models'].info.deepseek.context_windowmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.deepseek.descriptionstr'DeepSeek V4 Pro — 1M token context, deep code reasoning.'—config.yaml:6 + CONFIG_SCHEMA['models'].info.deepseek.descriptionmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.deepseek.labelstr'DeepSeek V4 Pro'—config.yaml:6 + CONFIG_SCHEMA['models'].info.deepseek.labelmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.deepseek_flash.context_windowint1000000—config.yaml:6 + CONFIG_SCHEMA['models'].info.deepseek_flash.context_windowmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.deepseek_flash.descriptionstr'DeepSeek V4 Flash - 1M token context, fast DeepSeek option for lower-latency work.'—config.yaml:6 + CONFIG_SCHEMA['models'].info.deepseek_flash.descriptionmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.deepseek_flash.labelstr'DeepSeek V4 Flash'—config.yaml:6 + CONFIG_SCHEMA['models'].info.deepseek_flash.labelmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.glm.context_windowint976000—config.yaml:6 + CONFIG_SCHEMA['models'].info.glm.context_windowmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.glm.descriptionstr'Zhipu GLM-5.2 — 976K context, the smartest/newest GLM for deep reasoning + coding.'—config.yaml:6 + CONFIG_SCHEMA['models'].info.glm.descriptionmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.glm.labelstr'GLM-5.2'—config.yaml:6 + CONFIG_SCHEMA['models'].info.glm.labelmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.glm3.context_windowint128000—config.yaml:6 + CONFIG_SCHEMA['models'].info.glm3.context_window——yesmemory/context—
models.info.glm3.descriptionstr'Zhipu GLM-5.3 Flash — fast low-latency GLM option (128K context).'—config.yaml:6 + CONFIG_SCHEMA['models'].info.glm3.description——yesmemory/context—
models.info.glm3.labelstr'GLM-5.3 Flash'—config.yaml:6 + CONFIG_SCHEMA['models'].info.glm3.label——yesmemory/context—
models.info.kimi.context_windowint256000—config.yaml:6 + CONFIG_SCHEMA['models'].info.kimi.context_windowmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.kimi.descriptionstr'Moonshot Kimi K2.6 — strong long-form reasoning, 256K context.'—config.yaml:6 + CONFIG_SCHEMA['models'].info.kimi.descriptionmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.kimi.labelstr'Kimi K2.6'—config.yaml:6 + CONFIG_SCHEMA['models'].info.kimi.labelmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.minimax.context_windowint512000—config.yaml:6 + CONFIG_SCHEMA['models'].info.minimax.context_windowmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.minimax.descriptionstr'Minimax M3 (cloud) — 512K context, balanced coding + reasoning.'—config.yaml:6 + CONFIG_SCHEMA['models'].info.minimax.descriptionmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.info.minimax.labelstr'Minimax M3'—config.yaml:6 + CONFIG_SCHEMA['models'].info.minimax.labelmodel_router, exploit_agent/contextContext windows—yesmemory/contexttests/test_config_manager.py
models.providerstr'ollama' (schema) → 'opencode_go' (lab)ollama | chatgptconfig.yaml:6 + CONFIG_SCHEMA['models'].providerconfig_manager.get_ai_provider, model_router, doctor.pyActive chat provider—yesproviderstests/test_config_manager.py
models.registry.deepseekstr'deepseek-v4-pro:cloud'—config.yaml:6 + CONFIG_SCHEMA['models'].registry.deepseekconfig_manager, doctor.py, run_serviceAlias→model_id map—yesmodelstests/test_config_manager.py
models.registry.deepseek_flashstr'deepseek-v4-flash:cloud'—config.yaml:6 + CONFIG_SCHEMA['models'].registry.deepseek_flashconfig_manager, doctor.py, run_serviceAlias→model_id map—yesmodelstests/test_config_manager.py
models.registry.glmstr'glm-5.2:cloud'—config.yaml:6 + CONFIG_SCHEMA['models'].registry.glmconfig_manager, doctor.py, run_serviceAlias→model_id map—yesmodelstests/test_config_manager.py
models.registry.glm3str'glm-5.3-flash'—config.yaml:6 + CONFIG_SCHEMA['models'].registry.glm3——yesmodels—
models.registry.kimistr'kimi-k2.6:cloud'—config.yaml:6 + CONFIG_SCHEMA['models'].registry.kimiconfig_manager, doctor.py, run_serviceAlias→model_id map—yesmodelstests/test_config_manager.py
models.registry.minimaxstr'minimax-m3:cloud'—config.yaml:6 + CONFIG_SCHEMA['models'].registry.minimaxconfig_manager, doctor.py, run_serviceAlias→model_id map—yesmodelstests/test_config_manager.py
models.roles.code_generatorstr''—config.yaml:6 + CONFIG_SCHEMA['models'].roles.code_generatormodel_router.get_client_for_rolePer-role model alias—yesreasoningtests/test_config_manager.py
models.roles.criticstr''—config.yaml:6 + CONFIG_SCHEMA['models'].roles.criticmodel_router.get_client_for_rolePer-role model alias—yesreasoningtests/test_config_manager.py
models.roles.executorstr''—config.yaml:6 + CONFIG_SCHEMA['models'].roles.executormodel_router.get_client_for_rolePer-role model alias—yesreasoningtests/test_config_manager.py
models.roles.interpreterstr''—config.yaml:6 + CONFIG_SCHEMA['models'].roles.interpretermodel_router.get_client_for_rolePer-role model alias—yesreasoningtests/test_config_manager.py
models.roles.plannerstr''—config.yaml:6 + CONFIG_SCHEMA['models'].roles.plannermodel_router.get_client_for_rolePer-role model alias—yesreasoningtests/test_config_manager.py
models.roles.summarizerstr''—config.yaml:6 + CONFIG_SCHEMA['models'].roles.summarizermodel_router.get_client_for_rolePer-role model alias—yesreasoningtests/test_config_manager.py
multi_model.consult_aliaseslist[str]['kimi', 'deepseek', 'deepseek_flash', 'glm', 'minimax']—config.yaml:389 + CONFIG_SCHEMA['multi_model'].consult_aliasesmcp_tools/peer_models.py, exploit_agent/reflection.pyPeer consultation—nomulti-modeltests/test_peer*.py
multi_model.enabledboolFalse (schema) → True (lab)—config.yaml:389 + CONFIG_SCHEMA['multi_model'].enabledmcp_tools/peer_models.py, exploit_agent/reflection.pyPeer consultation—nomulti-modeltests/test_peer*.py
multi_model.max_answer_charsint8000—config.yaml:389 + CONFIG_SCHEMA['multi_model'].max_answer_charsmcp_tools/peer_models.py, exploit_agent/reflection.pyPeer consultation—nomulti-modeltests/test_peer*.py
multi_model.max_consultationsint10—config.yaml:389 + CONFIG_SCHEMA['multi_model'].max_consultationsmcp_tools/peer_models.py, exploit_agent/reflection.pyPeer consultation—nomulti-modeltests/test_peer*.py
multi_model.max_question_charsint4000—config.yaml:389 + CONFIG_SCHEMA['multi_model'].max_question_charsmcp_tools/peer_models.py, exploit_agent/reflection.pyPeer consultation—nomulti-modeltests/test_peer*.py
nmap.pathstr'nmap'—config.yaml:57 + CONFIG_SCHEMA['nmap'].pathrecon_pipeline, mcp_server, doctorBinary override—norecontests/test_recon.py
nmap.priv_fallbackboolTrue—config.yaml:57 + CONFIG_SCHEMA['nmap'].priv_fallbackrecon_pipelineauto-downgrade—norecontests/test_recon.py
nmap.sudoboolFalse—config.yaml:57 + CONFIG_SCHEMA['nmap'].sudorecon_pipeline, nmap_privsudo -n—norecontests/test_recon.py
ollama.api_key_envstr'OLLAMA_API_KEY'—config.yaml:1 + CONFIG_SCHEMA['ollama'].api_key_envapi_key_store.py, model_router.pyEnv var name holding bearer tokenOLLAMA_API_KEY (named by this key)yessecretstests/test_config_cli.py
ollama.embed_hoststr'http://localhost:11434'—config.yaml:1 + CONFIG_SCHEMA['ollama'].embed_hostconfig_manager.py, tools/exploit_agent/runner/_impl.pyEmbedding host fallback—yesmemory/embeddingstests/test_config_manager.py
ollama.hoststr'https://api.ollama.com'—config.yaml:1 + CONFIG_SCHEMA['ollama'].hostmodel_router.py, doctor.pyOllama endpoint for chat/generate—yesmodels/providertests/test_config_manager.py
ollama.modelstr'glm-5.2:cloud'—config.yaml:1 + CONFIG_SCHEMA['ollama'].modelconfig_manager.py, interactive_menu.pyDefault concrete model id—yesmodelstests/test_config_manager.py
opencode_go.enabledboolFalse (schema) → True (lab)—config.yaml:563 + CONFIG_SCHEMA['opencode_go'].enabled——yesproviders—
operator_connection.auto_start_listenerboolTrue—config.yaml:523 + CONFIG_SCHEMA['operator_connection'].auto_start_listener——nooperator—
operator_connection.beacon_interval_secondsint300—config.yaml:523 + CONFIG_SCHEMA['operator_connection'].beacon_interval_seconds——nooperator—
operator_connection.default_callback_portint4444—config.yaml:523 + CONFIG_SCHEMA['operator_connection'].default_callback_port——nooperator—
operator_connection.default_listener_typestr'netcat'—config.yaml:523 + CONFIG_SCHEMA['operator_connection'].default_listener_type——nooperator—
operator_connection.enabledboolTrue—config.yaml:523 + CONFIG_SCHEMA['operator_connection'].enabled——nooperator—
operator_connection.health_check_interval_secondsint60—config.yaml:523 + CONFIG_SCHEMA['operator_connection'].health_check_interval_seconds——nooperator—
operator_connection.workspace_dirstr'exploit_workspace'—config.yaml:523 + CONFIG_SCHEMA['operator_connection'].workspace_dir——nooperator—
opsec.dohboolFalse—config.yaml:255 + CONFIG_SCHEMA['opsec'].dohopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.doh_providerstr'cloudflare'cloudflare | googleconfig.yaml:255 + CONFIG_SCHEMA['opsec'].doh_provideropsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.enabledboolFalse—config.yaml:255 + CONFIG_SCHEMA['opsec'].enabledopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.jitter_secondsfloat0.0—config.yaml:255 + CONFIG_SCHEMA['opsec'].jitter_secondsopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.local_cidrslist[]—config.yaml:255 + CONFIG_SCHEMA['opsec'].local_cidrsopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.local_targets_offboolTrue—config.yaml:255 + CONFIG_SCHEMA['opsec'].local_targets_offopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.min_gap_secondsfloat0.0—config.yaml:255 + CONFIG_SCHEMA['opsec'].min_gap_secondsopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.noise_budgetint0—config.yaml:255 + CONFIG_SCHEMA['opsec'].noise_budgetopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.public_autonomyboolTrue—config.yaml:255 + CONFIG_SCHEMA['opsec'].public_autonomyopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.quiet_command_patternslist[]—config.yaml:255 + CONFIG_SCHEMA['opsec'].quiet_command_patternsopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.rate_per_minuteint0—config.yaml:255 + CONFIG_SCHEMA['opsec'].rate_per_minuteopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
opsec.ua_rotationboolFalse—config.yaml:255 + CONFIG_SCHEMA['opsec'].ua_rotationopsec.py, validation_utils.is_private_or_local_targetOPSEC hardening—noopsectests/test_opsec.py
orchestrator.semantic_memoryboolTrue—config.yaml:211 + CONFIG_SCHEMA['orchestrator'].semantic_memoryautonomous_orchestrator.pyCross-mission semantic memory—noautonomous
outcome_judgment.confirmation_thresholdfloat0.75—config.yaml:343 + CONFIG_SCHEMA['outcome_judgment'].confirmation_thresholdcli_exploit_settings.py, outcome_judge.pyEvidence verdicts—noevaltests/test_outcome*.py
outcome_judgment.flow_aboolFalse (schema) → True (lab)—config.yaml:343 + CONFIG_SCHEMA['outcome_judgment'].flow_acli_exploit_settings.py, outcome_judge.pyEvidence verdicts—noevaltests/test_outcome*.py
outcome_judgment.max_inconclusive_attemptsint3—config.yaml:343 + CONFIG_SCHEMA['outcome_judgment'].max_inconclusive_attemptscli_exploit_settings.py, outcome_judge.pyEvidence verdicts—noevaltests/test_outcome*.py
outcome_judgment.min_evidence_referencesint1—config.yaml:343 + CONFIG_SCHEMA['outcome_judgment'].min_evidence_referencescli_exploit_settings.py, outcome_judge.pyEvidence verdicts—noevaltests/test_outcome*.py
outcome_judgment.peer_reviewboolFalse (schema) → True (lab)—config.yaml:343 + CONFIG_SCHEMA['outcome_judgment'].peer_reviewcli_exploit_settings.py, outcome_judge.pyEvidence verdicts—noevaltests/test_outcome*.py
outcome_judgment.refutation_thresholdfloat0.75—config.yaml:343 + CONFIG_SCHEMA['outcome_judgment'].refutation_thresholdcli_exploit_settings.py, outcome_judge.pyEvidence verdicts—noevaltests/test_outcome*.py
plugins.disabledlist[]—config.yaml:453 + CONFIG_SCHEMA['plugins'].disabledplugins.pyPlugin discovery—nopluginstests/test_plugins*.py
plugins.enabledlist[str][] (schema) → ['shodan_recon', 'github_dorks', 'webhook_notify', 'sliver_c2', 'bloodhound_ce', 'zap_scan', 'browser_attack', 'mobile_attack', 'wireless', 'spiderfoot', 'atomic_red_team', 'caldera', 'firmware_analysis'] (lab)—config.yaml:453 + CONFIG_SCHEMA['plugins'].enabledplugins.pyPlugin discovery—nopluginstests/test_plugins*.py
plugins.entry_pointsboolTrue—config.yaml:453 + CONFIG_SCHEMA['plugins'].entry_pointsplugins.pyPlugin discovery—nopluginstests/test_plugins*.py
plugins.search_pathslist[str]['plugins']—config.yaml:453 + CONFIG_SCHEMA['plugins'].search_pathsplugins.pyPlugin discovery—nopluginstests/test_plugins*.py
poc_verification.compile_timeout_secondsint30—config.yaml:350 + CONFIG_SCHEMA['poc_verification'].compile_timeout_secondspoc_verifier.py, mcp_tools/attack_modules.pyPoC compile gate—nopoctests/test_poc*.py
poc_verification.docker_imagestr'python:3.11-slim'—config.yaml:350 + CONFIG_SCHEMA['poc_verification'].docker_imagepoc_verifier.py, mcp_tools/attack_modules.pyPoC compile gate—nopoctests/test_poc*.py
poc_verification.docker_memorystr'256m'—config.yaml:350 + CONFIG_SCHEMA['poc_verification'].docker_memorypoc_verifier.py, mcp_tools/attack_modules.pyPoC compile gate—nopoctests/test_poc*.py
poc_verification.docker_networkstr'none'—config.yaml:350 + CONFIG_SCHEMA['poc_verification'].docker_networkpoc_verifier.py, mcp_tools/attack_modules.pyPoC compile gate—nopoctests/test_poc*.py
poc_verification.docker_read_onlyboolTrue—config.yaml:350 + CONFIG_SCHEMA['poc_verification'].docker_read_onlypoc_verifier.py, mcp_tools/attack_modules.pyPoC compile gate—nopoctests/test_poc*.py
poc_verification.enabledboolFalse (schema) → True (lab)—config.yaml:350 + CONFIG_SCHEMA['poc_verification'].enabledpoc_verifier.py, mcp_tools/attack_modules.pyPoC compile gate—nopoctests/test_poc*.py
poc_verification.max_retriesint3—config.yaml:350 + CONFIG_SCHEMA['poc_verification'].max_retriespoc_verifier.py, mcp_tools/attack_modules.pyPoC compile gate—nopoctests/test_poc*.py
providers.chatgpt.enabledboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.api_key_envstr'OPENCODE_GO_API_KEY' (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.base_urlstr'https://opencode.ai/zen/go/v1' (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.context_windowint128000 (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.default_modelstr'muse-spark-1.2-contributor' (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.discover_cache_secondsint300 (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.enabledboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.modelslist[] (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
providers.opencode_go.request_timeout_secondsint300 (lab-only, not in CONFIG_SCHEMA)—config.yaml:495 (lab extra)——yesproviders—
reasoning.chain_of_thoughtboolTrue—config.yaml:326 + CONFIG_SCHEMA['reasoning'].chain_of_thoughtcli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
reasoning.critic_enabledboolTrue—config.yaml:326 + CONFIG_SCHEMA['reasoning'].critic_enabledcli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
reasoning.llm_reflectionboolFalse (schema) → True (lab)—config.yaml:326 + CONFIG_SCHEMA['reasoning'].llm_reflectioncli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
reasoning.observer_modestr'hybrid'heuristic | llm | hybridconfig.yaml:326 + CONFIG_SCHEMA['reasoning'].observer_modecli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
reasoning.peer_consult_on_failure_thresholdint3—config.yaml:326 + CONFIG_SCHEMA['reasoning'].peer_consult_on_failure_thresholdcli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
reasoning.reflection_every_n_actionsint10—config.yaml:326 + CONFIG_SCHEMA['reasoning'].reflection_every_n_actionscli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
reasoning.ultrathinkboolFalse (schema) → True (lab)—config.yaml:326 + CONFIG_SCHEMA['reasoning'].ultrathinkcli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
reasoning.ultrathink_reflection_intervalint3—config.yaml:326 + CONFIG_SCHEMA['reasoning'].ultrathink_reflection_intervalcli_exploit_settings.py, tools/exploit_agent/runner/_impl.pyCoT / reflection—noreasoningtests/test_reasoning.py
recon.asn_whoisboolFalse—config.yaml:213 + CONFIG_SCHEMA['recon'].asn_whoisrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.cloud_metadata_probeboolFalse—config.yaml:213 + CONFIG_SCHEMA['recon'].cloud_metadata_proberecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.dns_zone_transferboolFalse—config.yaml:213 + CONFIG_SCHEMA['recon'].dns_zone_transferrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.domain_resolution.dns_zone_transferboolFalse (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.domain_resolution.enabledboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.domain_resolution.max_subdomainsint500 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.domain_resolution.subdomain_sourceslist[str]['crt_sh', 'dns_bruteforce', 'subfinder', 'amass'] (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.domain_resolution.whois_enabledboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.extended_enumeratorsboolTrue—config.yaml:213 + CONFIG_SCHEMA['recon'].extended_enumeratorsrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.cache_ttl_secondsint300 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.cve_concurrencyint8 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.cve_lookupboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.enabledboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.max_concurrencyint8 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.overall_timeout_secondsint180 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.passive_osintboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.per_task_timeout_secondsint60 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.service_concurrencyint6 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.service_enumerationboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.tcp_discoveryboolTrue (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.fast.udp_top_portsint50 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.max_retriesint2 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.preflight_portslist[int][80, 443] (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.preflight_probeboolFalse (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.preflight_timeout_msint1000 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.retry_delayfloat5.0 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.shodan_api_keystr''—config.yaml:213 + CONFIG_SCHEMA['recon'].shodan_api_keyrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depthSHODAN_API_KEY (file wins)norecontests/test_recon*.py
recon.snmp_enumboolFalse—config.yaml:213 + CONFIG_SCHEMA['recon'].snmp_enumrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.subdomain_enumboolFalse—config.yaml:213 + CONFIG_SCHEMA['recon'].subdomain_enumrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.timeout_secondsint300 (lab-only, not in CONFIG_SCHEMA)—config.yaml:213 (lab extra)recon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.udp_top_portsint100—config.yaml:213 + CONFIG_SCHEMA['recon'].udp_top_portsrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.vhost_discoveryboolFalse—config.yaml:213 + CONFIG_SCHEMA['recon'].vhost_discoveryrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
recon.waf_fingerprintboolFalse—config.yaml:213 + CONFIG_SCHEMA['recon'].waf_fingerprintrecon_pipeline.py, tools/mcp_tools/domain.pyRecon coverage & depth—norecontests/test_recon*.py
replay_simulator.counterfactualboolFalse—config.yaml:358 + CONFIG_SCHEMA['replay_simulator'].counterfactual——no——
replay_simulator.enabledboolFalse (schema) → True (lab)—config.yaml:358 + CONFIG_SCHEMA['replay_simulator'].enabled———no——
research.allow_local_fetchboolFalse—config.yaml:141 + CONFIG_SCHEMA['research'].allow_local_fetchmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.automaticboolTrue—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.automaticmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.enabledboolTrue—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.enabledmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.failure_triggerint2—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.failure_triggermcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.max_advisory_charsint4000—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.max_advisory_charsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.max_auto_consultationsint4—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.max_auto_consultationsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.max_model_roundsint3—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.max_model_roundsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.max_tool_calls_per_consultationint5—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.max_tool_calls_per_consultationmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.model_aliasstr''—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.model_aliasmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.save_advisoriesboolTrue—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.save_advisoriesmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.assistant.timeout_secondsint90—config.yaml:141 + CONFIG_SCHEMA['research'].assistant.timeout_secondsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.cache_max_entriesint250—config.yaml:141 + CONFIG_SCHEMA['research'].cache_max_entriesmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.cache_ttl_secondsint1800—config.yaml:141 + CONFIG_SCHEMA['research'].cache_ttl_secondsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.enabledboolTrue—config.yaml:141 + CONFIG_SCHEMA['research'].enabledmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.fallback_providerstr'serpapi'ollama | serpapi | stdlib | ""config.yaml:141 + CONFIG_SCHEMA['research'].fallback_providermcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.max_content_charsint12000—config.yaml:141 + CONFIG_SCHEMA['research'].max_content_charsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.max_fetch_depthint5—config.yaml:141 + CONFIG_SCHEMA['research'].max_fetch_depthmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.max_resultsint8—config.yaml:141 + CONFIG_SCHEMA['research'].max_resultsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.min_source_qualitystr'medium'low | medium | highconfig.yaml:141 + CONFIG_SCHEMA['research'].min_source_qualitymcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.ollama.api_key_envstr'OLLAMA_API_KEY'—config.yaml:141 + CONFIG_SCHEMA['research'].ollama.api_key_envmcp_shared, web_researcher.py, api_key_store.pyWeb research + cacheOLLAMA_API_KEYnoresearchtests/test_research.py
research.ollama.max_resultsint8—config.yaml:141 + CONFIG_SCHEMA['research'].ollama.max_resultsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.ollama.use_web_fetchboolTrue—config.yaml:141 + CONFIG_SCHEMA['research'].ollama.use_web_fetchmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.ollama.use_web_searchboolTrue—config.yaml:141 + CONFIG_SCHEMA['research'].ollama.use_web_searchmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.providerstr'ollama'ollama | serpapi | stdlibconfig.yaml:141 + CONFIG_SCHEMA['research'].providermcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.require_api_key_for_mcp_toolsboolTrue—config.yaml:141 + CONFIG_SCHEMA['research'].require_api_key_for_mcp_toolsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.serpapi.api_key_envstr'SERPAPI_API_KEY'—config.yaml:141 + CONFIG_SCHEMA['research'].serpapi.api_key_envmcp_shared, web_researcher.py, api_key_store.pyWeb research + cacheSERPAPI_API_KEYnoresearchtests/test_research.py
research.serpapi.endpointstr'https://serpapi.com/search.json'—config.yaml:141 + CONFIG_SCHEMA['research'].serpapi.endpointmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.serpapi.enginestr'duckduckgo'—config.yaml:141 + CONFIG_SCHEMA['research'].serpapi.enginemcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.serpapi.regionstr'us-en'—config.yaml:141 + CONFIG_SCHEMA['research'].serpapi.regionmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
research.timeout_secondsint15—config.yaml:141 + CONFIG_SCHEMA['research'].timeout_secondsmcp_shared, web_researcher.py, api_key_store.pyWeb research + cache—noresearchtests/test_research.py
sandbox.auto_manage_dockerboolFalse (schema) → True (lab)—config.yaml:531 + CONFIG_SCHEMA['sandbox'].auto_manage_docker——nosandbox—
sandbox.backendstr'docker'—config.yaml:531 + CONFIG_SCHEMA['sandbox'].backend——nosandbox—
sandbox.cleanup.remove_on_exitboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].cleanup.remove_on_exit——nosandbox—
sandbox.cleanup.remove_stale_on_startupboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].cleanup.remove_stale_on_startup——nosandbox—
sandbox.docker_start_timeout_secondsint60—config.yaml:531 + CONFIG_SCHEMA['sandbox'].docker_start_timeout_seconds——nosandbox—
sandbox.docker_stop_timeout_secondsint30—config.yaml:531 + CONFIG_SCHEMA['sandbox'].docker_stop_timeout_seconds——nosandbox—
sandbox.enabledboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].enabled——nosandbox—
sandbox.env_passthroughlist[]—config.yaml:531 + CONFIG_SCHEMA['sandbox'].env_passthrough——nosandbox—
sandbox.fallback_nativeboolFalse—config.yaml:531 + CONFIG_SCHEMA['sandbox'].fallback_native——nosandbox—
sandbox.imagestr'breachpilot-sandbox:latest'—config.yaml:531 + CONFIG_SCHEMA['sandbox'].image——nosandbox—
sandbox.multi_net_rawboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].multi_net_raw——nosandbox—
sandbox.network.allow_dnsstr'controlled'—config.yaml:531 + CONFIG_SCHEMA['sandbox'].network.allow_dns——nosandbox—
sandbox.network.allow_gatewayboolFalse—config.yaml:531 + CONFIG_SCHEMA['sandbox'].network.allow_gateway——nosandbox—
sandbox.network.allow_research_hostsboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].network.allow_research_hosts——nosandbox—
sandbox.network.enforceboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].network.enforce——nosandbox—
sandbox.network.extra_allow_cidrslist[]—config.yaml:531 + CONFIG_SCHEMA['sandbox'].network.extra_allow_cidrs——nosandbox—
sandbox.network.fail_closedboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].network.fail_closed——nosandbox—
sandbox.network.map_host_loopbackboolFalse—config.yaml:531 + CONFIG_SCHEMA['sandbox'].network.map_host_loopback——nosandbox—
sandbox.read_only_rootfsboolTrue—config.yaml:531 + CONFIG_SCHEMA['sandbox'].read_only_rootfs——nosandbox—
sandbox.resources.cpusint2—config.yaml:531 + CONFIG_SCHEMA['sandbox'].resources.cpus——nosandbox—
sandbox.resources.memory_mbint4096—config.yaml:531 + CONFIG_SCHEMA['sandbox'].resources.memory_mb——nosandbox—
sandbox.resources.output_max_bytesint2000000—config.yaml:531 + CONFIG_SCHEMA['sandbox'].resources.output_max_bytes——nosandbox—
sandbox.resources.pidsint512—config.yaml:531 + CONFIG_SCHEMA['sandbox'].resources.pids——nosandbox—
sandbox.resources.timeout_secondsint300—config.yaml:531 + CONFIG_SCHEMA['sandbox'].resources.timeout_seconds——nosandbox—
sandbox.resources.tmpfs_size_mbint256—config.yaml:531 + CONFIG_SCHEMA['sandbox'].resources.tmpfs_size_mb——nosandbox—
sandbox.userstr'sandbox'—config.yaml:531 + CONFIG_SCHEMA['sandbox'].user——nosandbox—
skills.allow_model_lookupboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].allow_model_lookupskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.allow_reference_listingboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].allow_reference_listingskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.context_skill_weightint24—config.yaml:400 + CONFIG_SCHEMA['skills'].context_skill_weightskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.default_enabledlist[str]['scanning-network-with-nmap-advanced', 'conducting-network-penetration-test', 'executing-red-team-engagement-planning', 'auditing-mcp-servers-for-tool-poisoning', 'securing-agentic-ai-tool-invocation'] (schema) → ['scanning-network-with-nmap-advanced', 'conducting-network-penetration-test', 'executing-red-team-engagement-planning', 'auditing-mcp-servers-for-tool-poisoning', 'securing-agentic-ai-tool-invocation', 'attacking-domains-end-to-end'] (lab)—config.yaml:400 + CONFIG_SCHEMA['skills'].default_enabledskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.default_skill_weightint12—config.yaml:400 + CONFIG_SCHEMA['skills'].default_skill_weightskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.diversity_penaltyint12—config.yaml:400 + CONFIG_SCHEMA['skills'].diversity_penaltyskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.enabledboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].enabledskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.exclude_nameslist[]—config.yaml:400 + CONFIG_SCHEMA['skills'].exclude_namesskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.feedback_enabledboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].feedback_enabledskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.feedback_min_observationsint3—config.yaml:400 + CONFIG_SCHEMA['skills'].feedback_min_observationsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.feedback_skill_weightint8—config.yaml:400 + CONFIG_SCHEMA['skills'].feedback_skill_weightskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.include_metadataboolFalse—config.yaml:400 + CONFIG_SCHEMA['skills'].include_metadataskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.include_tagslist[]—config.yaml:400 + CONFIG_SCHEMA['skills'].include_tagsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.inject_startup_contextboolFalse—config.yaml:400 + CONFIG_SCHEMA['skills'].inject_startup_contextskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.max_active_skillsint6—config.yaml:400 + CONFIG_SCHEMA['skills'].max_active_skillsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.max_chars_per_skillint2500—config.yaml:400 + CONFIG_SCHEMA['skills'].max_chars_per_skillskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.max_total_charsint9000—config.yaml:400 + CONFIG_SCHEMA['skills'].max_total_charsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.maybe_enabledboolFalse—config.yaml:400 + CONFIG_SCHEMA['skills'].maybe_enabledskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.min_contextual_skillsint3—config.yaml:400 + CONFIG_SCHEMA['skills'].min_contextual_skillsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.reselect_max_per_runint3—config.yaml:400 + CONFIG_SCHEMA['skills'].reselect_max_per_runskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.reselect_mid_runboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].reselect_mid_runskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.reselect_min_interval_actionsint5—config.yaml:400 + CONFIG_SCHEMA['skills'].reselect_min_interval_actionsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.reselect_sticky_defaultsboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].reselect_sticky_defaultsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.rootslist[str]['skills']—config.yaml:400 + CONFIG_SCHEMA['skills'].rootsskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.semantic_matchingboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].semantic_matchingskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.semantic_min_similarityfloat0.35—config.yaml:400 + CONFIG_SCHEMA['skills'].semantic_min_similarityskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.semantic_modelstr'nomic-embed-text'—config.yaml:400 + CONFIG_SCHEMA['skills'].semantic_modelskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.semantic_skill_weightint16—config.yaml:400 + CONFIG_SCHEMA['skills'].semantic_skill_weightskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.swarm_injectboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].swarm_injectskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
skills.swarm_phase_hints_onlyboolTrue—config.yaml:400 + CONFIG_SCHEMA['skills'].swarm_phase_hints_onlyskill_selector.py, skill_pipeline.py, exploit_agent/skills.pyRuntime skills—noskillstests/test_skills*.py
snapshots.auto_before_destructiveboolTrue—config.yaml:363 + CONFIG_SCHEMA['snapshots'].auto_before_destructive——nosnapshots—
snapshots.enabledboolFalse—config.yaml:363 + CONFIG_SCHEMA['snapshots'].enabled——nosnapshots—
snapshots.max_snapshots_per_targetint3—config.yaml:363 + CONFIG_SCHEMA['snapshots'].max_snapshots_per_target——nosnapshots—
snapshots.providerstr'docker'—config.yaml:363 + CONFIG_SCHEMA['snapshots'].provider——nosnapshots—
snapshots.providers.docker.compose_filestr'eval_targets/docker-compose.yml'—config.yaml:363 + CONFIG_SCHEMA['snapshots'].providers.docker.compose_file——nosnapshots—
snapshots.providers.hyperv.powershell_commandstr'powershell'—config.yaml:363 + CONFIG_SCHEMA['snapshots'].providers.hyperv.powershell_command——nosnapshots—
snapshots.providers.libvirt.virsh_pathstr'virsh'—config.yaml:363 + CONFIG_SCHEMA['snapshots'].providers.libvirt.virsh_path——nosnapshots—
snapshots.providers.proxmox.hoststr''—config.yaml:363 + CONFIG_SCHEMA['snapshots'].providers.proxmox.host——nosnapshots—
snapshots.providers.proxmox.nodestr''—config.yaml:363 + CONFIG_SCHEMA['snapshots'].providers.proxmox.node——nosnapshots—
snapshots.providers.vmware.vmrun_pathstr'vmrun'—config.yaml:363 + CONFIG_SCHEMA['snapshots'].providers.vmware.vmrun_path——nosnapshots—
snapshots.vm_mapdict{}—config.yaml:363 + CONFIG_SCHEMA['snapshots'].vm_map——nosnapshots—
stealth.dns_over_httpsboolFalse—config.yaml:108 + CONFIG_SCHEMA['stealth'].dns_over_httpsinteractive_menu.py (legacy)Legacy stealth—noopsec
stealth.doh_providerstr'cloudflare'cloudflare | googleconfig.yaml:108 + CONFIG_SCHEMA['stealth'].doh_providerinteractive_menu.py (legacy)Legacy stealth—noopsec
stealth.rotate_uaboolFalse—config.yaml:108 + CONFIG_SCHEMA['stealth'].rotate_uainteractive_menu.py (legacy)Legacy stealth—noopsec
swarm.agentslist[str]['recon', 'vuln', 'exploit', 'post_exploit', 'critic', 'reflection']—config.yaml:175 + CONFIG_SCHEMA['swarm'].agentscli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
swarm.enabledboolTrue—config.yaml:175 + CONFIG_SCHEMA['swarm'].enabledcli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
swarm.exploit_parallelboolFalse—config.yaml:175 + CONFIG_SCHEMA['swarm'].exploit_parallelcli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
swarm.max_parallel_agentsint3—config.yaml:175 + CONFIG_SCHEMA['swarm'].max_parallel_agentscli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
swarm.negotiation_roundsint0 (schema) → 2 (lab)—config.yaml:175 + CONFIG_SCHEMA['swarm'].negotiation_roundscli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
swarm.parallel_enabledboolFalse—config.yaml:175 + CONFIG_SCHEMA['swarm'].parallel_enabledcli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
swarm.per_phase_concurrencyint3—config.yaml:175 + CONFIG_SCHEMA['swarm'].per_phase_concurrencycli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
swarm.subagent_timeout_secondsint600—config.yaml:175 + CONFIG_SCHEMA['swarm'].subagent_timeout_secondscli_exploit_settings.py, swarm/orchestrator.pyMulti-agent swarm—noswarmtests/test_swarm*.py
threat_intel.cache_dirstr'exploit_workspace/.threat_intel'—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].cache_dirthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.cache_ttl_secondsint86400—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].cache_ttl_secondsthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.enabledboolTrue—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].enabledthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.github_token_envstr'GITHUB_TOKEN'—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].github_token_envthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEVGITHUB_TOKENnothreat_inteltests/test_threat*.py
threat_intel.max_resultsint20—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].max_resultsthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.sources.exploitdb_rssboolFalse—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].sources.exploitdb_rssthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.sources.ghsaboolTrue—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].sources.ghsathreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.sources.kevboolTrue—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].sources.kevthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.sources.osvboolTrue—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].sources.osvthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
threat_intel.timeout_secondsint30—config.yaml:129 + CONFIG_SCHEMA['threat_intel'].timeout_secondsthreat_intel.py, mcp_tools/research.pyOSV/GHSA/KEV—nothreat_inteltests/test_threat*.py
ticketing.backoff_secondsfloat2.0—config.yaml:487 + CONFIG_SCHEMA['ticketing'].backoff_secondsticketing.pyJira/GitHub tickets—noticketing
ticketing.base_urlstr''—config.yaml:487 + CONFIG_SCHEMA['ticketing'].base_urlticketing.pyJira/GitHub tickets—noticketing
ticketing.enabledboolTrue—config.yaml:487 + CONFIG_SCHEMA['ticketing'].enabledticketing.pyJira/GitHub tickets—noticketing
ticketing.max_retriesint3—config.yaml:487 + CONFIG_SCHEMA['ticketing'].max_retriesticketing.pyJira/GitHub tickets—noticketing
ticketing.project_keystr''—config.yaml:487 + CONFIG_SCHEMA['ticketing'].project_keyticketing.pyJira/GitHub tickets—noticketing
ticketing.providerstr''—config.yaml:487 + CONFIG_SCHEMA['ticketing'].providerticketing.pyJira/GitHub tickets—noticketing
ticketing.token_envstr'TICKETING_TOKEN'—config.yaml:487 + CONFIG_SCHEMA['ticketing'].token_envticketing.pyJira/GitHub ticketsTICKETING_TOKENnoticketing
webhook_notify.backoff_secondsfloat2.0—config.yaml:472 + CONFIG_SCHEMA['webhook_notify'].backoff_secondsplugins/webhook_notify.pySlack/Discord webhook—noplugins
webhook_notify.enabledboolTrue—config.yaml:472 + CONFIG_SCHEMA['webhook_notify'].enabledplugins/webhook_notify.pySlack/Discord webhook—noplugins
webhook_notify.eventslist[str]['finding', 'state']—config.yaml:472 + CONFIG_SCHEMA['webhook_notify'].eventsplugins/webhook_notify.pySlack/Discord webhook—noplugins
webhook_notify.max_payload_charsint8192—config.yaml:472 + CONFIG_SCHEMA['webhook_notify'].max_payload_charsplugins/webhook_notify.pySlack/Discord webhook—noplugins
webhook_notify.max_retriesint3—config.yaml:472 + CONFIG_SCHEMA['webhook_notify'].max_retriesplugins/webhook_notify.pySlack/Discord webhook—noplugins
webhook_notify.timeout_secondsint5—config.yaml:472 + CONFIG_SCHEMA['webhook_notify'].timeout_secondsplugins/webhook_notify.pySlack/Discord webhook—noplugins
webhook_notify.urlstr''—config.yaml:472 + CONFIG_SCHEMA['webhook_notify'].urlplugins/webhook_notify.pySlack/Discord webhook—noplugins
witness.dos_failure_thresholdint8—config.yaml:190 + CONFIG_SCHEMA['witness'].dos_failure_thresholdswarm/agents/witness_agent.pyAudit watcher—nowitnesstests/test_witness.py
witness.dos_failure_window_secondsfloat60.0—config.yaml:190 + CONFIG_SCHEMA['witness'].dos_failure_window_secondsswarm/agents/witness_agent.pyAudit watcher—nowitnesstests/test_witness.py
witness.enabledboolFalse (schema) → True (lab)—config.yaml:190 + CONFIG_SCHEMA['witness'].enabledrun_service/execute.py (per-run side task) + swarm/agents/witness_agent.pyAudit watcher (advisory)—nowitnesstests/test_witness_wiring.py, tests/test_witness.py
witness.escalate_to_event_brokerboolTrue—config.yaml:190 + CONFIG_SCHEMA['witness'].escalate_to_event_brokerswarm/agents/witness_agent.pyAudit watcher—nowitnesstests/test_witness.py
witness.log_pathstr'reports/witness.jsonl'—config.yaml:190 + CONFIG_SCHEMA['witness'].log_pathswarm/agents/witness_agent.pyAudit watcher—nowitnesstests/test_witness.py
witness.max_flags_per_signal_per_minuteint10—config.yaml:190 + CONFIG_SCHEMA['witness'].max_flags_per_signal_per_minuteswarm/agents/witness_agent.pyAudit watcher—nowitnesstests/test_witness.py
witness.poll_interval_secondsint5—config.yaml:190 + CONFIG_SCHEMA['witness'].poll_interval_secondsswarm/agents/witness_agent.pyAudit watcher—nowitnesstests/test_witness.py

Notes

  • Verified: every Key is a leaf path present in config.yaml (checked via yaml.safe_load). No invented keys.
  • Schema vs lab: Default shows CONFIG_SCHEMA default; when lab differs, both shown as schema → lab. Lab-only keys (autonomous.dedup_targets, recon.preflight_*, recon.fast.*, api.max_concurrent_runs) have no schema default.
  • Restart: yes = daemon/router rebuild; no = next build_*/orchestration.
  • Allowed: — = free-form string/int/list; enums where validated (see tools/config_manager.ConfigValidator.validate).
source: repo docs (build sync)Edit this page on GitHub →