SYMBOL INDEX (4464 symbols across 269 files) FILE: researchclaw/adapters.py class FetchResponse (line 10) | class FetchResponse: class BrowserPage (line 17) | class BrowserPage: class CronAdapter (line 22) | class CronAdapter(Protocol): method schedule_resume (line 23) | def schedule_resume(self, run_id: str, stage_id: int, reason: str) -> ... class MessageAdapter (line 26) | class MessageAdapter(Protocol): method notify (line 27) | def notify(self, channel: str, subject: str, body: str) -> str: ... class MemoryAdapter (line 30) | class MemoryAdapter(Protocol): method append (line 31) | def append(self, namespace: str, content: str) -> str: ... class SessionsAdapter (line 34) | class SessionsAdapter(Protocol): method spawn (line 35) | def spawn(self, name: str, command: tuple[str, ...]) -> str: ... class WebFetchAdapter (line 38) | class WebFetchAdapter(Protocol): method fetch (line 39) | def fetch(self, url: str) -> FetchResponse: ... class BrowserAdapter (line 42) | class BrowserAdapter(Protocol): method open (line 43) | def open(self, url: str) -> BrowserPage: ... class RecordingCronAdapter (line 47) | class RecordingCronAdapter: method schedule_resume (line 50) | def schedule_resume(self, run_id: str, stage_id: int, reason: str) -> ... class RecordingMessageAdapter (line 56) | class RecordingMessageAdapter: method notify (line 59) | def notify(self, channel: str, subject: str, body: str) -> str: class RecordingMemoryAdapter (line 65) | class RecordingMemoryAdapter: method append (line 68) | def append(self, namespace: str, content: str) -> str: class RecordingSessionsAdapter (line 74) | class RecordingSessionsAdapter: method spawn (line 77) | def spawn(self, name: str, command: tuple[str, ...]) -> str: class RecordingWebFetchAdapter (line 83) | class RecordingWebFetchAdapter: method fetch (line 86) | def fetch(self, url: str) -> FetchResponse: class RecordingBrowserAdapter (line 92) | class RecordingBrowserAdapter: method open (line 95) | def open(self, url: str) -> BrowserPage: class MCPMessageAdapter (line 101) | class MCPMessageAdapter: method notify (line 106) | def notify(self, channel: str, subject: str, body: str) -> str: class MCPWebFetchAdapter (line 111) | class MCPWebFetchAdapter: method fetch (line 116) | def fetch(self, url: str) -> FetchResponse: class AdapterBundle (line 121) | class AdapterBundle: method from_config (line 130) | def from_config(cls, config: object) -> AdapterBundle: FILE: researchclaw/agents/base.py class _LLMResponseLike (line 25) | class _LLMResponseLike(Protocol): # pragma: no cover class _LLMClientLike (line 32) | class _LLMClientLike(Protocol): # pragma: no cover method chat (line 33) | def chat( class AgentStepResult (line 50) | class AgentStepResult: class BaseAgent (line 65) | class BaseAgent: method __init__ (line 73) | def __init__(self, llm: _LLMClientLike) -> None: method _chat (line 81) | def _chat( method _chat_json (line 102) | def _chat_json( method _parse_json (line 122) | def _parse_json(text: str) -> dict[str, Any] | None: method execute (line 163) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _make_result (line 167) | def _make_result( class AgentOrchestrator (line 189) | class AgentOrchestrator: method __init__ (line 196) | def __init__(self, llm: _LLMClientLike, *, max_iterations: int = 3) ->... method _accumulate (line 203) | def _accumulate(self, result: AgentStepResult) -> None: method orchestrate (line 208) | def orchestrate(self, context: dict[str, Any]) -> dict[str, Any]: FILE: researchclaw/agents/benchmark_agent/acquirer.py class AcquirerAgent (line 19) | class AcquirerAgent(BaseAgent): method _generate_data_loader (line 24) | def _generate_data_loader( method _generate_baseline_code (line 63) | def _generate_baseline_code( method _generate_setup_script (line 106) | def _generate_setup_script( method _generate_requirements (line 192) | def _generate_requirements(self, required_pip: list[str]) -> str: method _strip_fences (line 212) | def _strip_fences(code: str) -> str: method execute (line 225) | def execute(self, context: dict[str, Any]) -> AgentStepResult: FILE: researchclaw/agents/benchmark_agent/orchestrator.py class BenchmarkAgentConfig (line 33) | class BenchmarkAgentConfig: class BenchmarkPlan (line 58) | class BenchmarkPlan: method to_dict (line 89) | def to_dict(self) -> dict[str, Any]: method to_prompt_block (line 108) | def to_prompt_block(self) -> str: class BenchmarkOrchestrator (line 163) | class BenchmarkOrchestrator(AgentOrchestrator): method __init__ (line 166) | def __init__( method _save_artifact (line 201) | def _save_artifact(self, name: str, data: Any) -> None: method orchestrate (line 215) | def orchestrate(self, context: dict[str, Any]) -> BenchmarkPlan: FILE: researchclaw/agents/benchmark_agent/selector.py class SelectorAgent (line 30) | class SelectorAgent(BaseAgent): method __init__ (line 35) | def __init__( method _filter_benchmarks (line 58) | def _filter_benchmarks( method _filter_baselines (line 85) | def _filter_baselines( method _rank_benchmarks (line 100) | def _rank_benchmarks( method _rank_baselines (line 120) | def _rank_baselines( method _select_with_llm (line 133) | def _select_with_llm( method _resolve_selection (line 187) | def _resolve_selection( method _inject_required_baselines (line 218) | def _inject_required_baselines( method execute (line 266) | def execute(self, context: dict[str, Any]) -> AgentStepResult: FILE: researchclaw/agents/benchmark_agent/surveyor.py class SurveyorAgent (line 48) | class SurveyorAgent(BaseAgent): method __init__ (line 53) | def __init__( method _load_knowledge (line 68) | def _load_knowledge() -> dict[str, Any]: method _match_domains (line 77) | def _match_domains(self, topic: str) -> list[str]: method _get_local_candidates (line 89) | def _get_local_candidates(self, domain_ids: list[str]) -> dict[str, Any]: method _search_hf_datasets (line 113) | def _search_hf_datasets(self, topic: str, domain_ids: list[str]) -> li... method _extract_search_keywords (line 176) | def _extract_search_keywords(topic: str) -> list[str]: method _llm_suggest_benchmarks (line 198) | def _llm_suggest_benchmarks(self, topic: str, hypothesis: str) -> dict... method execute (line 244) | def execute(self, context: dict[str, Any]) -> AgentStepResult: FILE: researchclaw/agents/benchmark_agent/validator.py class ValidatorAgent (line 37) | class ValidatorAgent(BaseAgent): method _check_syntax (line 42) | def _check_syntax(self, code: str, label: str) -> list[str]: method _check_imports (line 52) | def _check_imports( method _llm_review (line 94) | def _llm_review( method execute (line 141) | def execute(self, context: dict[str, Any]) -> AgentStepResult: FILE: researchclaw/agents/code_searcher/agent.py class CodeSearchResult (line 33) | class CodeSearchResult: method to_prompt_context (line 43) | def to_prompt_context(self) -> str: method to_cache_dict (line 49) | def to_cache_dict(self) -> dict[str, Any]: method from_cache_dict (line 69) | def from_cache_dict(cls, data: dict[str, Any]) -> CodeSearchResult: class CodeSearchAgent (line 94) | class CodeSearchAgent: method __init__ (line 108) | def __init__( method search (line 122) | def search( method _analyze_repo (line 249) | def _analyze_repo(self, repo: RepoInfo) -> RepoAnalysis | None: FILE: researchclaw/agents/code_searcher/cache.py class SearchCache (line 24) | class SearchCache: method __init__ (line 34) | def __init__( method get (line 42) | def get(self, domain_id: str, topic: str) -> dict[str, Any] | None: method put (line 61) | def put(self, domain_id: str, topic: str, data: dict[str, Any]) -> None: method clear (line 79) | def clear(self, domain_id: str | None = None) -> int: method stats (line 95) | def stats(self) -> dict[str, int]: method _cache_path (line 117) | def _cache_path(self, domain_id: str, topic: str) -> Path: method _topic_hash (line 121) | def _topic_hash(topic: str) -> str: FILE: researchclaw/agents/code_searcher/github_client.py class RepoInfo (line 30) | class RepoInfo: class CodeSnippet (line 43) | class CodeSnippet: class RepoAnalysis (line 53) | class RepoAnalysis: class GitHubClient (line 62) | class GitHubClient: method __init__ (line 69) | def __init__(self, token: str | None = None) -> None: method _headers (line 75) | def _headers(self) -> dict[str, str]: method _rate_limit_wait (line 84) | def _rate_limit_wait(self) -> None: method _get (line 93) | def _get(self, url: str, params: dict[str, str] | None = None) -> dict... method search_repos (line 122) | def search_repos( method search_code (line 176) | def search_code( method get_file_content (line 224) | def get_file_content( method get_readme (line 268) | def get_readme(self, repo_full_name: str) -> str | None: method get_repo_tree (line 286) | def get_repo_tree( method request_count (line 302) | def request_count(self) -> int: method has_token (line 306) | def has_token(self) -> bool: FILE: researchclaw/agents/code_searcher/pattern_extractor.py class CodePatterns (line 22) | class CodePatterns: method to_prompt_context (line 31) | def to_prompt_context(self) -> str: method has_content (line 54) | def has_content(self) -> bool: function extract_patterns (line 95) | def extract_patterns( function _llm_extract (line 127) | def _llm_extract( function _heuristic_extract (line 183) | def _heuristic_extract(snippets: list[str]) -> CodePatterns: FILE: researchclaw/agents/code_searcher/query_gen.py function generate_search_queries (line 41) | def generate_search_queries( function _heuristic_generate (line 77) | def _heuristic_generate( function _llm_generate (line 116) | def _llm_generate( function _extract_key_phrases (line 160) | def _extract_key_phrases(text: str, max_words: int = 5) -> str: FILE: researchclaw/agents/figure_agent/codegen.py function _esc (line 29) | def _esc(s: str) -> str: function _is_degenerate_data (line 38) | def _is_degenerate_data(values: list[float]) -> bool: function _humanize_label (line 75) | def _humanize_label(raw: str) -> str: class CodeGenAgent (line 404) | class CodeGenAgent(BaseAgent): method __init__ (line 414) | def __init__(self, llm: Any, *, output_format: str = "python", use_doc... method execute (line 423) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _generate_script (line 493) | def _generate_script( method _fill_template (line 569) | def _fill_template( method _fill_bar_template (line 646) | def _fill_bar_template( method _fill_grouped_bar_template (line 711) | def _fill_grouped_bar_template( method _fill_heatmap_template (line 756) | def _fill_heatmap_template( method _llm_generate_script (line 822) | def _llm_generate_script( method _llm_generate_latex (line 921) | def _llm_generate_latex( method _strip_fences (line 990) | def _strip_fences(text: str) -> str: method _strip_latex_fences (line 998) | def _strip_latex_fences(text: str) -> str: FILE: researchclaw/agents/figure_agent/critic.py class CriticAgent (line 23) | class CriticAgent(BaseAgent): method __init__ (line 28) | def __init__( method execute (line 41) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _review_figure (line 124) | def _review_figure( method _check_numerical_accuracy (line 179) | def _check_numerical_accuracy( method _check_text_correctness (line 252) | def _check_text_correctness( method _check_visual_quality (line 309) | def _check_visual_quality( method _check_rendered_image (line 368) | def _check_rendered_image( FILE: researchclaw/agents/figure_agent/decision.py function _safe_priority (line 30) | def _safe_priority(val: object, default: int = 2) -> int: class FigureDecisionAgent (line 95) | class FigureDecisionAgent(BaseAgent): method __init__ (line 108) | def __init__( method execute (line 123) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _llm_decide (line 196) | def _llm_decide( method _parse_decisions (line 253) | def _parse_decisions(self, raw: str) -> list[dict[str, Any]]: method _heuristic_decide (line 295) | def _heuristic_decide( method _infer_backend (line 369) | def _infer_backend(figure_type: str) -> str: method _enforce_bounds (line 380) | def _enforce_bounds( FILE: researchclaw/agents/figure_agent/integrator.py class IntegratorAgent (line 35) | class IntegratorAgent(BaseAgent): method __init__ (line 40) | def __init__(self, llm: Any) -> None: method execute (line 47) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _build_manifest (line 107) | def _build_manifest( method _section_order (line 153) | def _section_order(section: str) -> int: method _generate_markdown_refs (line 174) | def _generate_markdown_refs( method _generate_descriptions (line 194) | def _generate_descriptions( FILE: researchclaw/agents/figure_agent/nano_banana.py class NanoBananaAgent (line 61) | class NanoBananaAgent(BaseAgent): method __init__ (line 70) | def __init__( method execute (line 110) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _build_prompt (line 219) | def _build_prompt( method _get_type_guidelines (line 243) | def _get_type_guidelines(figure_type: str) -> str: method _generate_image (line 305) | def _generate_image( method _generate_via_sdk (line 318) | def _generate_via_sdk( method _generate_via_rest (line 358) | def _generate_via_rest( FILE: researchclaw/agents/figure_agent/orchestrator.py class FigureAgentConfig (line 39) | class FigureAgentConfig: class FigurePlan (line 70) | class FigurePlan: method to_dict (line 97) | def to_dict(self) -> dict[str, Any]: method get_chart_files (line 112) | def get_chart_files(self) -> list[str]: class FigureOrchestrator (line 126) | class FigureOrchestrator(AgentOrchestrator): method __init__ (line 129) | def __init__( method _save_artifact (line 182) | def _save_artifact(self, name: str, data: Any) -> None: method orchestrate (line 196) | def orchestrate(self, context: dict[str, Any]) -> FigurePlan: method _run_code_pipeline (line 309) | def _run_code_pipeline( method _run_nano_banana (line 449) | def _run_nano_banana( FILE: researchclaw/agents/figure_agent/planner.py class PlannerAgent (line 85) | class PlannerAgent(BaseAgent): method __init__ (line 90) | def __init__( method execute (line 105) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _detect_domain (line 156) | def _detect_domain(self, topic: str) -> str: method _analyze_data (line 172) | def _analyze_data( method _generate_plan (line 233) | def _generate_plan( method _fallback_plan (line 325) | def _fallback_plan( method _augment_plan (line 407) | def _augment_plan( FILE: researchclaw/agents/figure_agent/renderer.py function _docker_available (line 38) | def _docker_available() -> bool: class RendererAgent (line 52) | class RendererAgent(BaseAgent): method __init__ (line 67) | def __init__( method execute (line 103) | def execute(self, context: dict[str, Any]) -> AgentStepResult: method _render_one (line 157) | def _render_one( method _execute_local (line 256) | def _execute_local( method _execute_in_docker (line 284) | def _execute_in_docker( FILE: researchclaw/agents/figure_agent/style_config.py function get_font_sizes (line 49) | def get_font_sizes(width_key: str = "single_column") -> dict[str, int]: function get_style_preamble (line 166) | def get_style_preamble( FILE: researchclaw/assessor/comparator.py class HistoryComparator (line 14) | class HistoryComparator: method __init__ (line 17) | def __init__(self, history_dir: Path | None = None): method _load_history (line 23) | def _load_history(self) -> None: method record (line 37) | def record( method _save_history (line 54) | def _save_history(self) -> None: method compare (line 64) | def compare( method get_best_run (line 114) | def get_best_run(self) -> dict[str, Any] | None: method get_history (line 120) | def get_history(self) -> list[dict[str, Any]]: FILE: researchclaw/assessor/rubrics.py class Rubric (line 9) | class Rubric: FILE: researchclaw/assessor/scorer.py class PaperScorer (line 15) | class PaperScorer: method __init__ (line 18) | def __init__( method score (line 26) | async def score( method _score_dimension (line 69) | async def _score_dimension( method _parse_score_response (line 102) | def _parse_score_response( method _heuristic_score (line 120) | def _heuristic_score( FILE: researchclaw/assessor/venue_recommender.py class VenueRecommender (line 8) | class VenueRecommender: method recommend (line 55) | def recommend( method _get_suggestion (line 96) | def _get_suggestion(venue: str, scores: dict[str, Any]) -> str: method format_recommendations (line 111) | def format_recommendations( FILE: researchclaw/calendar/deadlines.py class Conference (line 19) | class Conference: method from_dict (line 34) | def from_dict(cls, data: dict[str, Any]) -> Conference: method next_deadline (line 57) | def next_deadline(self) -> date | None: method days_until_deadline (line 68) | def days_until_deadline(self) -> int | None: class ConferenceCalendar (line 76) | class ConferenceCalendar: method __init__ (line 79) | def __init__(self, conferences: list[Conference] | None = None): method load_builtin (line 83) | def load_builtin(cls) -> ConferenceCalendar: method load (line 92) | def load(cls, path: Path | str) -> ConferenceCalendar: method conferences (line 107) | def conferences(self) -> list[Conference]: method get_upcoming (line 110) | def get_upcoming( method get_by_name (line 134) | def get_by_name(self, name: str) -> Conference | None: method get_by_domain (line 142) | def get_by_domain(self, domain: str) -> list[Conference]: method format_upcoming (line 146) | def format_upcoming( FILE: researchclaw/calendar/planner.py class SubmissionPlanner (line 11) | class SubmissionPlanner: method __init__ (line 26) | def __init__(self, calendar: ConferenceCalendar): method plan (line 29) | def plan( method format_plan (line 74) | def format_plan( FILE: researchclaw/calendar/reminder.py class Reminder (line 13) | class Reminder: class ReminderCalculator (line 23) | class ReminderCalculator: method __init__ (line 26) | def __init__( method check (line 32) | def check( method get_active_reminders (line 64) | def get_active_reminders( method _classify_urgency (line 96) | def _classify_urgency(days_until: int) -> str: method format_reminders (line 103) | def format_reminders(self, reminders: list[Reminder]) -> str: FILE: researchclaw/cli.py function _is_opencode_installed (line 29) | def _is_opencode_installed() -> bool: function _is_npm_installed (line 44) | def _is_npm_installed() -> bool: function _install_opencode (line 49) | def _install_opencode() -> bool: function _prompt_opencode_install (line 78) | def _prompt_opencode_install() -> bool: function _resolve_config_or_exit (line 128) | def _resolve_config_or_exit(args: argparse.Namespace) -> Path | None: function _generate_run_id (line 149) | def _generate_run_id(topic: str) -> str: function cmd_run (line 155) | def cmd_run(args: argparse.Namespace) -> int: function cmd_validate (line 307) | def cmd_validate(args: argparse.Namespace) -> int: function cmd_doctor (line 343) | def cmd_doctor(args: argparse.Namespace) -> int: function cmd_project (line 356) | def cmd_project(args: argparse.Namespace) -> int: function cmd_mcp (line 404) | def cmd_mcp(args: argparse.Namespace) -> int: function cmd_overleaf (line 426) | def cmd_overleaf(args: argparse.Namespace) -> int: function cmd_serve (line 464) | def cmd_serve(args: argparse.Namespace) -> int: function cmd_dashboard (line 490) | def cmd_dashboard(args: argparse.Namespace) -> int: function cmd_wizard (line 516) | def cmd_wizard(args: argparse.Namespace) -> int: function cmd_init (line 560) | def cmd_init(args: argparse.Namespace) -> int: function cmd_setup (line 656) | def cmd_setup(args: argparse.Namespace) -> int: function cmd_report (line 699) | def cmd_report(args: argparse.Namespace) -> int: function cmd_trends (line 721) | def cmd_trends(args: argparse.Namespace) -> int: function cmd_calendar (line 775) | def cmd_calendar(args: argparse.Namespace) -> int: function main (line 796) | def main(argv: list[str] | None = None) -> int: FILE: researchclaw/collaboration/dedup.py function content_hash (line 12) | def content_hash(content: Any) -> str: function deduplicate_artifacts (line 30) | def deduplicate_artifacts( FILE: researchclaw/collaboration/publisher.py class ArtifactPublisher (line 15) | class ArtifactPublisher: method __init__ (line 22) | def __init__(self, repository: ResearchRepository) -> None: method publish_from_run_dir (line 25) | def publish_from_run_dir( method _extract_literature (line 67) | def _extract_literature(self, run_dir: Path) -> Any: method _extract_experiments (line 76) | def _extract_experiments(self, run_dir: Path) -> Any: method _extract_code (line 87) | def _extract_code(self, run_dir: Path) -> Any: method _extract_review (line 95) | def _extract_review(self, run_dir: Path) -> Any: FILE: researchclaw/collaboration/repository.py class ResearchRepository (line 21) | class ResearchRepository: method __init__ (line 28) | def __init__(self, repo_dir: str | Path = ".researchclaw/shared") -> N... method repo_dir (line 32) | def repo_dir(self) -> Path: method publish (line 36) | def publish(self, run_id: str, artifacts: dict[str, Any]) -> int: method search (line 75) | def search( method list_runs (line 122) | def list_runs(self) -> list[str]: method get_run_artifacts (line 135) | def get_run_artifacts(self, run_id: str) -> dict[str, Any]: method import_literature (line 158) | def import_literature(self, source_run_id: str) -> list[dict[str, Any]]: method import_code_template (line 176) | def import_code_template( FILE: researchclaw/collaboration/subscriber.py class ArtifactSubscriber (line 13) | class ArtifactSubscriber: method __init__ (line 20) | def __init__(self, repository: ResearchRepository) -> None: method find_relevant_literature (line 23) | def find_relevant_literature( method find_similar_experiments (line 41) | def find_similar_experiments( method find_code_templates (line 59) | def find_code_templates( method import_best_practices (line 77) | def import_best_practices( FILE: researchclaw/config.py function _safe_int (line 17) | def _safe_int(val: Any, default: int) -> int: function _validate_network_policy (line 30) | def _validate_network_policy(val: object, default: str = "setup_only") -... function _safe_float (line 42) | def _safe_float(val: Any, default: float) -> float: function resolve_config_path (line 60) | def resolve_config_path(explicit: str | None) -> Path | None: function _get_by_path (line 94) | def _get_by_path(data: dict[str, Any], dotted_key: str) -> Any: function _is_blank (line 103) | def _is_blank(value: Any) -> bool: class ValidationResult (line 108) | class ValidationResult: class ProjectConfig (line 115) | class ProjectConfig: class ResearchConfig (line 121) | class ResearchConfig: class RuntimeConfig (line 130) | class RuntimeConfig: class NotificationsConfig (line 138) | class NotificationsConfig: class KnowledgeBaseConfig (line 147) | class KnowledgeBaseConfig: class OpenClawBridgeConfig (line 154) | class OpenClawBridgeConfig: class AcpConfig (line 164) | class AcpConfig: class LlmConfig (line 175) | class LlmConfig: class SecurityConfig (line 188) | class SecurityConfig: class SandboxConfig (line 195) | class SandboxConfig: class SshRemoteConfig (line 211) | class SshRemoteConfig: class ColabDriveConfig (line 231) | class ColabDriveConfig: class DockerSandboxConfig (line 241) | class DockerSandboxConfig: class AgenticConfig (line 257) | class AgenticConfig: class CodeAgentConfig (line 278) | class CodeAgentConfig: class OpenCodeConfig (line 302) | class OpenCodeConfig: class BenchmarkAgentConfig (line 318) | class BenchmarkAgentConfig: class FigureAgentConfig (line 339) | class FigureAgentConfig: class ExperimentRepairConfig (line 365) | class ExperimentRepairConfig: class CliAgentConfig (line 385) | class CliAgentConfig: class ExperimentConfig (line 405) | class ExperimentConfig: class MetaClawPRMConfig (line 427) | class MetaClawPRMConfig: class MetaClawLessonToSkillConfig (line 441) | class MetaClawLessonToSkillConfig: class MetaClawBridgeConfig (line 450) | class MetaClawBridgeConfig: class WebSearchConfig (line 465) | class WebSearchConfig: class ExportConfig (line 480) | class ExportConfig: class PromptsConfig (line 488) | class PromptsConfig: class MemoryConfig (line 498) | class MemoryConfig: class SkillsConfig (line 511) | class SkillsConfig: class KnowledgeGraphConfig (line 524) | class KnowledgeGraphConfig: class ServerConfig (line 537) | class ServerConfig: class DashboardConfig (line 551) | class DashboardConfig: class MultiProjectConfig (line 564) | class MultiProjectConfig: class ServerEntryConfig (line 574) | class ServerEntryConfig: class ServersConfig (line 589) | class ServersConfig: class MCPIntegrationConfig (line 600) | class MCPIntegrationConfig: class OverleafConfig (line 610) | class OverleafConfig: class TrendsConfig (line 626) | class TrendsConfig: class CoPilotConfig (line 639) | class CoPilotConfig: class QualityAssessorConfig (line 651) | class QualityAssessorConfig: class CalendarConfig (line 663) | class CalendarConfig: class RCConfig (line 673) | class RCConfig: method to_dict (line 707) | def to_dict(self) -> dict[str, Any]: method from_dict (line 711) | def from_dict( method load (line 835) | def load( function validate_config (line 858) | def validate_config( function _parse_llm_config (line 923) | def _parse_llm_config(data: dict[str, Any]) -> LlmConfig: function _parse_agentic_config (line 944) | def _parse_agentic_config(data: dict[str, Any]) -> AgenticConfig: function _parse_experiment_config (line 963) | def _parse_experiment_config(data: dict[str, Any]) -> ExperimentConfig: function _parse_benchmark_agent_config (line 1040) | def _parse_benchmark_agent_config(data: dict[str, Any]) -> BenchmarkAgen... function _parse_figure_agent_config (line 1058) | def _parse_figure_agent_config(data: dict[str, Any]) -> FigureAgentConfig: function _parse_experiment_repair_config (line 1081) | def _parse_experiment_repair_config(data: dict[str, Any]) -> ExperimentR... function _parse_cli_agent_config (line 1094) | def _parse_cli_agent_config(data: dict[str, Any]) -> CliAgentConfig: function _parse_code_agent_config (line 1108) | def _parse_code_agent_config(data: dict[str, Any]) -> CodeAgentConfig: function _parse_opencode_config (line 1129) | def _parse_opencode_config(data: dict[str, Any]) -> OpenCodeConfig: function _parse_metaclaw_bridge_config (line 1143) | def _parse_metaclaw_bridge_config(data: dict[str, Any]) -> MetaClawBridg... function _parse_memory_config (line 1172) | def _parse_memory_config(data: dict[str, Any]) -> MemoryConfig: function _parse_skills_config (line 1187) | def _parse_skills_config(data: dict[str, Any]) -> SkillsConfig: function _parse_knowledge_graph_config (line 1201) | def _parse_knowledge_graph_config(data: dict[str, Any]) -> KnowledgeGrap... function _parse_multi_project_config (line 1212) | def _parse_multi_project_config(data: dict[str, Any]) -> MultiProjectCon... function _parse_servers_config (line 1223) | def _parse_servers_config(data: dict[str, Any]) -> ServersConfig: function _parse_mcp_config (line 1250) | def _parse_mcp_config(data: dict[str, Any]) -> MCPIntegrationConfig: function _parse_overleaf_config (line 1261) | def _parse_overleaf_config(data: dict[str, Any]) -> OverleafConfig: function _parse_server_config (line 1274) | def _parse_server_config(data: dict[str, Any]) -> ServerConfig: function _parse_dashboard_config (line 1296) | def _parse_dashboard_config(data: dict[str, Any]) -> DashboardConfig: function _parse_trends_config (line 1309) | def _parse_trends_config(data: dict[str, Any]) -> TrendsConfig: function _parse_copilot_config (line 1329) | def _parse_copilot_config(data: dict[str, Any]) -> CoPilotConfig: function _parse_quality_assessor_config (line 1342) | def _parse_quality_assessor_config(data: dict[str, Any]) -> QualityAsses... function _parse_calendar_config (line 1356) | def _parse_calendar_config(data: dict[str, Any]) -> CalendarConfig: function load_config (line 1373) | def load_config( FILE: researchclaw/copilot/branching.py class BranchManager (line 15) | class BranchManager: method __init__ (line 18) | def __init__(self, run_dir: Path, max_branches: int = 3): method create_branch (line 23) | def create_branch( method list_branches (line 62) | def list_branches(self) -> list[dict[str, Any]]: method switch_branch (line 91) | def switch_branch(self, name: str) -> Path: method delete_branch (line 98) | def delete_branch(self, name: str) -> None: method compare_branches (line 106) | def compare_branches( method _count_stages (line 138) | def _count_stages(branch_dir: Path) -> int: method _read_experiment_summary (line 147) | def _read_experiment_summary( FILE: researchclaw/copilot/controller.py class CoPilotController (line 18) | class CoPilotController: method __init__ (line 21) | def __init__( method should_pause (line 34) | def should_pause(self, stage_num: int, is_gate: bool) -> bool: method present_stage_result (line 45) | def present_stage_result( method request_feedback (line 72) | def request_feedback( method handle_feedback (line 99) | def handle_feedback( method from_config (line 149) | def from_config( FILE: researchclaw/copilot/feedback.py class Feedback (line 27) | class Feedback: class FeedbackHandler (line 39) | class FeedbackHandler: method __init__ (line 42) | def __init__(self, run_dir: Path): method write_feedback_request (line 45) | def write_feedback_request( method read_feedback_response (line 69) | def read_feedback_response(self) -> Feedback | None: method wait_for_feedback (line 97) | def wait_for_feedback( method clear_request (line 123) | def clear_request(self) -> None: FILE: researchclaw/copilot/modes.py class ResearchMode (line 8) | class ResearchMode(Enum): FILE: researchclaw/dashboard/broadcaster.py class DashboardBroadcaster (line 16) | class DashboardBroadcaster: method __init__ (line 19) | def __init__( method tick (line 28) | async def tick(self) -> None: function start_dashboard_loop (line 70) | async def start_dashboard_loop( FILE: researchclaw/dashboard/collector.py class RunSnapshot (line 16) | class RunSnapshot: method to_dict (line 34) | def to_dict(self) -> dict[str, Any]: class DashboardCollector (line 52) | class DashboardCollector: method __init__ (line 55) | def __init__( method collect_all (line 63) | def collect_all(self) -> list[RunSnapshot]: method collect_run (line 78) | def collect_run(self, run_dir: str | Path) -> RunSnapshot: method _collect_run (line 82) | def _collect_run(self, run_dir: Path) -> RunSnapshot: FILE: researchclaw/dashboard/metrics.py function aggregate_metrics (line 8) | def aggregate_metrics(runs: list[dict[str, Any]]) -> dict[str, Any]: function extract_training_curve (line 28) | def extract_training_curve(metrics: dict[str, Any]) -> list[dict[str, fl... FILE: researchclaw/data/__init__.py function detect_frameworks (line 47) | def detect_frameworks(topic: str, hypothesis: str = "", plan: str = "") ... function load_framework_docs (line 62) | def load_framework_docs(framework_ids: list[str], max_chars: int = 8000)... function _load_all (line 102) | def _load_all() -> list[dict[str, Any]]: function load_seminal_papers (line 116) | def load_seminal_papers(topic: str) -> list[dict[str, Any]]: FILE: researchclaw/domains/adapters/biology.py class BiologyPromptAdapter (line 14) | class BiologyPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 17) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 46) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 66) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _default_hints (line 77) | def _default_hints(self) -> str: FILE: researchclaw/domains/adapters/chemistry.py class ChemistryPromptAdapter (line 10) | class ChemistryPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 13) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 37) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 54) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _default_hints (line 64) | def _default_hints(self) -> str: FILE: researchclaw/domains/adapters/economics.py class EconomicsPromptAdapter (line 14) | class EconomicsPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 17) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 42) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 65) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _default_hints (line 80) | def _default_hints(self) -> str: method _output_format (line 94) | def _output_format(self) -> str: FILE: researchclaw/domains/adapters/math.py class MathPromptAdapter (line 10) | class MathPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 13) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 34) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 46) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _hints (line 56) | def _hints(self, paradigm: str) -> str: method _output_format (line 75) | def _output_format(self, paradigm: str) -> str: FILE: researchclaw/domains/adapters/ml.py class MLPromptAdapter (line 15) | class MLPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 18) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 21) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 24) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... FILE: researchclaw/domains/adapters/neuroscience.py class NeurosciencePromptAdapter (line 15) | class NeurosciencePromptAdapter(PromptAdapter): method get_code_generation_blocks (line 18) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 39) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 75) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _default_code_hints (line 98) | def _default_code_hints(self, paradigm: str) -> str: method _default_compute_budget (line 120) | def _default_compute_budget(self) -> str: method _default_dataset_guidance (line 129) | def _default_dataset_guidance(self) -> str: method _default_hp_reporting (line 139) | def _default_hp_reporting(self) -> str: method _output_format (line 147) | def _output_format(self, paradigm: str) -> str: FILE: researchclaw/domains/adapters/physics.py class PhysicsPromptAdapter (line 14) | class PhysicsPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 17) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 32) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 55) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _default_code_hints (line 67) | def _default_code_hints(self, paradigm: str) -> str: method _default_compute_budget (line 87) | def _default_compute_budget(self) -> str: method _default_dataset_guidance (line 96) | def _default_dataset_guidance(self) -> str: method _default_hp_reporting (line 105) | def _default_hp_reporting(self) -> str: method _output_format (line 112) | def _output_format(self, paradigm: str) -> str: FILE: researchclaw/domains/adapters/robotics.py class RoboticsPromptAdapter (line 14) | class RoboticsPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 17) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 37) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 73) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _default_code_hints (line 95) | def _default_code_hints(self) -> str: method _default_compute_budget (line 108) | def _default_compute_budget(self) -> str: method _default_dataset_guidance (line 117) | def _default_dataset_guidance(self) -> str: method _default_hp_reporting (line 126) | def _default_hp_reporting(self) -> str: method _output_format (line 134) | def _output_format(self) -> str: FILE: researchclaw/domains/adapters/security.py class SecurityPromptAdapter (line 10) | class SecurityPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 13) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 36) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 45) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... FILE: researchclaw/domains/detector.py class ExperimentParadigm (line 35) | class ExperimentParadigm(str, Enum): class MetricType (line 45) | class MetricType(str, Enum): class DomainProfile (line 61) | class DomainProfile: function _load_profile (line 121) | def _load_profile(path: Path) -> DomainProfile: function load_all_profiles (line 154) | def load_all_profiles() -> dict[str, DomainProfile]: function get_profile (line 175) | def get_profile(domain_id: str) -> DomainProfile | None: function get_generic_profile (line 181) | def get_generic_profile() -> DomainProfile: function _keyword_detect (line 295) | def _keyword_detect(text: str) -> str | None: function _llm_detect (line 345) | def _llm_detect( function detect_domain (line 385) | def detect_domain( function detect_domain_async (line 448) | async def detect_domain_async( function detect_domain_id (line 485) | def detect_domain_id(topic: str, hypotheses: str = "", literature: str =... function is_ml_domain (line 494) | def is_ml_domain(domain: DomainProfile) -> bool: FILE: researchclaw/domains/experiment_schema.py class ConditionRole (line 17) | class ConditionRole(str, Enum): class ExperimentType (line 24) | class ExperimentType(str, Enum): class Condition (line 33) | class Condition: class MetricSpec (line 44) | class MetricSpec: class EvaluationSpec (line 53) | class EvaluationSpec: class UniversalExperimentPlan (line 63) | class UniversalExperimentPlan: method references (line 92) | def references(self) -> list[Condition]: method proposed (line 97) | def proposed(self) -> list[Condition]: method variants (line 102) | def variants(self) -> list[Condition]: method to_legacy_format (line 106) | def to_legacy_format(self) -> dict[str, Any]: method to_yaml (line 141) | def to_yaml(self) -> str: function from_legacy_exp_plan (line 179) | def from_legacy_exp_plan( FILE: researchclaw/domains/prompt_adapter.py class PromptBlocks (line 27) | class PromptBlocks: class PromptAdapter (line 44) | class PromptAdapter(ABC): method __init__ (line 52) | def __init__(self, domain: DomainProfile) -> None: method get_code_generation_blocks (line 56) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 60) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 64) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method get_blueprint_context (line 67) | def get_blueprint_context(self) -> str: method get_condition_terminology (line 87) | def get_condition_terminology(self) -> dict[str, str]: class MLPromptAdapter (line 97) | class MLPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 102) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 106) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 109) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... class GenericPromptAdapter (line 118) | class GenericPromptAdapter(PromptAdapter): method get_code_generation_blocks (line 125) | def get_code_generation_blocks(self, context: dict[str, Any]) -> Promp... method get_experiment_design_blocks (line 142) | def get_experiment_design_blocks(self, context: dict[str, Any]) -> Pro... method get_result_analysis_blocks (line 167) | def get_result_analysis_blocks(self, context: dict[str, Any]) -> Promp... method _default_code_hints (line 184) | def _default_code_hints(self, paradigm: str, libs: str) -> str: method _default_dataset_guidance (line 217) | def _default_dataset_guidance(self, paradigm: str) -> str: method _default_hp_guidance (line 226) | def _default_hp_guidance(self) -> str: method _output_format_guidance (line 232) | def _output_format_guidance(self) -> str: function _build_adapter_registry (line 256) | def _build_adapter_registry() -> dict[str, type[PromptAdapter]]: function register_adapter (line 308) | def register_adapter(domain_prefix: str, adapter_cls: type[PromptAdapter... function get_adapter (line 313) | def get_adapter(domain: DomainProfile) -> PromptAdapter: FILE: researchclaw/evolution.py class LessonCategory (line 40) | class LessonCategory(str, Enum): class LessonEntry (line 52) | class LessonEntry: method to_dict (line 63) | def to_dict(self) -> dict[str, object]: method from_dict (line 67) | def from_dict(cls, data: dict[str, object]) -> LessonEntry: function _classify_error (line 106) | def _classify_error(stage_name: str, error_text: str) -> str: function extract_lessons (line 136) | def extract_lessons( function _extract_decision_rationale (line 210) | def _extract_decision_rationale(run_dir: Path) -> str: function _parse_justification_from_excerpt (line 237) | def _parse_justification_from_excerpt(text: str) -> str: function _extract_runtime_lessons (line 261) | def _extract_runtime_lessons( function _time_weight (line 326) | def _time_weight(timestamp_iso: str) -> float: class EvolutionStore (line 350) | class EvolutionStore: method __init__ (line 353) | def __init__(self, store_dir: Path) -> None: method lessons_path (line 359) | def lessons_path(self) -> Path: method append (line 362) | def append(self, lesson: LessonEntry) -> None: method append_many (line 367) | def append_many(self, lessons: list[LessonEntry]) -> None: method load_all (line 376) | def load_all(self) -> list[LessonEntry]: method query_for_stage (line 392) | def query_for_stage( method build_overlay (line 416) | def build_overlay( method count (line 476) | def count(self) -> int: method export_to_memory (line 480) | def export_to_memory(self, memory_store: object) -> int: method get_lessons_for_stage_with_memory (line 523) | def get_lessons_for_stage_with_memory( FILE: researchclaw/experiment/agentic_sandbox.py function _next_container_name (line 29) | def _next_container_name() -> str: class AgenticResult (line 37) | class AgenticResult: class AgenticSandbox (line 51) | class AgenticSandbox: method __init__ (line 54) | def __init__( method run_agent_session (line 68) | def run_agent_session( method to_sandbox_result (line 165) | def to_sandbox_result(self, result: AgenticResult) -> SandboxResult: method _start_container (line 178) | def _start_container(self, container: str, workspace: Path) -> None: method _docker_exec (line 205) | def _docker_exec( method _build_agent_command (line 222) | def _build_agent_command(self, prompt: str) -> str: method _cleanup_container (line 245) | def _cleanup_container(self, container: str) -> None: method _collect_outputs (line 267) | def _collect_outputs(workspace: Path) -> tuple[list[str], list[str]]: method _parse_result_metrics (line 282) | def _parse_result_metrics( method _count_agent_steps (line 311) | def _count_agent_steps(stdout: str) -> int: method check_docker_available (line 336) | def check_docker_available() -> bool: FILE: researchclaw/experiment/code_agent.py class CodeAgentResult (line 40) | class CodeAgentResult: method ok (line 50) | def ok(self) -> bool: class CodeAgentProvider (line 58) | class CodeAgentProvider(Protocol): method name (line 62) | def name(self) -> str: ... method generate (line 64) | def generate( method refine (line 79) | def refine( method repair (line 94) | def repair( function _to_text (line 110) | def _to_text(value: str | bytes | None) -> str: function _collect_py_files (line 118) | def _collect_py_files(workdir: Path) -> dict[str, str]: function _seed_workdir (line 128) | def _seed_workdir(workdir: Path, files: dict[str, str]) -> None: function format_feedback_for_agent (line 135) | def format_feedback_for_agent( class LlmCodeAgent (line 162) | class LlmCodeAgent: method __init__ (line 170) | def __init__( method name (line 181) | def name(self) -> str: method generate (line 184) | def generate( method refine (line 265) | def refine( method repair (line 332) | def repair( class _CliAgentBase (line 386) | class _CliAgentBase: method __init__ (line 391) | def __init__( method name (line 406) | def name(self) -> str: method _run_subprocess (line 409) | def _run_subprocess( method _build_result (line 457) | def _build_result( method _generate_prompt (line 482) | def _generate_prompt( method _refine_prompt (line 509) | def _refine_prompt( method _repair_prompt (line 538) | def _repair_prompt( class ClaudeCodeAgent (line 561) | class ClaudeCodeAgent(_CliAgentBase): method _build_cmd (line 566) | def _build_cmd(self, prompt: str, workdir: Path) -> list[str]: method generate (line 582) | def generate( method refine (line 603) | def refine( method repair (line 626) | def repair( class CodexAgent (line 647) | class CodexAgent(_CliAgentBase): method _build_cmd (line 652) | def _build_cmd(self, prompt: str, workdir: Path) -> list[str]: method generate (line 665) | def generate( method refine (line 686) | def refine( method repair (line 709) | def repair( function create_code_agent (line 730) | def create_code_agent( FILE: researchclaw/experiment/colab_sandbox.py class ColabDriveSandbox (line 120) | class ColabDriveSandbox: method __init__ (line 126) | def __init__(self, config: ColabDriveConfig, workdir: Path) -> None: method run (line 141) | def run(self, code: str, *, timeout_sec: int = 300) -> SandboxResult: method run_project (line 155) | def run_project( method check_drive_available (line 213) | def check_drive_available(config: ColabDriveConfig) -> tuple[bool, str]: method write_worker_notebook (line 230) | def write_worker_notebook(output_path: Path) -> None: method _inject_harness (line 236) | def _inject_harness(target_dir: Path) -> None: method _write_setup_script (line 244) | def _write_setup_script(self, staging: Path) -> None: method _submit_and_wait (line 257) | def _submit_and_wait( method _collect_result (line 311) | def _collect_result( FILE: researchclaw/experiment/docker_sandbox.py function _next_container_name (line 39) | def _next_container_name() -> str: class DockerSandbox (line 92) | class DockerSandbox: method __init__ (line 110) | def __init__(self, config: DockerSandboxConfig, workdir: Path) -> None: method run (line 120) | def run(self, code: str, *, timeout_sec: int = 300) -> SandboxResult: method run_project (line 134) | def run_project( method check_docker_available (line 198) | def check_docker_available() -> bool: method check_nvidia_runtime (line 212) | def check_nvidia_runtime() -> bool: method ensure_image (line 228) | def ensure_image(image: str) -> bool: method _inject_harness (line 242) | def _inject_harness(target_dir: Path) -> None: method _execute (line 255) | def _execute( method _build_run_command (line 345) | def _build_run_command( method _write_requirements_txt (line 452) | def _write_requirements_txt(self, staging_dir: Path) -> None: method _detect_pip_packages (line 501) | def _detect_pip_packages(staging_dir: Path) -> list[str]: method _kill_container (line 529) | def _kill_container(name: str) -> None: method _remove_container (line 541) | def _remove_container(name: str) -> None: FILE: researchclaw/experiment/evaluators/convergence.py class ConvergenceResult (line 20) | class ConvergenceResult: class ConvergenceReport (line 32) | class ConvergenceReport: function compute_convergence_order (line 39) | def compute_convergence_order( function analyze_convergence (line 97) | def analyze_convergence( FILE: researchclaw/experiment/factory.py function create_sandbox (line 18) | def create_sandbox(config: ExperimentConfig, workdir: Path) -> SandboxPr... function create_agentic_sandbox (line 93) | def create_agentic_sandbox( FILE: researchclaw/experiment/git_manager.py class ExperimentGitManager (line 14) | class ExperimentGitManager: method __init__ (line 21) | def __init__(self, repo_dir: Path) -> None: method create_experiment_branch (line 26) | def create_experiment_branch(self, tag: str) -> str: method commit_experiment (line 35) | def commit_experiment( method discard_experiment (line 57) | def discard_experiment(self, run_id: str, reason: str) -> bool: method get_experiment_history (line 65) | def get_experiment_history(self) -> list[dict[str, str]]: method is_git_repo (line 78) | def is_git_repo(self) -> bool: method get_current_branch (line 83) | def get_current_branch(self) -> str: method return_to_original_branch (line 88) | def return_to_original_branch(self) -> bool: method get_experiment_diff (line 99) | def get_experiment_diff(self) -> str: method clean_untracked (line 106) | def clean_untracked(self) -> bool: method _run_git (line 111) | def _run_git(self, args: list[str]) -> subprocess.CompletedProcess[str... method _format_commit_message (line 126) | def _format_commit_message( method _clean_output (line 133) | def _clean_output(output: str) -> str: method _parse_experiment_log_line (line 137) | def _parse_experiment_log_line(line: str) -> dict[str, str] | None: method _log_git_failure (line 146) | def _log_git_failure( method _detect_current_branch (line 160) | def _detect_current_branch(self) -> str | None: FILE: researchclaw/experiment/harness_template.py class ExperimentHarness (line 20) | class ExperimentHarness: method __init__ (line 23) | def __init__(self, time_budget: int = 120): method elapsed (line 32) | def elapsed(self) -> float: method progress (line 37) | def progress(self) -> float: method should_stop (line 41) | def should_stop(self) -> bool: method check_value (line 45) | def check_value(self, value: float, name: str = "metric") -> bool: method report_metric (line 64) | def report_metric(self, name: str, value: float) -> None: method log_result (line 83) | def log_result(self, result_dict: dict[str, object]) -> None: method finalize (line 87) | def finalize(self) -> None: method step (line 105) | def step(self) -> None: function get_harness (line 114) | def get_harness(time_budget: int = 120) -> ExperimentHarness: FILE: researchclaw/experiment/metrics.py class MetricType (line 27) | class MetricType(str, Enum): class ExperimentResults (line 38) | class ExperimentResults: method to_flat_metrics (line 66) | def to_flat_metrics(self) -> dict[str, float]: class UniversalMetricParser (line 103) | class UniversalMetricParser: method parse (line 113) | def parse(self, run_dir: Path, stdout: str = "") -> ExperimentResults: method _parse_json (line 155) | def _parse_json(self, path: Path) -> ExperimentResults: method _parse_csv (line 209) | def _parse_csv(self, path: Path) -> ExperimentResults: method _parse_stdout (line 253) | def _parse_stdout(self, stdout: str) -> ExperimentResults: FILE: researchclaw/experiment/runner.py class ExperimentResult (line 20) | class ExperimentResult: class ExperimentHistory (line 35) | class ExperimentHistory: method add (line 40) | def add(self, result: ExperimentResult) -> None: method to_dict (line 45) | def to_dict(self) -> dict[str, object]: method from_dict (line 53) | def from_dict(cls, data: dict[str, object]) -> ExperimentHistory: class _ChatResponse (line 88) | class _ChatResponse(Protocol): class _ChatClient (line 92) | class _ChatClient(Protocol): method chat (line 93) | def chat( class _GitManager (line 97) | class _GitManager(Protocol): method is_git_repo (line 98) | def is_git_repo(self) -> bool: ... method create_experiment_branch (line 99) | def create_experiment_branch(self, tag: str) -> str: ... method commit_experiment (line 100) | def commit_experiment(self, run_id: str, metrics: dict[str, object], d... method discard_experiment (line 101) | def discard_experiment(self, run_id: str, reason: str) -> bool: ... method return_to_original_branch (line 102) | def return_to_original_branch(self) -> bool: ... class ExperimentRunner (line 104) | class ExperimentRunner: method __init__ (line 105) | def __init__( method run_experiment (line 128) | def run_experiment( method run_loop (line 181) | def run_loop( method _improve_code (line 239) | def _improve_code( method save_history (line 283) | def save_history(self, path: Path) -> None: method _is_improvement (line 289) | def _is_improvement(self, new_value: float, best_value: float) -> bool: method _to_float (line 295) | def _to_float(value: object) -> float | None: method _extract_python_code (line 308) | def _extract_python_code(content: str) -> str: function _result_from_dict (line 315) | def _result_from_dict(data: dict[str, object]) -> ExperimentResult | None: FILE: researchclaw/experiment/sandbox.py function validate_entry_point (line 21) | def validate_entry_point(entry_point: str) -> str | None: function validate_entry_point_resolved (line 37) | def validate_entry_point_resolved(staging: Path, entry_point: str) -> st... function _to_text (line 79) | def _to_text(value: str | bytes | None) -> str: function parse_metrics (line 87) | def parse_metrics(stdout: str) -> dict[str, float]: function extract_paired_comparisons (line 199) | def extract_paired_comparisons(stdout: str) -> list[dict[str, object]]: function detect_nan_divergence (line 237) | def detect_nan_divergence(stdout: str, stderr: str) -> str | None: class SandboxResult (line 280) | class SandboxResult: class SandboxProtocol (line 289) | class SandboxProtocol(Protocol): method run (line 292) | def run(self, code: str, *, timeout_sec: int = 300) -> SandboxResult: ... method run_project (line 294) | def run_project( class ExperimentSandbox (line 303) | class ExperimentSandbox: method __init__ (line 304) | def __init__(self, config: SandboxConfig, workdir: Path) -> None: method run (line 310) | def run(self, code: str, *, timeout_sec: int = 300) -> SandboxResult: method run_project (line 347) | def run_project( method _inject_harness (line 442) | def _inject_harness(target_dir: Path) -> None: method _next_script_path (line 452) | def _next_script_path(self) -> Path: method _write_script (line 457) | def _write_script(script_path: Path, code: str) -> None: method _build_command (line 460) | def _build_command(self, script_path: Path) -> list[str]: method _result_from_completed (line 472) | def _result_from_completed( method _result_from_timeout (line 485) | def _result_from_timeout( method _result_from_exception (line 505) | def _result_from_exception(exc: Exception, *, elapsed_sec: float) -> S... method _should_cleanup (line 516) | def _should_cleanup(result: SandboxResult) -> bool: method _cleanup_script (line 520) | def _cleanup_script(script_path: Path) -> None: FILE: researchclaw/experiment/ssh_sandbox.py class SshRemoteSandbox (line 30) | class SshRemoteSandbox: method __init__ (line 45) | def __init__(self, config: SshRemoteConfig, workdir: Path) -> None: method run (line 55) | def run(self, code: str, *, timeout_sec: int = 300) -> SandboxResult: method run_project (line 68) | def run_project( method check_ssh_available (line 129) | def check_ssh_available(config: SshRemoteConfig) -> tuple[bool, str]: method _inject_harness (line 148) | def _inject_harness(target_dir: Path) -> None: method _execute (line 160) | def _execute( method _build_bare_exec_cmd (line 244) | def _build_bare_exec_cmd( method _build_docker_exec_cmd (line 276) | def _build_docker_exec_cmd( method _ssh_run (line 315) | def _ssh_run( method _scp_upload (line 355) | def _scp_upload(self, local_dir: Path, remote_dir: str) -> bool: class _SshResult (line 390) | class _SshResult: method __init__ (line 393) | def __init__( function _ssh_target (line 406) | def _ssh_target(cfg: SshRemoteConfig) -> str: function _build_ssh_base (line 413) | def _build_ssh_base( FILE: researchclaw/experiment/validator.py class ValidationIssue (line 21) | class ValidationIssue: class CodeValidation (line 32) | class CodeValidation: method ok (line 38) | def ok(self) -> bool: method errors (line 42) | def errors(self) -> list[ValidationIssue]: method warnings (line 46) | def warnings(self) -> list[ValidationIssue]: method summary (line 49) | def summary(self) -> str: class _SecurityVisitor (line 209) | class _SecurityVisitor(ast.NodeVisitor): method __init__ (line 212) | def __init__(self) -> None: method visit_Call (line 217) | def visit_Call(self, node: ast.Call) -> None: method visit_Import (line 243) | def visit_Import(self, node: ast.Import) -> None: method visit_ImportFrom (line 257) | def visit_ImportFrom(self, node: ast.ImportFrom) -> None: function _resolve_call_name (line 272) | def _resolve_call_name(node: ast.expr) -> str: function extract_imports (line 289) | def extract_imports(code: str) -> set[str]: function validate_syntax (line 314) | def validate_syntax(code: str) -> CodeValidation: function validate_security (line 332) | def validate_security(code: str) -> CodeValidation: function validate_imports (line 346) | def validate_imports( function validate_code (line 372) | def validate_code( function format_issues_for_llm (line 412) | def format_issues_for_llm(validation: CodeValidation) -> str: function check_code_complexity (line 430) | def check_code_complexity(code: str) -> list[str]: function check_class_quality (line 497) | def check_class_quality(all_files: dict[str, str]) -> list[str]: function check_variable_scoping (line 698) | def check_variable_scoping(code: str, fname: str = "main.py") -> list[str]: function _collect_if_only_assignments (line 748) | def _collect_if_only_assignments( function _extract_assign_targets (line 760) | def _extract_assign_targets(node: ast.AST) -> list[str]: function auto_fix_unbound_locals (line 776) | def auto_fix_unbound_locals(code: str) -> tuple[str, int]: function check_api_correctness (line 855) | def check_api_correctness(code: str, fname: str = "main.py") -> list[str]: function check_undefined_calls (line 945) | def check_undefined_calls(code: str, fname: str = "main.py") -> list[str]: function check_filename_collisions (line 1069) | def check_filename_collisions(files: dict[str, str]) -> list[str]: function deep_validate_files (line 1099) | def deep_validate_files( FILE: researchclaw/experiment/visualize.py function _is_excluded_metric (line 68) | def _is_excluded_metric(name: str) -> bool: function _shorten_label (line 76) | def _shorten_label(name: str, max_len: int = 22) -> str: function _format_cond_name (line 83) | def _format_cond_name(name: str) -> str: function _ensure_dir (line 88) | def _ensure_dir(path: Path) -> Path: function _setup_academic_style (line 93) | def _setup_academic_style() -> None: function plot_condition_comparison (line 121) | def plot_condition_comparison( function plot_metric_heatmap (line 201) | def plot_metric_heatmap( function plot_ablation_deltas (line 293) | def plot_ablation_deltas( function plot_metric_trajectory (line 389) | def plot_metric_trajectory( function plot_experiment_comparison (line 455) | def plot_experiment_comparison( function plot_pipeline_timeline (line 517) | def plot_pipeline_timeline( function plot_iteration_scores (line 564) | def plot_iteration_scores( function generate_all_charts (line 611) | def generate_all_charts( FILE: researchclaw/hardware.py class HardwareProfile (line 30) | class HardwareProfile: method to_dict (line 40) | def to_dict(self) -> dict[str, object]: function detect_hardware (line 44) | def detect_hardware() -> HardwareProfile: function _detect_nvidia (line 76) | def _detect_nvidia() -> HardwareProfile | None: function _detect_mps (line 128) | def _detect_mps() -> HardwareProfile | None: function ensure_torch_available (line 165) | def ensure_torch_available(python_path: str, gpu_type: str) -> bool: function is_metric_name (line 218) | def is_metric_name(name: str) -> bool: FILE: researchclaw/health.py class CheckResult (line 27) | class CheckResult: class DoctorReport (line 35) | class DoctorReport: method actionable_fixes (line 41) | def actionable_fixes(self) -> list[str]: method to_dict (line 44) | def to_dict(self) -> dict[str, object]: function check_python_version (line 61) | def check_python_version() -> CheckResult: function check_yaml_import (line 87) | def check_yaml_import() -> CheckResult: function check_config_valid (line 100) | def check_config_valid(config_path: str | Path) -> CheckResult: function _models_url (line 151) | def _models_url(base_url: str) -> str: function _is_timeout (line 155) | def _is_timeout(exc: BaseException) -> bool: function check_llm_connectivity (line 164) | def check_llm_connectivity(base_url: str) -> CheckResult: function _fetch_models (line 250) | def _fetch_models(base_url: str, api_key: str = "") -> tuple[int, dict[s... function _read_response_bytes (line 264) | def _read_response_bytes(response: object) -> bytes: function _urlopen (line 277) | def _urlopen(req: str | urllib.request.Request, timeout: int) -> Context... function _load_yaml_object (line 281) | def _load_yaml_object(content: str) -> object: function _load_json_mapping (line 285) | def _load_json_mapping(content: str) -> Mapping[object, object]: function check_api_key_valid (line 292) | def check_api_key_valid(base_url: str, api_key: str) -> CheckResult: function check_model_available (line 346) | def check_model_available(base_url: str, api_key: str, model: str) -> Ch... function check_model_chain (line 371) | def check_model_chain( function _check_models_against_endpoint (line 423) | def _check_models_against_endpoint( function check_sandbox_python (line 464) | def check_sandbox_python(python_path: str) -> CheckResult: function check_matplotlib (line 488) | def check_matplotlib() -> CheckResult: function check_experiment_mode (line 501) | def check_experiment_mode(mode: str) -> CheckResult: function check_acp_agent (line 516) | def check_acp_agent(agent_command: str) -> CheckResult: function check_docker_runtime (line 533) | def check_docker_runtime(config: RCConfig) -> CheckResult: function run_doctor (line 561) | def run_doctor(config_path: str | Path) -> DoctorReport: function print_doctor_report (line 624) | def print_doctor_report(report: DoctorReport) -> None: function write_doctor_report (line 648) | def write_doctor_report(report: DoctorReport, path: Path) -> None: FILE: researchclaw/knowledge/base.py function _utcnow_iso (line 23) | def _utcnow_iso() -> str: class KBEntry (line 33) | class KBEntry: function _markdown_frontmatter (line 54) | def _markdown_frontmatter(entry: KBEntry) -> str: function _obsidian_enhancements (line 74) | def _obsidian_enhancements(entry: KBEntry) -> str: function write_kb_entry (line 86) | def write_kb_entry( function write_stage_to_kb (line 146) | def write_stage_to_kb( function generate_weekly_report (line 213) | def generate_weekly_report( FILE: researchclaw/knowledge/graph/builder.py class KnowledgeGraphBuilder (line 16) | class KnowledgeGraphBuilder: method __init__ (line 23) | def __init__(self, max_entities: int = 10000) -> None: method entity_count (line 29) | def entity_count(self) -> int: method relation_count (line 34) | def relation_count(self) -> int: method add_entity (line 38) | def add_entity(self, entity: Entity) -> bool: method add_relation (line 66) | def add_relation(self, relation: Relation) -> bool: method get_entity (line 94) | def get_entity(self, entity_id: str) -> Entity | None: method get_entities_by_type (line 98) | def get_entities_by_type(self, entity_type: EntityType) -> list[Entity]: method get_relations_for (line 104) | def get_relations_for( method remove_entity (line 126) | def remove_entity(self, entity_id: str) -> bool: method add_paper (line 138) | def add_paper( method add_method (line 175) | def add_method( method add_dataset (line 191) | def add_dataset( method save (line 207) | def save(self, path: str | Path) -> None: method load (line 230) | def load(self, path: str | Path) -> int: FILE: researchclaw/knowledge/graph/entities.py class EntityType (line 10) | class EntityType(str, Enum): class Entity (line 22) | class Entity: method to_dict (line 37) | def to_dict(self) -> dict[str, Any]: method from_dict (line 44) | def from_dict(cls, data: dict[str, Any]) -> Entity: FILE: researchclaw/knowledge/graph/query.py class KnowledgeGraphQuery (line 16) | class KnowledgeGraphQuery: method __init__ (line 23) | def __init__(self, graph: KnowledgeGraphBuilder) -> None: method find_research_gaps (line 26) | def find_research_gaps(self, domain: str = "") -> list[str]: method find_trending_methods (line 60) | def find_trending_methods(self, min_citations: int = 2) -> list[str]: method get_method_comparison (line 91) | def get_method_comparison( method suggest_topics (line 144) | def suggest_topics( method _find_method (line 197) | def _find_method(self, name_or_id: str) -> Any: method _get_datasets_for_method (line 208) | def _get_datasets_for_method(self, method_id: str) -> dict[str, Any]: FILE: researchclaw/knowledge/graph/relations.py class RelationType (line 10) | class RelationType(str, Enum): class Relation (line 24) | class Relation: method to_dict (line 39) | def to_dict(self) -> dict[str, Any]: method from_dict (line 46) | def from_dict(cls, data: dict[str, Any]) -> Relation: FILE: researchclaw/knowledge/graph/visualizer.py function export_to_dot (line 26) | def export_to_dot(graph: KnowledgeGraphBuilder, path: str | Path) -> None: function export_to_json_cytoscape (line 59) | def export_to_json_cytoscape( function graph_summary (line 102) | def graph_summary(graph: KnowledgeGraphBuilder) -> str: FILE: researchclaw/literature/arxiv_client.py function _reset_circuit_breaker (line 54) | def _reset_circuit_breaker() -> None: function _cb_should_allow (line 66) | def _cb_should_allow() -> bool: function _cb_on_success (line 81) | def _cb_on_success() -> None: function _cb_on_failure (line 91) | def _cb_on_failure() -> bool: function _get_client (line 117) | def _get_client() -> arxiv.Client: function search_arxiv (line 134) | def search_arxiv( function get_paper_by_id (line 206) | def get_paper_by_id(arxiv_id: str) -> Paper | None: function download_pdf (line 221) | def download_pdf( function search_arxiv_advanced (line 261) | def search_arxiv_advanced( function _convert_result (line 296) | def _convert_result(result: arxiv.Result) -> Paper: FILE: researchclaw/literature/cache.py function _cache_dir (line 32) | def _cache_dir(base: Path | None = None) -> Path: function cache_key (line 38) | def cache_key(query: str, source: str, limit: int) -> str: function get_cached (line 44) | def get_cached( function _format_age (line 87) | def _format_age(seconds: float) -> str: function put_cache (line 98) | def put_cache( function clear_cache (line 122) | def clear_cache(*, cache_base: Path | None = None) -> int: function cache_stats (line 132) | def cache_stats(*, cache_base: Path | None = None) -> dict[str, Any]: FILE: researchclaw/literature/models.py class Author (line 16) | class Author: method last_name (line 22) | def last_name(self) -> str: class Paper (line 33) | class Paper: method cite_key (line 58) | def cite_key(self) -> str: method to_bibtex (line 78) | def to_bibtex(self) -> str: method to_dict (line 158) | def to_dict(self) -> dict[str, object]: FILE: researchclaw/literature/novelty.py function _extract_keywords (line 133) | def _extract_keywords(text: str) -> list[str]: function _jaccard_keywords (line 150) | def _jaccard_keywords(keywords_a: list[str], keywords_b: list[str]) -> f... function _title_similarity (line 159) | def _title_similarity(title_a: str, title_b: str) -> float: function _compute_similarity (line 164) | def _compute_similarity( function check_novelty (line 185) | def check_novelty( function _build_novelty_queries (line 338) | def _build_novelty_queries(topic: str, hypotheses_text: str) -> list[str]: function _assess_novelty (line 359) | def _assess_novelty( FILE: researchclaw/literature/openalex_client.py function search_openalex (line 49) | def search_openalex( function _request_with_retry (line 126) | def _request_with_retry( function _reconstruct_abstract (line 206) | def _reconstruct_abstract(inverted_index: dict[str, list[int]] | None) -... function _parse_openalex_work (line 219) | def _parse_openalex_work(item: dict[str, Any]) -> Paper: FILE: researchclaw/literature/search.py function _cache_api (line 43) | def _cache_api() -> tuple[CacheGet, CachePut]: function _papers_to_dicts (line 48) | def _papers_to_dicts(papers: list[Paper]) -> list[dict[str, object]]: function _as_int (line 53) | def _as_int(value: object, default: int = 0) -> int: function _dicts_to_papers (line 66) | def _dicts_to_papers(dicts: list[dict[str, object]]) -> list[Paper]: function search_papers (line 104) | def search_papers( function search_papers_multi_query (line 233) | def search_papers_multi_query( function _normalise_title (line 272) | def _normalise_title(title: str) -> str: function _deduplicate (line 279) | def _deduplicate(papers: list[Paper]) -> list[Paper]: function papers_to_bibtex (line 361) | def papers_to_bibtex(papers: Sequence[Paper]) -> str: FILE: researchclaw/literature/semantic_scholar.py function _reset_circuit_breaker (line 63) | def _reset_circuit_breaker() -> None: function _cb_should_allow (line 75) | def _cb_should_allow() -> bool: function _cb_on_success (line 96) | def _cb_on_success() -> None: function _cb_on_429 (line 107) | def _cb_on_429() -> bool: function search_semantic_scholar (line 148) | def search_semantic_scholar( function _request_with_retry (line 220) | def _request_with_retry( function batch_fetch_papers (line 271) | def batch_fetch_papers( function _post_with_retry (line 336) | def _post_with_retry( function _parse_s2_paper (line 384) | def _parse_s2_paper(item: dict[str, Any]) -> Paper: FILE: researchclaw/literature/trends.py class LiteratureTrendAnalyzer (line 11) | class LiteratureTrendAnalyzer: method __init__ (line 14) | def __init__(self, search_client: Any = None): method get_daily_papers (line 17) | def get_daily_papers( method analyze_keyword_trends (line 47) | def analyze_keyword_trends( method find_emerging_topics (line 67) | def find_emerging_topics( FILE: researchclaw/literature/verify.py class VerifyStatus (line 43) | class VerifyStatus(str, Enum): class CitationResult (line 53) | class CitationResult: method to_dict (line 65) | def to_dict(self) -> dict[str, object]: class VerificationReport (line 87) | class VerificationReport: method integrity_score (line 98) | def integrity_score(self) -> float: method to_dict (line 105) | def to_dict(self) -> dict[str, object]: function parse_bibtex_entries (line 134) | def parse_bibtex_entries(bib_text: str) -> list[dict[str, str]]: function title_similarity (line 158) | def title_similarity(a: str, b: str) -> float: function verify_by_arxiv_id (line 183) | def verify_by_arxiv_id(arxiv_id: str, expected_title: str) -> CitationRe... function _verify_doi_datacite (line 277) | def _verify_doi_datacite(doi: str, expected_title: str) -> CitationResul... function verify_by_doi (line 358) | def verify_by_doi(doi: str, expected_title: str) -> CitationResult | None: function verify_by_openalex (line 454) | def verify_by_openalex(title: str) -> CitationResult | None: function _cache_key (line 540) | def _cache_key(title: str) -> str: function _read_cache (line 544) | def _read_cache(title: str) -> CitationResult | None: function _write_cache (line 563) | def _write_cache(title: str, result: CitationResult) -> None: function verify_by_title_search (line 577) | def verify_by_title_search( function verify_citations (line 663) | def verify_citations( function filter_verified_bibtex (line 867) | def filter_verified_bibtex( function annotate_paper_hallucinations (line 904) | def annotate_paper_hallucinations( FILE: researchclaw/llm/__init__.py function create_llm_client (line 41) | def create_llm_client(config: RCConfig) -> LLMClient | ACPClient: FILE: researchclaw/llm/acp_client.py class ACPConfig (line 36) | class ACPConfig: function _find_acpx (line 46) | def _find_acpx() -> str | None: class ACPClient (line 60) | class ACPClient: method __init__ (line 71) | def __init__(self, acp_config: ACPConfig) -> None: method from_rc_config (line 80) | def from_rc_config(cls, rc_config: Any) -> ACPClient: method chat (line 95) | def chat( method preflight (line 124) | def preflight(self) -> tuple[bool, str]: method close (line 143) | def close(self) -> None: method __del__ (line 161) | def __del__(self) -> None: method _atexit_cleanup (line 169) | def _atexit_cleanup(cls) -> None: method _resolve_acpx (line 184) | def _resolve_acpx(self) -> str | None: method _abs_cwd (line 191) | def _abs_cwd(self) -> str: method _ensure_session (line 194) | def _ensure_session(self) -> None: method _send_prompt (line 246) | def _send_prompt(self, prompt: str) -> str: method _force_reconnect (line 316) | def _force_reconnect(self) -> None: method _send_prompt_cli (line 324) | def _send_prompt_cli(self, acpx: str, prompt: str) -> str: method _send_prompt_via_file (line 345) | def _send_prompt_via_file(self, acpx: str, prompt: str) -> str: method _extract_response (line 388) | def _extract_response(raw_output: str | None) -> str: method _messages_to_prompt (line 425) | def _messages_to_prompt( FILE: researchclaw/llm/anthropic_adapter.py class AnthropicAdapter (line 31) | class AnthropicAdapter: method __init__ (line 34) | def __init__(self, base_url: str, api_key: str, timeout_sec: int = 300): method close (line 44) | def close(self) -> None: method chat_completion (line 53) | def chat_completion( FILE: researchclaw/llm/client.py class LLMResponse (line 45) | class LLMResponse: class LLMConfig (line 59) | class LLMConfig: class LLMClient (line 81) | class LLMClient: method __init__ (line 84) | def __init__(self, config: LLMConfig) -> None: method from_rc_config (line 90) | def from_rc_config(cls, rc_config: Any) -> LLMClient: method chat (line 146) | def chat( method preflight (line 208) | def preflight(self) -> tuple[bool, str]: method _call_with_retry (line 251) | def _call_with_retry( method _raw_call (line 322) | def _raw_call( function create_client_from_yaml (line 457) | def create_client_from_yaml(yaml_path: str | None = None) -> LLMClient: FILE: researchclaw/mcp/client.py class MCPClient (line 12) | class MCPClient: method __init__ (line 19) | def __init__(self, server_uri: str, transport: str = "stdio") -> None: method connect (line 27) | async def connect(self) -> None: method disconnect (line 32) | async def disconnect(self) -> None: method is_connected (line 38) | def is_connected(self) -> bool: method list_tools (line 43) | async def list_tools(self) -> list[dict[str, Any]]: method call_tool (line 55) | async def call_tool(self, name: str, arguments: dict[str, Any]) -> dic... method list_resources (line 63) | async def list_resources(self) -> list[dict[str, Any]]: method read_resource (line 70) | async def read_resource(self, uri: str) -> str: method _send_request (line 82) | async def _send_request(self, method: str, params: dict[str, Any]) -> ... FILE: researchclaw/mcp/registry.py class MCPServerRegistry (line 13) | class MCPServerRegistry: method __init__ (line 16) | def __init__(self) -> None: method register (line 19) | async def register(self, name: str, uri: str, transport: str = "stdio"... method unregister (line 27) | async def unregister(self, name: str) -> None: method get (line 33) | def get(self, name: str) -> MCPClient | None: method list_all (line 37) | def list_all(self) -> list[dict[str, Any]]: method close_all (line 44) | async def close_all(self) -> None: method count (line 50) | def count(self) -> int: FILE: researchclaw/mcp/server.py class ResearchClawMCPServer (line 15) | class ResearchClawMCPServer: method __init__ (line 22) | def __init__(self, config: Any = None) -> None: method get_tools (line 27) | def get_tools(self) -> list[dict[str, Any]]: method handle_tool_call (line 31) | async def handle_tool_call(self, name: str, arguments: dict[str, Any])... method _handle_run_pipeline (line 57) | async def _handle_run_pipeline(self, args: dict[str, Any]) -> dict[str... method _handle_get_status (line 67) | async def _handle_get_status(self, args: dict[str, Any]) -> dict[str, ... method _handle_get_results (line 80) | async def _handle_get_results(self, args: dict[str, Any]) -> dict[str,... method _handle_search_literature (line 90) | async def _handle_search_literature(self, args: dict[str, Any]) -> dic... method _handle_review_paper (line 99) | async def _handle_review_paper(self, args: dict[str, Any]) -> dict[str... method _handle_get_paper (line 107) | async def _handle_get_paper(self, args: dict[str, Any]) -> dict[str, A... method start (line 122) | async def start(self, transport: str = "stdio") -> None: method stop (line 127) | async def stop(self) -> None: method is_running (line 133) | def is_running(self) -> bool: FILE: researchclaw/mcp/tools.py function get_tool_schema (line 84) | def get_tool_schema(name: str) -> dict[str, Any] | None: function list_tool_names (line 92) | def list_tool_names() -> list[str]: FILE: researchclaw/mcp/transport.py class MCPTransport (line 14) | class MCPTransport(Protocol): method send (line 17) | async def send(self, message: dict[str, Any]) -> None: ... method receive (line 18) | async def receive(self) -> dict[str, Any]: ... method close (line 19) | async def close(self) -> None: ... class StdioTransport (line 22) | class StdioTransport: method __init__ (line 25) | def __init__(self) -> None: method start (line 29) | async def start(self) -> None: method send (line 40) | async def send(self, message: dict[str, Any]) -> None: method receive (line 49) | async def receive(self) -> dict[str, Any]: method close (line 67) | async def close(self) -> None: class SSETransport (line 73) | class SSETransport: method __init__ (line 79) | def __init__(self, host: str = "0.0.0.0", port: int = 3000) -> None: method start (line 84) | async def start(self) -> None: method send (line 89) | async def send(self, message: dict[str, Any]) -> None: method receive (line 93) | async def receive(self) -> dict[str, Any]: method close (line 97) | async def close(self) -> None: FILE: researchclaw/memory/decay.py function time_decay_weight (line 9) | def time_decay_weight( function confidence_update (line 45) | def confidence_update( FILE: researchclaw/memory/embeddings.py function _tokenize (line 25) | def _tokenize(text: str) -> list[str]: function _hash_token (line 30) | def _hash_token(token: str, dim: int = _TFIDF_DIM) -> int: class EmbeddingProvider (line 36) | class EmbeddingProvider: method __init__ (line 39) | def __init__( method backend (line 55) | def backend(self) -> str: method dimension (line 62) | def dimension(self) -> int: method _detect_backend (line 68) | def _detect_backend(self) -> None: method embed (line 94) | def embed(self, text: str) -> list[float]: method embed_batch (line 113) | def embed_batch(self, texts: list[str]) -> list[list[float]]: method _embed_api (line 131) | def _embed_api(self, text: str) -> list[float]: method _embed_local (line 157) | def _embed_local(self, text: str) -> list[float]: method _embed_tfidf (line 164) | def _embed_tfidf(self, text: str) -> list[float]: FILE: researchclaw/memory/experiment_memory.py class ExperimentMemory (line 17) | class ExperimentMemory: method __init__ (line 24) | def __init__( method record_hyperparams (line 34) | def record_hyperparams( method record_architecture (line 76) | def record_architecture( method record_training_trick (line 113) | def record_training_trick( method recall_best_configs (line 150) | def recall_best_configs( FILE: researchclaw/memory/ideation_memory.py class IdeationMemory (line 16) | class IdeationMemory: method __init__ (line 23) | def __init__( method record_topic_outcome (line 33) | def record_topic_outcome( method record_hypothesis (line 73) | def record_hypothesis( method recall_similar_topics (line 109) | def recall_similar_topics( method get_anti_patterns (line 142) | def get_anti_patterns(self) -> list[str]: FILE: researchclaw/memory/retriever.py function cosine_similarity (line 20) | def cosine_similarity(a: list[float], b: list[float]) -> float: class MemoryRetriever (line 43) | class MemoryRetriever: method __init__ (line 53) | def __init__( method recall (line 69) | def recall( method recall_by_text (line 134) | def recall_by_text( method format_for_prompt (line 159) | def format_for_prompt( FILE: researchclaw/memory/store.py class MemoryEntry (line 22) | class MemoryEntry: method to_dict (line 35) | def to_dict(self) -> dict[str, Any]: method from_dict (line 40) | def from_dict(cls, data: dict[str, Any]) -> MemoryEntry: class MemoryStore (line 58) | class MemoryStore: method __init__ (line 65) | def __init__( method store_dir (line 80) | def store_dir(self) -> Path: method add (line 84) | def add( method get (line 138) | def get(self, entry_id: str) -> MemoryEntry | None: method get_all (line 146) | def get_all(self, category: str | None = None) -> list[MemoryEntry]: method update_confidence (line 155) | def update_confidence(self, entry_id: str, delta: float) -> bool: method mark_accessed (line 185) | def mark_accessed(self, entry_id: str) -> bool: method prune (line 206) | def prune( method save (line 248) | def save(self) -> None: method load (line 262) | def load(self) -> int: method count (line 290) | def count(self, category: str | None = None) -> int: FILE: researchclaw/memory/writing_memory.py class WritingMemory (line 16) | class WritingMemory: method __init__ (line 23) | def __init__( method record_review_feedback (line 33) | def record_review_feedback( method record_successful_structure (line 68) | def record_successful_structure( method recall_writing_tips (line 104) | def recall_writing_tips( FILE: researchclaw/metaclaw_bridge/config.py class PRMConfig (line 9) | class PRMConfig: class LessonToSkillConfig (line 23) | class LessonToSkillConfig: class MetaClawBridgeConfig (line 32) | class MetaClawBridgeConfig: FILE: researchclaw/metaclaw_bridge/lesson_to_skill.py function _format_lessons (line 61) | def _format_lessons(lessons: list[LessonEntry]) -> str: function _list_existing_skill_names (line 72) | def _list_existing_skill_names(skills_dir: Path) -> list[str]: function _parse_skills_response (line 82) | def _parse_skills_response(text: str) -> list[dict[str, str]]: function _write_skill (line 109) | def _write_skill(skills_dir: Path, skill: dict[str, str]) -> Path | None: function _severity_at_least (line 132) | def _severity_at_least(severity: str, min_severity: str) -> bool: function convert_lessons_to_skills (line 137) | def convert_lessons_to_skills( FILE: researchclaw/metaclaw_bridge/prm_gate.py function _single_judge_call (line 61) | def _single_judge_call( class ResearchPRMGate (line 111) | class ResearchPRMGate: method __init__ (line 114) | def __init__( method from_bridge_config (line 129) | def from_bridge_config(cls, prm_config: object) -> ResearchPRMGate | N... method evaluate_stage (line 154) | def evaluate_stage( method should_gate (line 206) | def should_gate(self, stage_num: int) -> bool: FILE: researchclaw/metaclaw_bridge/session.py class MetaClawSession (line 15) | class MetaClawSession: method __init__ (line 18) | def __init__(self, run_id: str) -> None: method get_headers (line 23) | def get_headers(self, stage_name: str = "") -> dict[str, str]: method end (line 40) | def end(self) -> dict[str, str]: method is_active (line 55) | def is_active(self) -> bool: FILE: researchclaw/metaclaw_bridge/skill_feedback.py class SkillEffectivenessRecord (line 19) | class SkillEffectivenessRecord: class SkillFeedbackStore (line 29) | class SkillFeedbackStore: method __init__ (line 32) | def __init__(self, store_path: Path) -> None: method append (line 36) | def append(self, record: SkillEffectivenessRecord) -> None: method append_many (line 40) | def append_many(self, records: list[SkillEffectivenessRecord]) -> None: method load_all (line 48) | def load_all(self) -> list[SkillEffectivenessRecord]: method compute_skill_stats (line 71) | def compute_skill_stats(self) -> dict[str, dict[str, int | float]]: function record_stage_skills (line 98) | def record_stage_skills( FILE: researchclaw/metaclaw_bridge/stage_skill_map.py function get_stage_config (line 143) | def get_stage_config(stage_name: str) -> dict[str, Any]: FILE: researchclaw/overleaf/conflict.py class ConflictResolver (line 20) | class ConflictResolver: method has_conflicts (line 23) | def has_conflicts(self, repo_dir: Path) -> bool: method detect (line 31) | def detect(self, repo_dir: Path) -> list[dict[str, str]]: method resolve (line 42) | def resolve(self, repo_dir: Path, strategy: str = "ours") -> list[str]: function _extract_conflicts (line 60) | def _extract_conflicts(content: str) -> list[dict[str, str]]: function _resolve_content (line 87) | def _resolve_content(content: str, strategy: str) -> str: FILE: researchclaw/overleaf/formatter.py class LatexFormatter (line 9) | class LatexFormatter: method normalize_paths (line 13) | def normalize_paths(content: str, figures_prefix: str = "figures/") ->... method ensure_document_class (line 24) | def ensure_document_class(content: str) -> str: method strip_local_comments (line 31) | def strip_local_comments(content: str) -> str: method fix_encoding (line 40) | def fix_encoding(content: str) -> str: method format_for_overleaf (line 52) | def format_for_overleaf(self, tex_path: Path) -> str: FILE: researchclaw/overleaf/sync.py class OverleafSync (line 17) | class OverleafSync: method __init__ (line 20) | def __init__( method setup (line 35) | def setup(self, run_dir: Path) -> Path: method push_paper (line 47) | def push_paper( method pull_changes (line 91) | def pull_changes(self) -> list[str]: method get_status (line 110) | def get_status(self) -> dict[str, Any]: method resolve_conflicts (line 125) | def resolve_conflicts(self, strategy: str = "ours") -> list[str]: method _git (line 133) | def _git(self, *args: str) -> str: method _git_clone (line 146) | def _git_clone(self) -> None: FILE: researchclaw/overleaf/watcher.py class FileWatcher (line 13) | class FileWatcher: method __init__ (line 16) | def __init__(self, watch_dir: Path, extensions: tuple[str, ...] = (".t... method _take_snapshot (line 22) | def _take_snapshot(self) -> None: method check_changes (line 31) | def check_changes(self) -> list[str]: method poll_loop (line 55) | def poll_loop(self, interval_sec: int = 300, callback: Any = None) -> ... FILE: researchclaw/pipeline/_domain.py function _detect_domain (line 75) | def _detect_domain(topic: str, domains: tuple[str, ...] = ()) -> tuple[s... function _is_ml_domain (line 113) | def _is_ml_domain(domain_id: str) -> bool: FILE: researchclaw/pipeline/_helpers.py class StageResult (line 34) | class StageResult: function _utcnow_iso (line 151) | def _utcnow_iso() -> str: function _build_fallback_queries (line 160) | def _build_fallback_queries(topic: str) -> list[str]: function _write_stage_meta (line 235) | def _write_stage_meta( function _ensure_sandbox_deps (line 260) | def _ensure_sandbox_deps(code: str, python_path: str) -> list[str]: function _read_best_analysis (line 307) | def _read_best_analysis(run_dir: Path) -> str: function _read_prior_artifact (line 320) | def _read_prior_artifact(run_dir: Path, filename: str) -> str | None: function _find_prior_file (line 343) | def _find_prior_file(run_dir: Path, filename: str) -> Path | None: function _load_hardware_profile (line 362) | def _load_hardware_profile(run_dir: Path) -> dict[str, Any] | None: function _extract_yaml_block (line 379) | def _extract_yaml_block(text: str) -> str: function _safe_json_loads (line 430) | def _safe_json_loads(text: str, default: Any) -> Any: function _extract_code_block (line 501) | def _extract_code_block(content: str) -> str: function _extract_multi_file_blocks (line 508) | def _extract_multi_file_blocks(content: str) -> dict[str, str]: function _parse_jsonl_rows (line 590) | def _parse_jsonl_rows(text: str) -> list[dict[str, Any]]: function _write_jsonl (line 602) | def _write_jsonl(path: Path, rows: list[dict[str, Any]]) -> None: function _parse_metrics_from_stdout (line 608) | def _parse_metrics_from_stdout(stdout: str) -> dict[str, Any]: function _chat_with_prompt (line 663) | def _chat_with_prompt( function _get_evolution_overlay (line 715) | def _get_evolution_overlay(run_dir: Path | None, stage_name: str) -> str: function _collect_json_context (line 741) | def _collect_json_context( function _collect_experiment_results (line 775) | def _collect_experiment_results( function _build_context_preamble (line 918) | def _build_context_preamble( function _extract_topic_keywords (line 990) | def _extract_topic_keywords( function _topic_constraint_block (line 1016) | def _topic_constraint_block(topic: str) -> str: function _detect_runtime_issues (line 1046) | def _detect_runtime_issues(sandbox_result: Any) -> str: function _generate_neurips_checklist (line 1172) | def _generate_neurips_checklist( function _extract_paper_title (line 1220) | def _extract_paper_title(md_text: str) -> str: function _generate_framework_diagram_prompt (line 1308) | def _generate_framework_diagram_prompt( function _safe_filename (line 1439) | def _safe_filename(name: str) -> str: function _default_hypotheses (line 1450) | def _default_hypotheses(topic: str) -> str: function _default_paper_outline (line 1467) | def _default_paper_outline(topic: str) -> str: function _default_quality_report (line 1513) | def _default_quality_report(threshold: float) -> dict[str, Any]: function _multi_perspective_generate (line 1548) | def _multi_perspective_generate( function _synthesize_perspectives (line 1583) | def _synthesize_perspectives( function reconcile_figure_refs (line 1602) | def reconcile_figure_refs( FILE: researchclaw/pipeline/code_agent.py class CodeAgentConfig (line 42) | class CodeAgentConfig: class SolutionNode (line 85) | class SolutionNode: class CodeAgentResult (line 104) | class CodeAgentResult: class _SandboxResult (line 122) | class _SandboxResult(Protocol): # pragma: no cover class _SandboxLike (line 131) | class _SandboxLike(Protocol): # pragma: no cover method run_project (line 132) | def run_project( class CodeAgent (line 146) | class CodeAgent: method __init__ (line 166) | def __init__( method generate (line 192) | def generate( method _phase1_blueprint (line 283) | def _phase1_blueprint( method _build_domain_context (line 328) | def _build_domain_context(self) -> str: method _parse_blueprint (line 366) | def _parse_blueprint(self, yaml_text: str) -> dict[str, Any] | None: method _is_valid_blueprint (line 458) | def _is_valid_blueprint(blueprint: dict[str, Any]) -> bool: method _phase2_sequential_generate (line 472) | def _phase2_sequential_generate( method _extract_single_file_code (line 579) | def _extract_single_file_code(content: str, expected_name: str) -> str: method _build_code_summary (line 609) | def _build_code_summary( method _hard_validate_and_repair (line 657) | def _hard_validate_and_repair( method _hard_validate (line 707) | def _hard_validate( method _repair_critical_issues (line 872) | def _repair_critical_issues( method _phase2_generate_and_fix (line 940) | def _phase2_generate_and_fix( method _exec_fix_loop (line 962) | def _exec_fix_loop(self, files: dict[str, str]) -> dict[str, str]: method _generate_code (line 981) | def _generate_code( method _fix_runtime_error (line 1029) | def _fix_runtime_error( method _parse_error_location (line 1075) | def _parse_error_location( method _targeted_file_repair (line 1103) | def _targeted_file_repair( method _phase3_tree_search (line 1196) | def _phase3_tree_search( method _evaluate_node (line 1280) | def _evaluate_node(self, node: SolutionNode, metric_key: str) -> None: method _score_node (line 1299) | def _score_node(node: SolutionNode, metric_key: str) -> float: method _phase4_review (line 1316) | def _phase4_review( method _chat (line 1381) | def _chat(self, system: str, user: str, max_tokens: int = 8192) -> Any: method _get_or_create_sandbox (line 1391) | def _get_or_create_sandbox(self) -> _SandboxLike: method _run_in_sandbox (line 1401) | def _run_in_sandbox( method _extract_files (line 1439) | def _extract_files(self, content: str) -> dict[str, str]: method _format_files (line 1447) | def _format_files(files: dict[str, str]) -> str: method _parse_json (line 1455) | def _parse_json(text: str) -> dict[str, Any] | None: method _log_event (line 1488) | def _log_event(self, msg: str) -> None: class _SimpleResult (line 1500) | class _SimpleResult: FILE: researchclaw/pipeline/contracts.py class StageContract (line 19) | class StageContract: FILE: researchclaw/pipeline/executor.py function execute_stage (line 211) | def execute_stage( FILE: researchclaw/pipeline/experiment_diagnosis.py class DeficiencyType (line 23) | class DeficiencyType(enum.Enum): class Deficiency (line 43) | class Deficiency: class ExperimentDiagnosis (line 55) | class ExperimentDiagnosis: method has_critical (line 67) | def has_critical(self) -> bool: method to_repair_prompt (line 70) | def to_repair_prompt(self) -> str: method to_dict (line 93) | def to_dict(self) -> dict: class PaperMode (line 122) | class PaperMode(enum.Enum): class ExperimentQualityAssessment (line 132) | class ExperimentQualityAssessment: function assess_experiment_quality (line 142) | def assess_experiment_quality( function _select_paper_mode (line 190) | def _select_paper_mode( function diagnose_experiment (line 244) | def diagnose_experiment( function _check_missing_deps (line 344) | def _check_missing_deps(diag: ExperimentDiagnosis, output: str) -> None: function _check_permission_errors (line 368) | def _check_permission_errors(diag: ExperimentDiagnosis, output: str) -> ... function _check_gpu_oom (line 391) | def _check_gpu_oom(diag: ExperimentDiagnosis, output: str) -> None: function _check_time_guard (line 406) | def _check_time_guard( function _check_synthetic_data (line 435) | def _check_synthetic_data(diag: ExperimentDiagnosis, output: str) -> None: function _check_dataset_issues (line 459) | def _check_dataset_issues(diag: ExperimentDiagnosis, output: str) -> None: function _check_code_crashes (line 484) | def _check_code_crashes(diag: ExperimentDiagnosis, stderr: str, output: ... function _check_hyperparams (line 516) | def _check_hyperparams(diag: ExperimentDiagnosis, output: str, summary: ... function _check_near_random_accuracy (line 546) | def _check_near_random_accuracy(diag: ExperimentDiagnosis, summary: dict... function _check_identical_conditions (line 589) | def _check_identical_conditions(diag: ExperimentDiagnosis, summary: dict... function _check_insufficient_seeds (line 613) | def _check_insufficient_seeds(diag: ExperimentDiagnosis, summary: dict) ... function _get_planned_conditions (line 640) | def _get_planned_conditions(plan: dict | None, summary: dict) -> set[str]: function _get_completed_conditions (line 650) | def _get_completed_conditions(summary: dict) -> set[str]: function _extract_stdout (line 663) | def _extract_stdout(summary: dict, ref_log: dict | None) -> str: function _extract_stderr (line 682) | def _extract_stderr(summary: dict, ref_log: dict | None) -> str: function _extract_context (line 699) | def _extract_context(text: str, pattern: str, context_chars: int = 200) ... function _assess_repairability (line 709) | def _assess_repairability(diag: ExperimentDiagnosis, prior: list[dict] |... FILE: researchclaw/pipeline/experiment_repair.py class RepairCycleResult (line 49) | class RepairCycleResult: class ExperimentRepairResult (line 61) | class ExperimentRepairResult: method to_dict (line 71) | def to_dict(self) -> dict: function build_repair_prompt (line 94) | def build_repair_prompt( function select_best_results (line 196) | def select_best_results( function _try_load_summary (line 235) | def _try_load_summary(path: Path) -> dict | None: function _summary_quality_score (line 245) | def _summary_quality_score(summary: dict) -> float: function run_repair_loop (line 274) | def run_repair_loop( function _load_experiment_summary (line 503) | def _load_experiment_summary(run_dir: Path) -> dict | None: function _load_refinement_log (line 513) | def _load_refinement_log(run_dir: Path) -> dict | None: function _load_experiment_code (line 523) | def _load_experiment_code(run_dir: Path) -> dict[str, str]: function _load_experiment_plan (line 580) | def _load_experiment_plan(run_dir: Path) -> dict | None: function _collect_experiment_output (line 590) | def _collect_experiment_output(run_dir: Path) -> tuple[str, str]: function _get_repaired_code (line 616) | def _get_repaired_code( function _repair_via_opencode (line 641) | def _repair_via_opencode( function _repair_via_llm (line 689) | def _repair_via_llm( function _extract_code_blocks (line 737) | def _extract_code_blocks(text: str) -> dict[str, str]: function _run_experiment_in_sandbox (line 772) | def _run_experiment_in_sandbox( function _build_experiment_summary_from_run (line 809) | def _build_experiment_summary_from_run( FILE: researchclaw/pipeline/opencode_bridge.py class ComplexityScore (line 111) | class ComplexityScore: function _count_keyword_hits (line 120) | def _count_keyword_hits(text: str, keywords: tuple[str, ...]) -> int: function score_complexity (line 125) | def score_complexity( class OpenCodeResult (line 223) | class OpenCodeResult: class OpenCodeBridge (line 260) | class OpenCodeBridge: method __init__ (line 263) | def __init__( method check_available (line 285) | def check_available() -> bool: method _prepare_workspace (line 308) | def _prepare_workspace( method _is_azure (line 374) | def _is_azure(self) -> bool: method _build_opencode_config (line 381) | def _build_opencode_config(self) -> dict[str, Any]: method _resolve_opencode_model (line 431) | def _resolve_opencode_model(self) -> str: method _invoke_opencode (line 450) | def _invoke_opencode( method _collect_files (line 499) | def _collect_files(workspace: Path) -> dict[str, str]: method _has_main_guard (line 536) | def _has_main_guard(source: str) -> bool: method _ensure_main_entry_point (line 553) | def _ensure_main_entry_point(files: dict[str, str]) -> dict[str, str]: method generate (line 633) | def generate( function count_historical_failures (line 749) | def count_historical_failures(run_dir: Path, stage_name: str = "stage-10... FILE: researchclaw/pipeline/paper_verifier.py class UnverifiedNumber (line 101) | class UnverifiedNumber: class FabricatedCondition (line 112) | class FabricatedCondition: class VerificationResult (line 121) | class VerificationResult: method fabrication_rate (line 136) | def fabrication_rate(self) -> float: function verify_paper (line 143) | def verify_paper( function verify_paper_file (line 277) | def verify_paper_file( function _parse_sections (line 292) | def _parse_sections(tex_text: str) -> list[tuple[int, str]]: function _section_at_line (line 306) | def _section_at_line(sections: list[tuple[int, str]], line_idx: int) -> ... function _is_strict_section (line 323) | def _is_strict_section(section_lower: str, strict_set: set[str]) -> bool: function _find_table_ranges (line 342) | def _find_table_ranges(tex_text: str) -> list[tuple[int, int, bool]]: function _build_skip_mask (line 371) | def _build_skip_mask(tex_text: str) -> list[bool]: function _line_offset (line 382) | def _line_offset(lines: list[str], line_idx: int) -> int: function _check_condition_names (line 390) | def _check_condition_names( function _check_training_config (line 484) | def _check_training_config( function _build_summary (line 540) | def _build_summary(result: VerificationResult) -> str: FILE: researchclaw/pipeline/runner.py function _utcnow_iso (line 27) | def _utcnow_iso() -> str: function _should_start (line 33) | def _should_start(stage: Stage, from_stage: Stage, started: bool) -> bool: function _build_pipeline_summary (line 39) | def _build_pipeline_summary( function _write_pipeline_summary (line 66) | def _write_pipeline_summary(run_dir: Path, summary: dict[str, object]) -... function _write_checkpoint (line 73) | def _write_checkpoint(run_dir: Path, stage: Stage, run_id: str) -> None: function _write_heartbeat (line 93) | def _write_heartbeat(run_dir: Path, stage: Stage, run_id: str) -> None: function read_checkpoint (line 109) | def read_checkpoint(run_dir: Path) -> Stage | None: function resume_from_checkpoint (line 129) | def resume_from_checkpoint( function _collect_content_metrics (line 137) | def _collect_content_metrics(run_dir: Path | None) -> dict[str, object]: function _run_experiment_diagnosis (line 192) | def _run_experiment_diagnosis(run_dir: Path, config: RCConfig, run_id: s... function _run_experiment_repair (line 322) | def _run_experiment_repair(run_dir: Path, config: RCConfig, run_id: str)... function execute_pipeline (line 407) | def execute_pipeline( function _package_deliverables (line 646) | def _package_deliverables( function _version_rollback_stages (line 939) | def _version_rollback_stages( function _consecutive_empty_metrics (line 967) | def _consecutive_empty_metrics(run_dir: Path, pivot_count: int) -> bool: function _promote_best_stage14 (line 1001) | def _promote_best_stage14(run_dir: Path, config: RCConfig) -> None: function _check_experiment_quality (line 1117) | def _check_experiment_quality( function _read_pivot_count (line 1199) | def _read_pivot_count(run_dir: Path) -> int: function _record_decision_history (line 1213) | def _record_decision_history( function _read_quality_score (line 1241) | def _read_quality_score(run_dir: Path) -> float | None: function _write_iteration_context (line 1258) | def _write_iteration_context( function execute_iterative_pipeline (line 1273) | def execute_iterative_pipeline( function _metaclaw_post_pipeline (line 1399) | def _metaclaw_post_pipeline( FILE: researchclaw/pipeline/stage_impls/_analysis.py function _execute_result_analysis (line 34) | def _execute_result_analysis( function _parse_decision (line 736) | def _parse_decision(text: str) -> str: function _execute_research_decision (line 789) | def _execute_research_decision( FILE: researchclaw/pipeline/stage_impls/_code_generation.py function _check_rl_compatibility (line 46) | def _check_rl_compatibility(code: str) -> list[str]: function _execute_code_generation (line 67) | def _execute_code_generation( FILE: researchclaw/pipeline/stage_impls/_execution.py function _execute_resource_planning (line 44) | def _execute_resource_planning( function _execute_experiment_run (line 104) | def _execute_experiment_run( function _execute_iterative_refine (line 333) | def _execute_iterative_refine( FILE: researchclaw/pipeline/stage_impls/_experiment_design.py function _execute_experiment_design (line 34) | def _execute_experiment_design( FILE: researchclaw/pipeline/stage_impls/_literature.py function _expand_search_queries (line 41) | def _expand_search_queries(queries: list[str], topic: str) -> list[str]: function _execute_search_strategy (line 86) | def _execute_search_strategy( function _execute_literature_collect (line 318) | def _execute_literature_collect( function _execute_literature_screen (line 593) | def _execute_literature_screen( function _execute_knowledge_extract (line 708) | def _execute_knowledge_extract( FILE: researchclaw/pipeline/stage_impls/_paper_writing.py function _execute_paper_outline (line 40) | def _execute_paper_outline( function _collect_raw_experiment_metrics (line 129) | def _collect_raw_experiment_metrics(run_dir: Path) -> tuple[str, bool]: function _write_paper_sections (line 312) | def _write_paper_sections( function _validate_draft_quality (line 566) | def _validate_draft_quality( function _review_compiled_pdf (line 928) | def _review_compiled_pdf( function _check_ablation_effectiveness (line 1032) | def _check_ablation_effectiveness( function _detect_result_contradictions (line 1132) | def _detect_result_contradictions( function _execute_paper_draft (line 1207) | def _execute_paper_draft( FILE: researchclaw/pipeline/stage_impls/_review_publish.py function _get_collect_raw_experiment_metrics (line 50) | def _get_collect_raw_experiment_metrics(): function _get_review_compiled_pdf (line 55) | def _get_review_compiled_pdf(): function _collect_experiment_evidence (line 64) | def _collect_experiment_evidence(run_dir: Path) -> str: function _execute_peer_review (line 138) | def _execute_peer_review( function _execute_paper_revision (line 211) | def _execute_paper_revision( function _execute_quality_gate (line 370) | def _execute_quality_gate( function _execute_knowledge_archive (line 630) | def _execute_knowledge_archive( function _sanitize_fabricated_data (line 706) | def _sanitize_fabricated_data( function _load_seminal_papers_by_key (line 1168) | def _load_seminal_papers_by_key() -> dict[str, dict]: function _seminal_to_bibtex (line 1185) | def _seminal_to_bibtex(paper: dict, cite_key: str) -> str: function _resolve_missing_citations (line 1218) | def _resolve_missing_citations( function _execute_export_publish (line 1411) | def _execute_export_publish( function _check_citation_relevance (line 2492) | def _check_citation_relevance( function _remove_bibtex_entries (line 2544) | def _remove_bibtex_entries(bib_text: str, keys_to_remove: set[str]) -> str: function _remove_citations_from_text (line 2569) | def _remove_citations_from_text(text: str, keys_to_remove: set[str]) -> ... function _execute_citation_verify (line 2592) | def _execute_citation_verify( FILE: researchclaw/pipeline/stage_impls/_synthesis.py function _execute_synthesis (line 29) | def _execute_synthesis( function _execute_hypothesis_gen (line 90) | def _execute_hypothesis_gen( FILE: researchclaw/pipeline/stage_impls/_topic.py function _execute_topic_init (line 28) | def _execute_topic_init( function _execute_problem_decompose (line 115) | def _execute_problem_decompose( FILE: researchclaw/pipeline/stages.py class Stage (line 22) | class Stage(IntEnum): class StageStatus (line 65) | class StageStatus(str, Enum): class TransitionEvent (line 77) | class TransitionEvent(str, Enum): class TransitionOutcome (line 204) | class TransitionOutcome: function gate_required (line 213) | def gate_required( function default_rollback_stage (line 225) | def default_rollback_stage(stage: Stage) -> Stage: function advance (line 230) | def advance( FILE: researchclaw/pipeline/verified_registry.py class ConditionResult (line 39) | class ConditionResult: method compute_stats (line 49) | def compute_stats(self) -> None: class VerifiedRegistry (line 64) | class VerifiedRegistry: method add_value (line 75) | def add_value(self, value: float, source: str) -> None: method _add_variants (line 83) | def _add_variants(self, value: float, source: str) -> None: method is_verified (line 107) | def is_verified(self, number: float, tolerance: float = 0.01) -> bool: method lookup (line 119) | def lookup(self, number: float, tolerance: float = 0.01) -> str | None: method verify_condition (line 131) | def verify_condition(self, name: str) -> bool: method from_experiment (line 136) | def from_experiment( method from_run_dir (line 246) | def from_run_dir( method from_files (line 350) | def from_files( function _merge_into (line 367) | def _merge_into(target: VerifiedRegistry, source: VerifiedRegistry) -> N... function _enrich_from_refinement_log (line 396) | def _enrich_from_refinement_log(reg: VerifiedRegistry, refinement_log: d... function _extract_primary_metric (line 435) | def _extract_primary_metric(metrics: dict) -> float | None: function _is_finite (line 443) | def _is_finite(value: Any) -> bool: FILE: researchclaw/project/idea_pool.py class IdeaPool (line 16) | class IdeaPool: method __init__ (line 19) | def __init__(self, pool_path: str | Path) -> None: method _load (line 26) | def _load(self) -> None: method _save (line 37) | def _save(self) -> None: method add (line 46) | def add(self, title: str, description: str, domains: list[str] | None ... method remove (line 60) | def remove(self, idea_id: str) -> None: method get (line 67) | def get(self, idea_id: str) -> Idea: method evaluate (line 75) | def evaluate(self, idea_id: str, feasibility: float, novelty: float) -... method rank (line 89) | def rank(self) -> list[Idea]: method to_project (line 95) | def to_project(self, idea_id: str, config_path: str, projects_dir: str... method list_all (line 110) | def list_all(self) -> list[Idea]: FILE: researchclaw/project/manager.py class ProjectManager (line 18) | class ProjectManager: method __init__ (line 21) | def __init__(self, projects_dir: str | Path) -> None: method _registry_path (line 29) | def _registry_path(self) -> Path: method _load_registry (line 32) | def _load_registry(self) -> None: method _save_registry (line 46) | def _save_registry(self) -> None: method create (line 59) | def create( method delete (line 97) | def delete(self, name: str) -> None: method get (line 107) | def get(self, name: str) -> Project: method list_all (line 113) | def list_all(self) -> list[Project]: method get_status (line 117) | def get_status(self) -> dict[str, Any]: method switch (line 132) | def switch(self, name: str) -> Project: method active (line 141) | def active(self) -> Project | None: method compare (line 149) | def compare(self, name_a: str, name_b: str) -> dict[str, Any]: method start_run (line 161) | def start_run(self, name: str, run_id: str) -> str: method finish_run (line 169) | def finish_run(self, name: str, status: str, metrics: dict[str, Any] |... function _count_by (line 178) | def _count_by(projects: list[Project], attr: str) -> dict[str, int]: function _metric_diff (line 186) | def _metric_diff(a: dict[str, Any], b: dict[str, Any]) -> dict[str, Any]: FILE: researchclaw/project/models.py class Project (line 11) | class Project: method to_dict (line 23) | def to_dict(self) -> dict[str, Any]: method from_dict (line 37) | def from_dict(cls, data: dict[str, Any]) -> Project: class Idea (line 57) | class Idea: method score (line 70) | def score(self) -> float: method to_dict (line 74) | def to_dict(self) -> dict[str, Any]: method from_dict (line 88) | def from_dict(cls, data: dict[str, Any]) -> Idea: FILE: researchclaw/project/scheduler.py class _QueueEntry (line 16) | class _QueueEntry: class ProjectScheduler (line 23) | class ProjectScheduler: method __init__ (line 26) | def __init__(self, manager: ProjectManager, max_concurrent: int = 2) -... method enqueue (line 32) | def enqueue(self, project_name: str, priority: int = 0) -> None: method dequeue (line 47) | def dequeue(self) -> str | None: method next (line 54) | def next(self) -> str | None: method can_start (line 63) | def can_start(self) -> bool: method mark_done (line 67) | def mark_done(self, project_name: str) -> None: method queue_size (line 72) | def queue_size(self) -> int: method running_count (line 77) | def running_count(self) -> int: method get_status (line 81) | def get_status(self) -> dict[str, Any]: FILE: researchclaw/prompts.py function _render (line 51) | def _render(template: str, variables: dict[str, str]) -> str: class RenderedPrompt (line 73) | class RenderedPrompt: class PromptManager (line 87) | class PromptManager: method __init__ (line 90) | def __init__(self, overrides_path: str | Path | None = None) -> None: method _load_overrides (line 104) | def _load_overrides(self, path: Path) -> None: method for_stage (line 132) | def for_stage( method system (line 156) | def system(self, stage: str) -> str: method user (line 160) | def user(self, stage: str, **kwargs: Any) -> str: method json_mode (line 167) | def json_mode(self, stage: str) -> bool: method max_tokens (line 170) | def max_tokens(self, stage: str) -> int | None: method block (line 175) | def block(self, name: str, **kwargs: Any) -> str: method sub_prompt (line 184) | def sub_prompt(self, name: str, **kwargs: Any) -> RenderedPrompt: method stage_names (line 195) | def stage_names(self) -> list[str]: method has_stage (line 198) | def has_stage(self, stage: str) -> bool: method export_yaml (line 201) | def export_yaml(self, path: Path) -> None: FILE: researchclaw/quality.py class TemplateMatch (line 47) | class TemplateMatch: class QualityReport (line 56) | class QualityReport: method has_template_content (line 65) | def has_template_content(self) -> bool: method match_count (line 69) | def match_count(self) -> int: method to_dict (line 72) | def to_dict(self) -> dict[str, object]: function detect_template_content (line 91) | def detect_template_content(text: str) -> list[TemplateMatch]: function compute_template_ratio (line 118) | def compute_template_ratio(text: str) -> float: function assess_quality (line 146) | def assess_quality(text: str) -> QualityReport: function check_strict_quality (line 169) | def check_strict_quality(text: str, *, threshold: float = 0.05) -> tuple... FILE: researchclaw/report.py function generate_report (line 15) | def generate_report(run_dir: Path) -> str: function _header (line 48) | def _header(summary: dict[str, Any], run_dir: Path) -> str: function _paper_section (line 68) | def _paper_section(run_dir: Path) -> str: function _experiment_section (line 96) | def _experiment_section(run_dir: Path) -> str: function _citation_section (line 135) | def _citation_section(run_dir: Path) -> str: function _warnings_section (line 172) | def _warnings_section(summary: dict[str, Any]) -> str: function print_report (line 197) | def print_report(run_dir: Path) -> None: function write_report (line 201) | def write_report(run_dir: Path, output_path: Path) -> None: FILE: researchclaw/server/app.py function create_app (line 25) | def create_app( FILE: researchclaw/server/dialog/intents.py class Intent (line 10) | class Intent(str, Enum): function classify_intent (line 54) | def classify_intent(message: str) -> tuple[Intent, float]: FILE: researchclaw/server/dialog/router.py function route_message (line 18) | async def route_message(raw_message: str, client_id: str) -> str: function _handle_help (line 40) | async def _handle_help(text: str, session: ChatSession) -> str: function _handle_status (line 53) | async def _handle_status(text: str, session: ChatSession) -> str: function _handle_start (line 80) | async def _handle_start(text: str, session: ChatSession) -> str: function _handle_topic (line 92) | async def _handle_topic(text: str, session: ChatSession) -> str: function _handle_config (line 103) | async def _handle_config(text: str, session: ChatSession) -> str: function _handle_results (line 114) | async def _handle_results(text: str, session: ChatSession) -> str: function _handle_paper (line 133) | async def _handle_paper(text: str, session: ChatSession) -> str: function _handle_general (line 145) | async def _handle_general(text: str, session: ChatSession) -> str: FILE: researchclaw/server/dialog/session.py class ChatMessage (line 16) | class ChatMessage: method to_dict (line 23) | def to_dict(self) -> dict[str, Any]: class ChatSession (line 28) | class ChatSession: method add_message (line 39) | def add_message(self, role: str, content: str) -> ChatMessage: method get_context (line 47) | def get_context(self, last_n: int = 10) -> list[dict[str, str]]: method to_dict (line 54) | def to_dict(self) -> dict[str, Any]: class SessionManager (line 64) | class SessionManager: method __init__ (line 67) | def __init__(self, persist_dir: str = ".researchclaw/sessions") -> None: method get_or_create (line 71) | def get_or_create(self, client_id: str) -> ChatSession: method remove (line 77) | def remove(self, client_id: str) -> None: method save (line 81) | def save(self, client_id: str) -> None: method load (line 94) | def load(self, client_id: str) -> ChatSession | None: FILE: researchclaw/server/middleware/auth.py class TokenAuthMiddleware (line 12) | class TokenAuthMiddleware(BaseHTTPMiddleware): method __init__ (line 21) | def __init__(self, app: object, token: str = "") -> None: method dispatch (line 25) | async def dispatch( FILE: researchclaw/server/routes/chat.py function set_chat_manager (line 21) | def set_chat_manager(manager: ConnectionManager) -> None: function get_chat_manager (line 27) | def get_chat_manager() -> ConnectionManager: function chat_websocket (line 35) | async def chat_websocket(websocket: WebSocket) -> None: FILE: researchclaw/server/routes/pipeline.py function _validated_run_dir (line 20) | def _validated_run_dir(run_id: str) -> Path: class PipelineStartRequest (line 33) | class PipelineStartRequest(BaseModel): class PipelineStartResponse (line 41) | class PipelineStartResponse(BaseModel): function _get_app_state (line 54) | def _get_app_state() -> dict[str, Any]: function start_pipeline (line 61) | async def start_pipeline(req: PipelineStartRequest) -> PipelineStartResp... function stop_pipeline (line 137) | async def stop_pipeline() -> dict[str, str]: function pipeline_status (line 150) | async def pipeline_status() -> dict[str, Any]: function pipeline_stages (line 158) | async def pipeline_stages() -> dict[str, Any]: function list_runs (line 174) | async def list_runs() -> dict[str, Any]: function get_run (line 195) | async def get_run(run_id: str) -> dict[str, Any]: function get_run_metrics (line 227) | async def get_run_metrics(run_id: str) -> dict[str, Any]: FILE: researchclaw/server/routes/projects.py function list_projects (line 15) | async def list_projects() -> dict[str, Any]: FILE: researchclaw/server/routes/voice.py function transcribe_audio (line 16) | async def transcribe_audio( FILE: researchclaw/server/websocket/events.py class EventType (line 12) | class EventType(str, Enum): class Event (line 41) | class Event: method to_json (line 48) | def to_json(self) -> str: method from_json (line 59) | def from_json(cls, raw: str) -> Event: FILE: researchclaw/server/websocket/manager.py class ConnectionManager (line 17) | class ConnectionManager: method __init__ (line 20) | def __init__(self) -> None: method active_count (line 25) | def active_count(self) -> int: method connect (line 28) | async def connect(self, websocket: WebSocket, client_id: str) -> None: method disconnect (line 39) | def disconnect(self, client_id: str) -> None: method broadcast (line 44) | async def broadcast(self, event: Event) -> None: method send_to (line 55) | async def send_to(self, client_id: str, event: Event) -> None: method _send (line 64) | async def _send(self, ws: WebSocket, event: Event) -> None: method publish (line 67) | def publish(self, event: Event) -> None: method drain_queue (line 74) | async def drain_queue(self) -> None: method heartbeat_loop (line 80) | async def heartbeat_loop(self, interval: float = 15.0) -> None: FILE: researchclaw/servers/cloud_executor.py class CloudExecutor (line 13) | class CloudExecutor: method __init__ (line 20) | def __init__(self, server: ServerEntry) -> None: method launch_instance (line 26) | async def launch_instance(self) -> dict[str, Any]: method terminate_instance (line 43) | async def terminate_instance(self, instance_id: str) -> None: method get_instance_status (line 47) | async def get_instance_status(self, instance_id: str) -> dict[str, Any]: FILE: researchclaw/servers/dispatcher.py class TaskDispatcher (line 18) | class TaskDispatcher: method __init__ (line 21) | def __init__( method dispatch (line 35) | async def dispatch(self, task: dict[str, Any]) -> str: method execute_task (line 67) | async def execute_task(self, task_id: str) -> dict[str, Any]: method get_task_status (line 131) | def get_task_status(self, task_id: str) -> dict[str, Any]: FILE: researchclaw/servers/monitor.py class ServerMonitor (line 14) | class ServerMonitor: method __init__ (line 17) | def __init__(self, registry: ServerRegistry) -> None: method check_status (line 21) | async def check_status(self, server: ServerEntry) -> dict[str, Any]: method check_all (line 34) | async def check_all(self) -> dict[str, dict[str, Any]]: method get_cached (line 47) | def get_cached(self, name: str) -> dict[str, Any] | None: method get_gpu_usage (line 51) | def get_gpu_usage(self, server: ServerEntry) -> dict[str, Any]: function _ssh_command (line 57) | async def _ssh_command(host: str, command: str) -> str: function _parse_status_output (line 71) | def _parse_status_output(raw: str, server: ServerEntry) -> dict[str, Any]: FILE: researchclaw/servers/registry.py class ServerEntry (line 11) | class ServerEntry: method __init__ (line 14) | def __init__( method to_dict (line 38) | def to_dict(self) -> dict[str, Any]: method from_dict (line 53) | def from_dict(cls, data: dict[str, Any]) -> ServerEntry: class ServerRegistry (line 68) | class ServerRegistry: method __init__ (line 71) | def __init__(self, servers: list[ServerEntry] | None = None) -> None: method add (line 76) | def add(self, server: ServerEntry) -> None: method remove (line 81) | def remove(self, name: str) -> None: method get (line 87) | def get(self, name: str) -> ServerEntry: method list_all (line 93) | def list_all(self) -> list[ServerEntry]: method get_available (line 97) | def get_available(self, exclude: set[str] | None = None) -> list[Serve... method get_best_match (line 102) | def get_best_match( method count (line 141) | def count(self) -> int: FILE: researchclaw/servers/slurm_executor.py class SlurmExecutor (line 15) | class SlurmExecutor: method __init__ (line 18) | def __init__(self, server: ServerEntry) -> None: method _generate_sbatch_script (line 24) | def _generate_sbatch_script( method submit_job (line 52) | async def submit_job( method check_job (line 87) | async def check_job(self, job_id: str) -> dict[str, Any]: method cancel_job (line 100) | async def cancel_job(self, job_id: str) -> None: FILE: researchclaw/servers/ssh_executor.py class SSHExecutor (line 16) | class SSHExecutor: method __init__ (line 19) | def __init__(self, server: ServerEntry) -> None: method upload_code (line 23) | async def upload_code(self, local_dir: Path, remote_dir: str) -> None: method run_experiment (line 39) | async def run_experiment( method download_results (line 68) | async def download_results(self, remote_dir: str, local_dir: Path) -> ... method cleanup (line 85) | async def cleanup(self, remote_dir: str) -> None: FILE: researchclaw/skills/loader.py function load_skill_from_skillmd (line 18) | def load_skill_from_skillmd(path: Path) -> Skill | None: function load_skillmd_from_directory (line 96) | def load_skillmd_from_directory(directory: Path) -> list[Skill]: function load_skill_file (line 117) | def load_skill_file(path: Path) -> Skill | None: function load_skills_from_directory (line 151) | def load_skills_from_directory(directory: Path) -> list[Skill]: FILE: researchclaw/skills/matcher.py function _tokenize (line 13) | def _tokenize(text: str) -> set[str]: function _resolve_stage (line 18) | def _resolve_stage(stage: int | str) -> int: function match_skills (line 25) | def match_skills( function format_skills_for_prompt (line 95) | def format_skills_for_prompt(skills: list[Skill], max_chars: int = 4000)... FILE: researchclaw/skills/registry.py class SkillRegistry (line 18) | class SkillRegistry: method __init__ (line 25) | def __init__( method _load_from_dir (line 51) | def _load_from_dir(self, directory: Path) -> None: method register (line 57) | def register(self, skill: Skill) -> None: method unregister (line 66) | def unregister(self, skill_id: str) -> bool: method get (line 80) | def get(self, skill_id: str) -> Skill | None: method list_all (line 84) | def list_all(self) -> list[Skill]: method list_by_category (line 88) | def list_by_category(self, category: str) -> list[Skill]: method list_by_stage (line 92) | def list_by_stage(self, stage: int) -> list[Skill]: method match (line 99) | def match( method export_for_prompt (line 124) | def export_for_prompt( method count (line 140) | def count(self) -> int: FILE: researchclaw/skills/schema.py class Skill (line 42) | class Skill: method id (line 65) | def id(self) -> str: # noqa: A003 method category (line 70) | def category(self) -> str: method trigger_keywords (line 74) | def trigger_keywords(self) -> list[str]: method applicable_stages (line 79) | def applicable_stages(self) -> list[int]: method priority (line 91) | def priority(self) -> int: method prompt_template (line 95) | def prompt_template(self) -> str: method code_template (line 100) | def code_template(self) -> str | None: method references (line 104) | def references(self) -> list[str]: method version (line 109) | def version(self) -> str: method to_dict (line 114) | def to_dict(self) -> dict[str, Any]: method from_dict (line 131) | def from_dict(cls, data: dict[str, Any]) -> Skill: FILE: researchclaw/templates/compiler.py class CompileResult (line 43) | class CompileResult: function compile_latex (line 54) | def compile_latex( function fix_common_latex_errors (line 164) | def fix_common_latex_errors( function _parse_log (line 370) | def _parse_log(log_text: str) -> tuple[list[str], list[str]]: class QualityCheckResult (line 400) | class QualityCheckResult: method has_critical_issues (line 413) | def has_critical_issues(self) -> bool: function check_compiled_quality (line 417) | def check_compiled_quality( function remove_missing_figures (line 514) | def remove_missing_figures(tex_text: str, stage_dir: Path) -> tuple[str,... function _sanitize_tex_unicode (line 574) | def _sanitize_tex_unicode(tex_path: Path) -> None: function _sanitize_bib_file (line 643) | def _sanitize_bib_file(bib_path: Path) -> None: function _fix_escaped_ampersand_in_tabular (line 714) | def _fix_escaped_ampersand_in_tabular(tex: str) -> tuple[str, int]: function _run_pdflatex (line 745) | def _run_pdflatex( function _is_fatal_error (line 796) | def _is_fatal_error(err: str) -> bool: function _run_bibtex (line 829) | def _run_bibtex(work_dir: Path, stem: str, timeout: int = 60) -> bool: FILE: researchclaw/templates/conference.py class ConferenceTemplate (line 21) | class ConferenceTemplate: method render_preamble (line 37) | def render_preamble( method render_footer (line 93) | def render_footer(self, bib_file: str = "references") -> str: method get_style_files (line 101) | def get_style_files(self) -> list[Path]: method _render_authors (line 115) | def _render_authors(self, authors: str) -> str: function get_template (line 351) | def get_template(name: str) -> ConferenceTemplate: function list_conferences (line 364) | def list_conferences() -> list[str]: FILE: researchclaw/templates/converter.py function _reset_render_counters (line 28) | def _reset_render_counters() -> None: function _next_table_num (line 34) | def _next_table_num() -> int: function _next_figure_num (line 41) | def _next_figure_num() -> int: function markdown_to_latex (line 52) | def markdown_to_latex( function _sanitize_latex_output (line 135) | def _sanitize_latex_output( function _round_raw_metrics (line 308) | def _round_raw_metrics(text: str) -> str: function _preprocess_markdown (line 334) | def _preprocess_markdown(md: str) -> str: class _Section (line 490) | class _Section: method __post_init__ (line 498) | def __post_init__(self) -> None: function _separate_heading_body (line 571) | def _separate_heading_body(heading: str) -> tuple[str, str]: function _parse_sections (line 647) | def _parse_sections(md: str) -> list[_Section]: function _extract_title (line 704) | def _extract_title(sections: list[_Section], raw_md: str) -> str: function _is_bad_title (line 738) | def _is_bad_title(candidate: str) -> bool: function _extract_abstract (line 752) | def _extract_abstract(sections: list[_Section]) -> str: function _build_body (line 772) | def _build_body(sections: list[_Section], *, title: str = "") -> str: function _deduplicate_tables (line 860) | def _deduplicate_tables(body: str) -> str: function _convert_block (line 921) | def _convert_block(text: str) -> str: function _collect_list (line 1060) | def _collect_list( function _render_itemize (line 1087) | def _render_itemize(items: list[str]) -> str: function _render_enumerate (line 1092) | def _render_enumerate(items: list[str]) -> str: function _collect_table (line 1102) | def _collect_table(lines: list[str], start: int) -> tuple[list[str], int]: function _render_table (line 1112) | def _render_table(table_lines: list[str], caption: str = "") -> str: function _auto_table_caption (line 1184) | def _auto_table_caption(header: list[str], table_num: int) -> str: function _parse_table_row (line 1206) | def _parse_table_row(line: str) -> list[str]: function _parse_alignments (line 1216) | def _parse_alignments(sep_line: str, ncols: int) -> list[str]: function _escape_algo_line (line 1311) | def _escape_algo_line(line: str) -> str: function _render_code_block (line 1366) | def _render_code_block(lang: str, code: str) -> str: function _render_figure (line 1431) | def _render_figure(caption: str, path: str) -> str: function _convert_inline (line 1467) | def _convert_inline(text: str) -> str: function check_paper_completeness (line 1610) | def check_paper_completeness(sections: list[_Section]) -> list[str]: function _escape_latex (line 1783) | def _escape_latex(text: str) -> str: FILE: researchclaw/templates/results_table_builder.py class LatexTable (line 23) | class LatexTable: function build_results_tables (line 34) | def build_results_tables( function _get_reportable_conditions (line 88) | def _get_reportable_conditions(registry: VerifiedRegistry) -> list[Condi... function _build_main_table (line 99) | def _build_main_table( function _build_per_seed_table (line 177) | def _build_per_seed_table( function build_condition_whitelist (line 238) | def build_condition_whitelist(registry: VerifiedRegistry) -> str: function _find_best (line 261) | def _find_best(conditions: list[ConditionResult], direction: str) -> int... function _fmt (line 279) | def _fmt(value: float | None) -> str: function _escape_latex (line 303) | def _escape_latex(text: str) -> str: FILE: researchclaw/trends/auto_topic.py class AutoTopicGenerator (line 14) | class AutoTopicGenerator: method __init__ (line 17) | def __init__( method generate_candidates (line 27) | async def generate_candidates( method auto_select (line 60) | async def auto_select( method _score_candidate (line 77) | def _score_candidate( method format_candidates (line 112) | def format_candidates( FILE: researchclaw/trends/daily_digest.py class DailyDigest (line 15) | class DailyDigest: method __init__ (line 18) | def __init__( method generate (line 26) | async def generate( method _generate_with_llm (line 52) | async def _generate_with_llm( method _generate_basic (line 108) | def _generate_basic( method _parse_summary (line 152) | def _parse_summary(response: str) -> tuple[str, int]: method generate_and_save (line 170) | async def generate_and_save( FILE: researchclaw/trends/feeds.py class FeedManager (line 12) | class FeedManager: method __init__ (line 17) | def __init__( method fetch_recent_papers (line 27) | def fetch_recent_papers( method _fetch_arxiv (line 66) | def _fetch_arxiv( method _fetch_s2 (line 98) | def _fetch_s2( method _fetch_openalex (line 137) | def _fetch_openalex( FILE: researchclaw/trends/opportunity_finder.py class OpportunityFinder (line 11) | class OpportunityFinder: method __init__ (line 14) | def __init__(self, llm_client: Any = None): method find_opportunities (line 17) | async def find_opportunities( method _llm_find_opportunities (line 27) | async def _llm_find_opportunities( method _parse_opportunities (line 57) | def _parse_opportunities(response: str) -> list[dict[str, Any]]: method _heuristic_find_opportunities (line 87) | def _heuristic_find_opportunities( FILE: researchclaw/trends/trend_analyzer.py class TrendAnalyzer (line 30) | class TrendAnalyzer: method __init__ (line 33) | def __init__(self, min_keyword_length: int = 3): method analyze (line 36) | def analyze( method _extract_keywords (line 65) | def _extract_keywords( method _extract_authors (line 101) | def _extract_authors( method _extract_datasets (line 121) | def _extract_datasets( method _extract_methods (line 145) | def _extract_methods( method _source_distribution (line 173) | def _source_distribution( method _tokenize (line 183) | def _tokenize(text: str) -> list[str]: method generate_trend_report (line 187) | def generate_trend_report( FILE: researchclaw/utils/sanitize.py function sanitize_figure_id (line 8) | def sanitize_figure_id(raw_id: str, *, fallback: str = "figure") -> str: FILE: researchclaw/utils/thinking_tags.py function strip_thinking_tags (line 86) | def strip_thinking_tags(text: str) -> str: FILE: researchclaw/voice/commands.py class VoiceCommand (line 10) | class VoiceCommand(str, Enum): class ParsedVoiceInput (line 22) | class ParsedVoiceInput: function parse_voice_input (line 39) | def parse_voice_input(text: str) -> ParsedVoiceInput: FILE: researchclaw/voice/synthesizer.py class VoiceSynthesizer (line 11) | class VoiceSynthesizer: method __init__ (line 14) | def __init__(self, server_config: Any) -> None: method synthesize (line 17) | async def synthesize( FILE: researchclaw/voice/transcriber.py class VoiceTranscriber (line 11) | class VoiceTranscriber: method __init__ (line 14) | def __init__(self, server_config: Any) -> None: method transcribe (line 18) | async def transcribe( method transcribe_stream (line 57) | async def transcribe_stream( FILE: researchclaw/web/_ssrf.py function check_url_ssrf (line 10) | def check_url_ssrf(url: str) -> str | None: FILE: researchclaw/web/agent.py class WebSearchAgentResult (line 35) | class WebSearchAgentResult: method total_results (line 47) | def total_results(self) -> int: method to_context_string (line 55) | def to_context_string(self, *, max_length: int = 30_000) -> str: method to_dict (line 119) | def to_dict(self) -> dict[str, Any]: class WebSearchAgent (line 134) | class WebSearchAgent: method __init__ (line 155) | def __init__( method search_and_extract (line 180) | def search_and_extract( method _run_web_search (line 242) | def _run_web_search( method _run_scholar_search (line 257) | def _run_scholar_search( method _run_crawling (line 269) | def _run_crawling( method _run_pdf_extraction (line 296) | def _run_pdf_extraction( method _generate_queries (line 313) | def _generate_queries(topic: str) -> list[str]: method _select_urls_to_crawl (line 322) | def _select_urls_to_crawl(self, result: WebSearchAgentResult) -> list[... method _find_pdf_urls (line 338) | def _find_pdf_urls(result: WebSearchAgentResult) -> list[str]: FILE: researchclaw/web/crawler.py class CrawlResult (line 30) | class CrawlResult: method has_content (line 42) | def has_content(self) -> bool: class WebCrawler (line 46) | class WebCrawler: method __init__ (line 57) | def __init__( method crawl (line 72) | async def crawl(self, url: str) -> CrawlResult: method crawl_sync (line 89) | def crawl_sync(self, url: str) -> CrawlResult: method crawl_many (line 104) | async def crawl_many(self, urls: list[str]) -> list[CrawlResult]: method _crawl_with_crawl4ai (line 163) | async def _crawl_with_crawl4ai(self, url: str, t0: float) -> CrawlResult: method _extract_markdown (line 192) | def _extract_markdown(self, raw: Any) -> str: method _crawl_with_urllib (line 208) | def _crawl_with_urllib(self, url: str, t0: float) -> CrawlResult: method _html_to_markdown (line 234) | def _html_to_markdown(html: str) -> str: FILE: researchclaw/web/pdf_extractor.py class PDFContent (line 36) | class PDFContent: method has_content (line 52) | def has_content(self) -> bool: class PDFExtractor (line 56) | class PDFExtractor: method __init__ (line 67) | def __init__( method backend (line 77) | def backend(self) -> str: method extract (line 80) | def extract(self, path: str | Path) -> PDFContent: method extract_from_url (line 133) | def extract_from_url(self, url: str) -> PDFContent: method _extract_abstract (line 166) | def _extract_abstract(text: str) -> str: method _detect_sections (line 183) | def _detect_sections(text: str) -> list[dict[str, str]]: FILE: researchclaw/web/scholar.py class ScholarPaper (line 33) | class ScholarPaper: method to_dict (line 46) | def to_dict(self) -> dict[str, Any]: method to_literature_paper (line 59) | def to_literature_paper(self) -> Any: class GoogleScholarClient (line 76) | class GoogleScholarClient: method __init__ (line 87) | def __init__( method available (line 111) | def available(self) -> bool: method search (line 115) | def search(self, query: str, *, limit: int = 10) -> list[ScholarPaper]: method get_citations (line 134) | def get_citations(self, scholar_id: str, *, limit: int = 20) -> list[S... method search_author (line 155) | def search_author(self, name: str) -> list[dict[str, Any]]: method _rate_limit (line 179) | def _rate_limit(self) -> None: method _parse_pub (line 187) | def _parse_pub(pub: Any) -> ScholarPaper: FILE: researchclaw/web/search.py class SearchResult (line 27) | class SearchResult: method to_dict (line 37) | def to_dict(self) -> dict[str, Any]: class WebSearchResponse (line 49) | class WebSearchResponse: method has_results (line 59) | def has_results(self) -> bool: class WebSearchClient (line 63) | class WebSearchClient: method __init__ (line 81) | def __init__( method search (line 94) | def search( method search_multi (line 115) | def search_multi( method _search_tavily (line 141) | def _search_tavily( method _search_duckduckgo (line 191) | def _search_duckduckgo( method _parse_ddg_html (line 216) | def _parse_ddg_html(html: str, limit: int) -> list[SearchResult]: FILE: researchclaw/wizard/quickstart.py class QuickStartWizard (line 11) | class QuickStartWizard: method run_interactive (line 14) | def run_interactive(self, template: str | None = None) -> dict[str, Any]: method run_web (line 101) | def run_web(self, steps: list[dict[str, Any]]) -> dict[str, Any]: method _apply_template (line 117) | def _apply_template(self, name: str) -> dict[str, Any]: method _template_to_config (line 136) | def _template_to_config(self, tpl: dict[str, Any]) -> dict[str, Any]: method _ask (line 158) | def _ask(self, prompt: str, default: str = "") -> str: method _ask_yn (line 167) | def _ask_yn(self, prompt: str, default: bool = True) -> bool: method _choose (line 178) | def _choose( method _print_summary (line 204) | def _print_summary(self, config: dict[str, Any], indent: int = 2) -> N... FILE: researchclaw/wizard/templates.py function get_template (line 48) | def get_template(name: str) -> dict[str, Any] | None: function list_templates (line 53) | def list_templates() -> list[dict[str, str]]: FILE: researchclaw/wizard/validator.py class EnvironmentReport (line 12) | class EnvironmentReport: method to_dict (line 26) | def to_dict(self) -> dict[str, Any]: function detect_environment (line 41) | def detect_environment() -> EnvironmentReport: FILE: researchclaw/writing_guide.py function format_writing_tips (line 56) | def format_writing_tips(categories: list[str] | None = None) -> str: FILE: scripts/test_beast_mode_e2e.py function main (line 172) | def main() -> None: FILE: scripts/test_code_agent_live.py function analyze_code_quality (line 192) | def analyze_code_quality(files: dict[str, str], test_case: dict) -> dict: function main (line 321) | def main(): FILE: scripts/test_code_agent_sandbox.py function make_sandbox_factory (line 120) | def make_sandbox_factory(docker_cfg: DockerSandboxConfig): function main (line 127) | def main(): FILE: scripts/test_codegen_v2.py function analyze_code_quality (line 269) | def analyze_code_quality(files: dict[str, str], test_case: dict) -> dict: function _check_identical_classes (line 411) | def _check_identical_classes(files: dict[str, str]) -> list[str]: function run_in_sandbox (line 446) | def run_in_sandbox( function load_from_run (line 543) | def load_from_run(run_dir: str) -> dict: function main (line 602) | def main(): FILE: tests/e2e_docker_sandbox.py function check (line 30) | def check(name: str, ok: bool, detail: str = "") -> None: function main (line 39) | def main() -> None: FILE: tests/e2e_real_llm.py function main (line 28) | def main() -> None: FILE: tests/test_anthropic.py function _create_message (line 21) | def _create_message() -> dict[str, Any]: function test_anthropic_api (line 40) | def test_anthropic_api() -> None: FILE: tests/test_assessor.py function _sample_paper (line 27) | def _sample_paper() -> str: function _sample_scores (line 37) | def _sample_scores(overall: float = 7.5) -> dict[str, Any]: class MockLLM (line 50) | class MockLLM: method __init__ (line 53) | def __init__(self, response: str = "SCORE: 7\nREASON: Solid contributi... method chat_async (line 56) | async def chat_async(self, prompt: str) -> str: class FailingLLM (line 60) | class FailingLLM: method chat_async (line 61) | async def chat_async(self, prompt: str) -> str: class TestRubrics (line 70) | class TestRubrics: method test_all_five_dimensions_present (line 71) | def test_all_five_dimensions_present(self): method test_rubric_is_frozen (line 76) | def test_rubric_is_frozen(self): method test_rubric_has_criteria_and_scale (line 81) | def test_rubric_has_criteria_and_scale(self): method test_default_weight (line 86) | def test_default_weight(self): class TestPaperScorer (line 96) | class TestPaperScorer: method test_score_without_llm (line 97) | def test_score_without_llm(self): method test_score_with_mock_llm (line 105) | def test_score_with_mock_llm(self): method test_score_with_failing_llm_falls_back (line 113) | def test_score_with_failing_llm_falls_back(self): method test_score_subset_dimensions (line 120) | def test_score_subset_dimensions(self): method test_parse_score_valid (line 125) | def test_parse_score_valid(self): method test_parse_score_clamped (line 132) | def test_parse_score_clamped(self): method test_parse_score_missing (line 138) | def test_parse_score_missing(self): method test_heuristic_clarity_long_paper (line 143) | def test_heuristic_clarity_long_paper(self): method test_heuristic_clarity_short_paper (line 149) | def test_heuristic_clarity_short_paper(self): method test_heuristic_experiments_with_table_and_figure (line 154) | def test_heuristic_experiments_with_table_and_figure(self): method test_heuristic_experiments_no_evidence (line 159) | def test_heuristic_experiments_no_evidence(self): method test_heuristic_default_dimension (line 164) | def test_heuristic_default_dimension(self): class TestVenueRecommender (line 176) | class TestVenueRecommender: method test_recommend_high_score (line 177) | def test_recommend_high_score(self): method test_recommend_low_score (line 185) | def test_recommend_low_score(self): method test_recommend_medium_score_no_tier1 (line 191) | def test_recommend_medium_score_no_tier1(self): method test_recommend_filter_by_domain (line 198) | def test_recommend_filter_by_domain(self): method test_get_suggestion_weak_dimension (line 205) | def test_get_suggestion_weak_dimension(self): method test_get_suggestion_moderate (line 211) | def test_get_suggestion_moderate(self): method test_get_suggestion_strong (line 216) | def test_get_suggestion_strong(self): method test_get_suggestion_no_scores (line 221) | def test_get_suggestion_no_scores(self): method test_format_recommendations_empty (line 226) | def test_format_recommendations_empty(self): method test_format_recommendations_with_data (line 231) | def test_format_recommendations_with_data(self): class TestHistoryComparator (line 243) | class TestHistoryComparator: method test_record_and_get_history (line 244) | def test_record_and_get_history(self, tmp_path: Path): method test_record_persists_to_disk (line 251) | def test_record_persists_to_disk(self, tmp_path: Path): method test_compare_no_history (line 258) | def test_compare_no_history(self): method test_compare_with_previous (line 263) | def test_compare_with_previous(self, tmp_path: Path): method test_compare_stable_trend (line 271) | def test_compare_stable_trend(self, tmp_path: Path): method test_compare_declined_trend (line 277) | def test_compare_declined_trend(self, tmp_path: Path): method test_compare_not_found (line 283) | def test_compare_not_found(self, tmp_path: Path): method test_get_best_run (line 289) | def test_get_best_run(self, tmp_path: Path): method test_get_best_run_empty (line 298) | def test_get_best_run_empty(self): method test_dimension_deltas (line 302) | def test_dimension_deltas(self, tmp_path: Path): FILE: tests/test_benchmark_agent.py class FakeLLMResponse (line 20) | class FakeLLMResponse: class FakeLLM (line 31) | class FakeLLM: method __init__ (line 34) | def __init__(self, responses: list[str] | None = None) -> None: method chat (line 39) | def chat(self, messages, **kwargs) -> FakeLLMResponse: class TestBenchmarkKnowledge (line 54) | class TestBenchmarkKnowledge: method test_knowledge_file_exists (line 57) | def test_knowledge_file_exists(self) -> None: method test_knowledge_loads (line 61) | def test_knowledge_loads(self) -> None: method test_knowledge_has_domains (line 67) | def test_knowledge_has_domains(self) -> None: method test_each_domain_has_benchmarks_and_baselines (line 73) | def test_each_domain_has_benchmarks_and_baselines(self) -> None: method test_benchmark_entries_have_required_fields (line 83) | def test_benchmark_entries_have_required_fields(self) -> None: method test_baseline_entries_have_required_fields (line 92) | def test_baseline_entries_have_required_fields(self) -> None: class TestSurveyor (line 107) | class TestSurveyor: method test_domain_matching_image_classification (line 110) | def test_domain_matching_image_classification(self) -> None: method test_domain_matching_rl (line 118) | def test_domain_matching_rl(self) -> None: method test_domain_matching_knowledge_distillation (line 126) | def test_domain_matching_knowledge_distillation(self) -> None: method test_domain_matching_multiple (line 134) | def test_domain_matching_multiple(self) -> None: method test_local_candidates_returns_benchmarks (line 142) | def test_local_candidates_returns_benchmarks(self) -> None: method test_execute_returns_benchmarks (line 149) | def test_execute_returns_benchmarks(self) -> None: method test_execute_with_unknown_topic_uses_llm_fallback (line 159) | def test_execute_with_unknown_topic_uses_llm_fallback(self) -> None: method test_extract_search_keywords (line 174) | def test_extract_search_keywords(self) -> None: method test_execute_empty_topic_fails (line 184) | def test_execute_empty_topic_fails(self) -> None: class TestSelector (line 196) | class TestSelector: method benchmarks (line 200) | def benchmarks(self) -> list[dict]: method baselines (line 215) | def baselines(self) -> list[dict]: method test_filter_excludes_tier3 (line 223) | def test_filter_excludes_tier3(self, benchmarks: list[dict]) -> None: method test_filter_network_none_only_tier1 (line 231) | def test_filter_network_none_only_tier1(self, benchmarks: list[dict]) ... method test_ranking_prefers_tier1 (line 238) | def test_ranking_prefers_tier1(self, benchmarks: list[dict]) -> None: method test_ranking_prefers_knowledge_base (line 246) | def test_ranking_prefers_knowledge_base(self, benchmarks: list[dict]) ... method test_execute_selects_minimum (line 257) | def test_execute_selects_minimum(self, benchmarks: list[dict], class TestAcquirer (line 282) | class TestAcquirer: method test_generate_setup_script_tier1_only (line 285) | def test_generate_setup_script_tier1_only(self) -> None: method test_generate_setup_script_tier2 (line 294) | def test_generate_setup_script_tier2(self) -> None: method test_generate_requirements_filters_builtin (line 305) | def test_generate_requirements_filters_builtin(self) -> None: method test_strip_fences (line 314) | def test_strip_fences(self) -> None: method test_execute_generates_code (line 319) | def test_execute_generates_code(self) -> None: class TestValidator (line 349) | class TestValidator: method test_syntax_check_valid (line 352) | def test_syntax_check_valid(self) -> None: method test_syntax_check_invalid (line 358) | def test_syntax_check_invalid(self) -> None: method test_import_check_builtin_ok (line 365) | def test_import_check_builtin_ok(self) -> None: method test_import_check_unknown (line 371) | def test_import_check_unknown(self) -> None: method test_import_check_with_requirements (line 377) | def test_import_check_with_requirements(self) -> None: method test_execute_passes_valid_code (line 385) | def test_execute_passes_valid_code(self) -> None: method test_execute_fails_syntax_error (line 407) | def test_execute_fails_syntax_error(self) -> None: class TestOrchestrator (line 429) | class TestOrchestrator: method test_orchestrate_produces_plan (line 432) | def test_orchestrate_produces_plan(self, tmp_path: Path) -> None: method test_orchestrate_saves_artifacts (line 477) | def test_orchestrate_saves_artifacts(self, tmp_path: Path) -> None: method test_plan_to_prompt_block (line 512) | def test_plan_to_prompt_block(self) -> None: method test_plan_to_dict_serializable (line 532) | def test_plan_to_dict_serializable(self) -> None: class TestConfig (line 549) | class TestConfig: method test_default_config_has_benchmark_agent (line 552) | def test_default_config_has_benchmark_agent(self) -> None: method test_parse_benchmark_agent_config (line 558) | def test_parse_benchmark_agent_config(self) -> None: method test_parse_benchmark_agent_config_empty (line 569) | def test_parse_benchmark_agent_config_empty(self) -> None: class TestBaseAgent (line 581) | class TestBaseAgent: method test_parse_json_direct (line 584) | def test_parse_json_direct(self) -> None: method test_parse_json_fenced (line 589) | def test_parse_json_fenced(self) -> None: method test_parse_json_embedded (line 594) | def test_parse_json_embedded(self) -> None: method test_parse_json_invalid (line 599) | def test_parse_json_invalid(self) -> None: class TestRequiredBaselines (line 610) | class TestRequiredBaselines: method test_inject_required_baselines_image_classification (line 613) | def test_inject_required_baselines_image_classification(self) -> None: method test_inject_required_baselines_no_duplicates (line 633) | def test_inject_required_baselines_no_duplicates(self) -> None: FILE: tests/test_calendar.py function _make_conference (line 24) | def _make_conference( function _future (line 44) | def _future(days: int) -> date: function _past (line 48) | def _past(days: int) -> date: class TestConference (line 57) | class TestConference: method test_from_dict_minimal (line 58) | def test_from_dict_minimal(self): method test_from_dict_full (line 65) | def test_from_dict_full(self): method test_from_dict_date_passthrough (line 83) | def test_from_dict_date_passthrough(self): method test_next_deadline_returns_earliest_future (line 92) | def test_next_deadline_returns_earliest_future(self): method test_next_deadline_skips_past (line 99) | def test_next_deadline_skips_past(self): method test_next_deadline_none_when_all_past (line 106) | def test_next_deadline_none_when_all_past(self): method test_days_until_deadline (line 113) | def test_days_until_deadline(self): method test_days_until_deadline_none (line 117) | def test_days_until_deadline_none(self): class TestConferenceCalendar (line 127) | class TestConferenceCalendar: method test_load_from_yaml (line 128) | def test_load_from_yaml(self, tmp_path: Path): method test_load_skips_invalid_entries (line 152) | def test_load_skips_invalid_entries(self, tmp_path: Path): method test_get_upcoming_filters_by_days (line 164) | def test_get_upcoming_filters_by_days(self): method test_get_upcoming_filters_by_domain (line 174) | def test_get_upcoming_filters_by_domain(self): method test_get_upcoming_filters_by_tier (line 184) | def test_get_upcoming_filters_by_tier(self): method test_get_by_name_case_insensitive (line 194) | def test_get_by_name_case_insensitive(self): method test_get_by_domain (line 201) | def test_get_by_domain(self): method test_format_upcoming_no_deadlines (line 211) | def test_format_upcoming_no_deadlines(self): method test_format_upcoming_with_deadlines (line 216) | def test_format_upcoming_with_deadlines(self): method test_load_builtin (line 226) | def test_load_builtin(self): class TestSubmissionPlanner (line 237) | class TestSubmissionPlanner: method test_plan_basic (line 238) | def test_plan_basic(self): method test_plan_unknown_venue (line 247) | def test_plan_unknown_venue(self): method test_plan_past_deadline (line 253) | def test_plan_past_deadline(self): method test_format_plan (line 261) | def test_format_plan(self): method test_format_plan_error (line 269) | def test_format_plan_error(self): class TestReminderCalculator (line 281) | class TestReminderCalculator: method test_check_fires_on_matching_day (line 282) | def test_check_fires_on_matching_day(self): method test_check_no_fire_on_non_matching_day (line 290) | def test_check_no_fire_on_non_matching_day(self): method test_check_skips_past_deadlines (line 297) | def test_check_skips_past_deadlines(self): method test_urgency_critical (line 302) | def test_urgency_critical(self): method test_urgency_warning (line 306) | def test_urgency_warning(self): method test_urgency_info (line 310) | def test_urgency_info(self): method test_get_active_reminders (line 313) | def test_get_active_reminders(self): method test_format_reminders_empty (line 323) | def test_format_reminders_empty(self): method test_format_reminders_with_data (line 327) | def test_format_reminders_with_data(self): method test_reminder_frozen (line 340) | def test_reminder_frozen(self): FILE: tests/test_cli.py function test_install_opencode_uses_which_resolved_npm_path (line 10) | def test_install_opencode_uses_which_resolved_npm_path(): function test_install_opencode_returns_false_when_npm_missing (line 24) | def test_install_opencode_returns_false_when_npm_missing(): function test_is_opencode_installed_uses_which_resolved_path (line 29) | def test_is_opencode_installed_uses_which_resolved_path(): FILE: tests/test_code_agent.py class FakeLLM (line 28) | class FakeLLM: method __init__ (line 31) | def __init__(self, responses: list[str] | None = None): method chat (line 36) | def chat(self, messages: list[dict], **kwargs: Any) -> LLMResponse: class FakeSandboxResult (line 47) | class FakeSandboxResult: class FakeSandbox (line 56) | class FakeSandbox: method __init__ (line 59) | def __init__(self, results: list[FakeSandboxResult] | None = None): method run_project (line 64) | def run_project( function stage_dir (line 75) | def stage_dir(tmp_path: Path) -> Path: function pm (line 82) | def pm() -> PromptManager: class TestCodeAgentConfig (line 91) | class TestCodeAgentConfig: method test_default_values (line 92) | def test_default_values(self) -> None: method test_custom_values (line 100) | def test_custom_values(self) -> None: class TestPhase1Architecture (line 118) | class TestPhase1Architecture: method test_architecture_planning_produces_spec (line 119) | def test_architecture_planning_produces_spec( method test_architecture_planning_disabled (line 146) | def test_architecture_planning_disabled( class TestPhase2ExecFix (line 175) | class TestPhase2ExecFix: method test_exec_fix_loop_fixes_crashing_code (line 176) | def test_exec_fix_loop_fixes_crashing_code( method test_exec_fix_skipped_without_sandbox (line 212) | def test_exec_fix_skipped_without_sandbox( method test_exec_fix_max_iterations_respected (line 232) | def test_exec_fix_max_iterations_respected( class TestPhase3TreeSearch (line 266) | class TestPhase3TreeSearch: method test_tree_search_generates_multiple_candidates (line 267) | def test_tree_search_generates_multiple_candidates( method test_tree_search_fixes_crashing_candidates (line 301) | def test_tree_search_fixes_crashing_candidates( class TestPhase4Review (line 347) | class TestPhase4Review: method test_review_approves_on_first_round (line 348) | def test_review_approves_on_first_round( method test_review_triggers_fix_on_critical_issues (line 369) | def test_review_triggers_fix_on_critical_issues( method test_review_disabled (line 399) | def test_review_disabled( class TestFullPipeline (line 427) | class TestFullPipeline: method test_all_phases_end_to_end (line 428) | def test_all_phases_end_to_end( method test_agent_writes_attempt_directories (line 463) | def test_agent_writes_attempt_directories( class TestSolutionNodeScoring (line 493) | class TestSolutionNodeScoring: method test_score_running_node (line 494) | def test_score_running_node(self) -> None: method test_score_crashing_node (line 505) | def test_score_crashing_node(self) -> None: method test_score_partial_output (line 515) | def test_score_partial_output(self) -> None: class TestHelpers (line 532) | class TestHelpers: method test_format_files (line 533) | def test_format_files(self) -> None: method test_parse_json_direct (line 540) | def test_parse_json_direct(self) -> None: method test_parse_json_fenced (line 544) | def test_parse_json_fenced(self) -> None: method test_parse_json_embedded (line 549) | def test_parse_json_embedded(self) -> None: method test_parse_json_invalid (line 555) | def test_parse_json_invalid(self) -> None: method test_simple_result_defaults (line 559) | def test_simple_result_defaults(self) -> None: class TestConfigIntegration (line 571) | class TestConfigIntegration: method test_code_agent_config_in_experiment_config (line 572) | def test_code_agent_config_in_experiment_config(self) -> None: method test_code_agent_config_from_dict (line 580) | def test_code_agent_config_from_dict(self, tmp_path: Path) -> None: class TestPromptsIntegration (line 631) | class TestPromptsIntegration: method test_architecture_planning_prompt_exists (line 632) | def test_architecture_planning_prompt_exists(self, pm: PromptManager) ... method test_code_exec_fix_prompt_exists (line 643) | def test_code_exec_fix_prompt_exists(self, pm: PromptManager) -> None: method test_code_reviewer_prompt_exists (line 654) | def test_code_reviewer_prompt_exists(self, pm: PromptManager) -> None: FILE: tests/test_code_searcher.py class TestQueryGeneration (line 37) | class TestQueryGeneration: method test_heuristic_generates_queries (line 38) | def test_heuristic_generates_queries(self): method test_heuristic_no_duplicates (line 51) | def test_heuristic_no_duplicates(self): method test_extract_key_phrases (line 61) | def test_extract_key_phrases(self): method test_generate_without_llm (line 67) | def test_generate_without_llm(self): class TestPatternExtractor (line 83) | class TestPatternExtractor: method test_heuristic_extract_imports (line 84) | def test_heuristic_extract_imports(self): method test_heuristic_extract_functions (line 93) | def test_heuristic_extract_functions(self): method test_empty_snippets (line 100) | def test_empty_snippets(self): method test_code_patterns_to_prompt (line 104) | def test_code_patterns_to_prompt(self): method test_code_patterns_has_content (line 115) | def test_code_patterns_has_content(self): class TestSearchCache (line 128) | class TestSearchCache: method test_put_and_get (line 129) | def test_put_and_get(self, tmp_path): method test_cache_miss (line 138) | def test_cache_miss(self, tmp_path): method test_cache_expiry (line 143) | def test_cache_expiry(self, tmp_path): method test_clear_domain (line 158) | def test_clear_domain(self, tmp_path): method test_clear_all (line 169) | def test_clear_all(self, tmp_path): method test_stats (line 177) | def test_stats(self, tmp_path): method test_topic_hash_deterministic (line 187) | def test_topic_hash_deterministic(self): method test_topic_hash_case_insensitive (line 192) | def test_topic_hash_case_insensitive(self): class TestGitHubClient (line 203) | class TestGitHubClient: method test_has_token_false (line 204) | def test_has_token_false(self): method test_has_token_true (line 210) | def test_has_token_true(self): method test_headers_with_token (line 214) | def test_headers_with_token(self): method test_headers_without_token (line 220) | def test_headers_without_token(self): class TestDataClasses (line 231) | class TestDataClasses: method test_repo_info_defaults (line 232) | def test_repo_info_defaults(self): method test_code_snippet (line 237) | def test_code_snippet(self): method test_repo_analysis (line 244) | def test_repo_analysis(self): class TestCodeSearchResult (line 258) | class TestCodeSearchResult: method test_empty_result (line 259) | def test_empty_result(self): method test_result_with_patterns (line 264) | def test_result_with_patterns(self): method test_cache_roundtrip (line 274) | def test_cache_roundtrip(self): class TestCodeSearchAgent (line 299) | class TestCodeSearchAgent: method _mock_github (line 300) | def _mock_github(self): method test_search_uses_cache (line 324) | def test_search_uses_cache(self, tmp_path): method test_search_with_mock_github (line 345) | def test_search_with_mock_github(self, tmp_path): method test_search_graceful_failure (line 364) | def test_search_graceful_failure(self, tmp_path): FILE: tests/test_collaboration.py function repo (line 27) | def repo(tmp_path: Path) -> ResearchRepository: function populated_repo (line 32) | def populated_repo(repo: ResearchRepository) -> ResearchRepository: function run_dir (line 51) | def run_dir(tmp_path: Path) -> Path: class TestResearchRepository (line 87) | class TestResearchRepository: method test_publish (line 88) | def test_publish(self, repo: ResearchRepository) -> None: method test_publish_creates_dirs (line 95) | def test_publish_creates_dirs(self, repo: ResearchRepository) -> None: method test_publish_unknown_type_skipped (line 102) | def test_publish_unknown_type_skipped(self, repo: ResearchRepository) ... method test_search_by_query (line 109) | def test_search_by_query(self, populated_repo: ResearchRepository) -> ... method test_search_by_type (line 113) | def test_search_by_type(self, populated_repo: ResearchRepository) -> N... method test_search_no_results (line 119) | def test_search_no_results(self, populated_repo: ResearchRepository) -... method test_search_empty_repo (line 123) | def test_search_empty_repo(self, repo: ResearchRepository) -> None: method test_list_runs (line 127) | def test_list_runs(self, populated_repo: ResearchRepository) -> None: method test_list_runs_empty (line 132) | def test_list_runs_empty(self, repo: ResearchRepository) -> None: method test_get_run_artifacts (line 136) | def test_get_run_artifacts(self, populated_repo: ResearchRepository) -... method test_get_run_artifacts_missing (line 141) | def test_get_run_artifacts_missing(self, populated_repo: ResearchRepos... method test_import_literature (line 145) | def test_import_literature(self, populated_repo: ResearchRepository) -... method test_import_literature_missing_run (line 150) | def test_import_literature_missing_run(self, populated_repo: ResearchR... method test_import_code_template (line 154) | def test_import_code_template(self, populated_repo: ResearchRepository... method test_import_code_template_no_match (line 159) | def test_import_code_template_no_match(self, populated_repo: ResearchR... class TestArtifactPublisher (line 167) | class TestArtifactPublisher: method test_publish_from_run_dir (line 168) | def test_publish_from_run_dir(self, run_dir: Path, tmp_path: Path) -> ... method test_publish_empty_dir (line 174) | def test_publish_empty_dir(self, tmp_path: Path) -> None: method test_publish_nonexistent_dir (line 182) | def test_publish_nonexistent_dir(self, tmp_path: Path) -> None: class TestArtifactSubscriber (line 192) | class TestArtifactSubscriber: method test_find_relevant_literature (line 193) | def test_find_relevant_literature(self, populated_repo: ResearchReposi... method test_find_similar_experiments (line 198) | def test_find_similar_experiments(self, populated_repo: ResearchReposi... method test_find_code_templates (line 203) | def test_find_code_templates(self, populated_repo: ResearchRepository)... method test_import_best_practices (line 208) | def test_import_best_practices(self, populated_repo: ResearchRepositor... method test_import_best_practices_empty (line 213) | def test_import_best_practices_empty(self, repo: ResearchRepository) -... class TestDedup (line 222) | class TestDedup: method test_content_hash_deterministic (line 223) | def test_content_hash_deterministic(self) -> None: method test_content_hash_different (line 228) | def test_content_hash_different(self) -> None: method test_deduplicate_artifacts (line 233) | def test_deduplicate_artifacts(self) -> None: method test_deduplicate_empty (line 242) | def test_deduplicate_empty(self) -> None: FILE: tests/test_compiler.py class TestIsFatalError (line 28) | class TestIsFatalError: method test_unicode_char_not_set_up_is_nonfatal (line 31) | def test_unicode_char_not_set_up_is_nonfatal(self): method test_unicode_char_various_codepoints_nonfatal (line 41) | def test_unicode_char_various_codepoints_nonfatal(self): method test_undefined_control_sequence_is_fatal (line 47) | def test_undefined_control_sequence_is_fatal(self): method test_missing_dollar_is_fatal (line 51) | def test_missing_dollar_is_fatal(self): method test_overfull_hbox_is_nonfatal (line 55) | def test_overfull_hbox_is_nonfatal(self): method test_float_lost_is_nonfatal (line 59) | def test_float_lost_is_nonfatal(self): method test_unavailable_in_encoding_is_nonfatal (line 63) | def test_unavailable_in_encoding_is_nonfatal(self): method test_emergency_stop_is_fatal (line 67) | def test_emergency_stop_is_fatal(self): method test_non_bang_file_not_found_is_fatal (line 71) | def test_non_bang_file_not_found_is_fatal(self): class TestSanitizeTexUnicode (line 80) | class TestSanitizeTexUnicode: method test_replaces_narrow_no_break_space (line 83) | def test_replaces_narrow_no_break_space(self, tmp_path: Path): method test_replaces_no_break_space (line 90) | def test_replaces_no_break_space(self, tmp_path: Path): method test_removes_zero_width_space (line 97) | def test_removes_zero_width_space(self, tmp_path: Path): method test_removes_bom (line 104) | def test_removes_bom(self, tmp_path: Path): method test_preserves_normal_text (line 111) | def test_preserves_normal_text(self, tmp_path: Path): method test_handles_multiple_types (line 119) | def test_handles_multiple_types(self, tmp_path: Path): method test_nonexistent_file (line 130) | def test_nonexistent_file(self, tmp_path: Path): method test_cyrillic_transliterated_to_latin (line 134) | def test_cyrillic_transliterated_to_latin(self, tmp_path: Path): class TestSanitizeBibFile (line 152) | class TestSanitizeBibFile: method test_cyrillic_author_transliterated (line 155) | def test_cyrillic_author_transliterated(self, tmp_path: Path): class TestFixUnicodeErrors (line 178) | class TestFixUnicodeErrors: method test_unicode_u202f_replaced_with_space (line 181) | def test_unicode_u202f_replaced_with_space(self): method test_unicode_u200b_removed (line 192) | def test_unicode_u200b_removed(self): method test_no_unicode_error_no_change (line 202) | def test_no_unicode_error_no_change(self): class TestRunPdflatexByteMode (line 218) | class TestRunPdflatexByteMode: method test_broken_utf8_in_stdout_does_not_crash (line 222) | def test_broken_utf8_in_stdout_does_not_crash(self, mock_run): method test_valid_utf8_works (line 240) | def test_valid_utf8_works(self, mock_run): class TestRunBibtex (line 261) | class TestRunBibtex: method test_bibtex_failure_logged (line 266) | def test_bibtex_failure_logged(self, mock_run, mock_which, tmp_path): method test_bibtex_success_with_bbl (line 281) | def test_bibtex_success_with_bbl(self, mock_run, mock_which, tmp_path): method test_bibtex_not_found (line 298) | def test_bibtex_not_found(self, mock_which, tmp_path): method test_bibtex_broken_utf8 (line 307) | def test_bibtex_broken_utf8(self, mock_run, mock_which, tmp_path): FILE: tests/test_convergence_evaluator.py class TestComputeConvergenceOrder (line 21) | class TestComputeConvergenceOrder: method test_second_order (line 22) | def test_second_order(self): method test_fourth_order (line 30) | def test_fourth_order(self): method test_first_order (line 38) | def test_first_order(self): method test_too_few_points (line 45) | def test_too_few_points(self): method test_empty_input (line 50) | def test_empty_input(self): method test_filters_invalid (line 54) | def test_filters_invalid(self): class TestAnalyzeConvergence (line 67) | class TestAnalyzeConvergence: method test_single_method (line 68) | def test_single_method(self): method test_multiple_methods (line 82) | def test_multiple_methods(self): method test_expected_orders (line 102) | def test_expected_orders(self): method test_non_converging (line 114) | def test_non_converging(self): method test_summary_string (line 126) | def test_summary_string(self): method test_l2_error_key (line 137) | def test_l2_error_key(self): method test_empty_data (line 149) | def test_empty_data(self): FILE: tests/test_copilot.py class TestResearchMode (line 34) | class TestResearchMode: method test_all_modes (line 35) | def test_all_modes(self): method test_from_value (line 40) | def test_from_value(self): method test_invalid_mode_raises (line 45) | def test_invalid_mode_raises(self): method test_mode_count (line 49) | def test_mode_count(self): class TestFeedback (line 58) | class TestFeedback: method test_feedback_actions_defined (line 59) | def test_feedback_actions_defined(self): method test_feedback_frozen (line 63) | def test_feedback_frozen(self): method test_feedback_defaults (line 68) | def test_feedback_defaults(self): method test_feedback_with_modifications (line 75) | def test_feedback_with_modifications(self): class TestFeedbackHandler (line 90) | class TestFeedbackHandler: method test_write_feedback_request (line 91) | def test_write_feedback_request(self, tmp_path: Path): method test_read_feedback_response_valid (line 105) | def test_read_feedback_response_valid(self, tmp_path: Path): method test_read_feedback_response_invalid_action (line 120) | def test_read_feedback_response_invalid_action(self, tmp_path: Path): method test_read_feedback_response_missing (line 128) | def test_read_feedback_response_missing(self, tmp_path: Path): method test_read_feedback_response_malformed (line 132) | def test_read_feedback_response_malformed(self, tmp_path: Path): method test_read_feedback_response_with_rollback (line 138) | def test_read_feedback_response_with_rollback(self, tmp_path: Path): method test_read_feedback_response_branch (line 152) | def test_read_feedback_response_branch(self, tmp_path: Path): method test_clear_request (line 165) | def test_clear_request(self, tmp_path: Path): method test_clear_request_no_file (line 171) | def test_clear_request_no_file(self, tmp_path: Path): method test_wait_for_feedback_timeout (line 175) | def test_wait_for_feedback_timeout(self, tmp_path: Path): method test_wait_for_feedback_finds_response (line 180) | def test_wait_for_feedback_finds_response(self, tmp_path: Path): class TestBranchManager (line 206) | class TestBranchManager: method test_create_branch (line 207) | def test_create_branch(self, tmp_path: Path): method test_create_branch_max_reached (line 228) | def test_create_branch_max_reached(self, tmp_path: Path): method test_create_branch_duplicate_name (line 234) | def test_create_branch_duplicate_name(self, tmp_path: Path): method test_list_branches_empty (line 240) | def test_list_branches_empty(self, tmp_path: Path): method test_list_branches (line 244) | def test_list_branches(self, tmp_path: Path): method test_switch_branch (line 253) | def test_switch_branch(self, tmp_path: Path): method test_switch_branch_nonexistent (line 259) | def test_switch_branch_nonexistent(self, tmp_path: Path): method test_delete_branch (line 264) | def test_delete_branch(self, tmp_path: Path): method test_delete_branch_nonexistent (line 271) | def test_delete_branch_nonexistent(self, tmp_path: Path): method test_compare_branches (line 276) | def test_compare_branches(self, tmp_path: Path): method test_compare_branches_nonexistent (line 287) | def test_compare_branches_nonexistent(self, tmp_path: Path): method test_count_stages (line 293) | def test_count_stages(self, tmp_path: Path): class TestCoPilotController (line 305) | class TestCoPilotController: method _make_config (line 306) | def _make_config(self, **overrides) -> CoPilotConfig: method test_should_pause_zero_touch (line 318) | def test_should_pause_zero_touch(self, tmp_path: Path): method test_should_pause_auto_pilot_gate (line 324) | def test_should_pause_auto_pilot_gate(self, tmp_path: Path): method test_should_pause_auto_pilot_gates_disabled (line 330) | def test_should_pause_auto_pilot_gates_disabled(self, tmp_path: Path): method test_should_pause_copilot_every_stage (line 335) | def test_should_pause_copilot_every_stage(self, tmp_path: Path): method test_should_pause_copilot_gates_only (line 341) | def test_should_pause_copilot_gates_only(self, tmp_path: Path): method test_present_stage_result (line 347) | def test_present_stage_result(self, tmp_path: Path): method test_present_stage_result_with_error (line 360) | def test_present_stage_result_with_error(self, tmp_path: Path): method test_handle_feedback_approve (line 372) | def test_handle_feedback_approve(self, tmp_path: Path): method test_handle_feedback_modify (line 379) | def test_handle_feedback_modify(self, tmp_path: Path): method test_handle_feedback_retry (line 392) | def test_handle_feedback_retry(self, tmp_path: Path): method test_handle_feedback_skip (line 399) | def test_handle_feedback_skip(self, tmp_path: Path): method test_handle_feedback_branch (line 406) | def test_handle_feedback_branch(self, tmp_path: Path): method test_handle_feedback_branch_disabled (line 414) | def test_handle_feedback_branch_disabled(self, tmp_path: Path): method test_handle_feedback_branch_max_reached (line 421) | def test_handle_feedback_branch_max_reached(self, tmp_path: Path): method test_handle_feedback_rollback (line 432) | def test_handle_feedback_rollback(self, tmp_path: Path): method test_handle_feedback_unknown_action (line 440) | def test_handle_feedback_unknown_action(self, tmp_path: Path): method test_from_config_zero_touch_returns_none (line 448) | def test_from_config_zero_touch_returns_none(self, tmp_path: Path): method test_from_config_copilot_returns_controller (line 453) | def test_from_config_copilot_returns_controller(self, tmp_path: Path): method test_from_config_auto_pilot_returns_controller (line 459) | def test_from_config_auto_pilot_returns_controller(self, tmp_path: Path): method test_handle_feedback_branch_default_name (line 464) | def test_handle_feedback_branch_default_name(self, tmp_path: Path): FILE: tests/test_decision_agent.py class _FakeLLMResponse (line 34) | class _FakeLLMResponse: method __post_init__ (line 44) | def __post_init__(self): class _FakeLLM (line 49) | class _FakeLLM: method __init__ (line 52) | def __init__(self, response: str = "{}"): method chat (line 56) | def chat(self, messages, *, system=None, max_tokens=None, class TestParseDecisions (line 70) | class TestParseDecisions: method _agent (line 73) | def _agent(self): method test_valid_json_array (line 77) | def test_valid_json_array(self): method test_json_inside_markdown_fences (line 100) | def test_json_inside_markdown_fences(self): method test_json_with_surrounding_text (line 107) | def test_json_with_surrounding_text(self): method test_no_json_array_raises (line 113) | def test_no_json_array_raises(self): method test_empty_array (line 118) | def test_empty_array(self): method test_non_dict_items_skipped (line 123) | def test_non_dict_items_skipped(self): method test_invalid_backend_auto_inferred (line 134) | def test_invalid_backend_auto_inferred(self): method test_missing_fields_get_defaults (line 143) | def test_missing_fields_get_defaults(self): class TestHeuristicDecide (line 158) | class TestHeuristicDecide: method _agent (line 161) | def _agent(self, min_figures=3, max_figures=10): method test_with_experiments (line 167) | def test_with_experiments(self): method test_without_experiments (line 180) | def test_without_experiments(self): method test_ablation_trigger (line 191) | def test_ablation_trigger(self): method test_max_figures_respected (line 202) | def test_max_figures_respected(self): class TestInferBackend (line 216) | class TestInferBackend: method test_code_types (line 217) | def test_code_types(self): method test_image_types (line 226) | def test_image_types(self): method test_unknown_defaults_to_image (line 235) | def test_unknown_defaults_to_image(self): class TestEnforceBounds (line 244) | class TestEnforceBounds: method _agent (line 245) | def _agent(self, min_figures=3, max_figures=6): method test_min_padding (line 251) | def test_min_padding(self): method test_max_truncation (line 261) | def test_max_truncation(self): method test_ensures_image_figure (line 272) | def test_ensures_image_figure(self): method test_ensures_code_figure_with_experiments (line 282) | def test_ensures_code_figure_with_experiments(self): class TestBuildPrompt (line 297) | class TestBuildPrompt: method _agent (line 298) | def _agent(self): method test_prompt_contains_description (line 304) | def test_prompt_contains_description(self): method test_prompt_contains_style (line 316) | def test_prompt_contains_style(self): method test_prompt_varies_by_type (line 327) | def test_prompt_varies_by_type(self): class TestGetTypeGuidelines (line 345) | class TestGetTypeGuidelines: method test_known_types (line 346) | def test_known_types(self): method test_unknown_type_falls_back (line 357) | def test_unknown_type_falls_back(self): class TestNanoBananaNoKey (line 368) | class TestNanoBananaNoKey: method test_execute_without_key_fails (line 369) | def test_execute_without_key_fails(self, tmp_path): method test_execute_empty_figures_succeeds (line 387) | def test_execute_empty_figures_succeeds(self, tmp_path): class TestDockerRenderer (line 406) | class TestDockerRenderer: method _agent (line 407) | def _agent(self): method test_docker_command_construction (line 416) | def test_docker_command_construction(self, tmp_path): method test_docker_timeout_kills_container (line 447) | def test_docker_timeout_kills_container(self, tmp_path): method test_docker_not_found (line 467) | def test_docker_not_found(self, tmp_path): method test_docker_script_failure (line 485) | def test_docker_script_failure(self, tmp_path): class TestStripThinkingTags (line 512) | class TestStripThinkingTags: method test_closed_tags_removed (line 513) | def test_closed_tags_removed(self): method test_no_tags (line 518) | def test_no_tags(self): method test_empty_string (line 523) | def test_empty_string(self): method test_nested_code_preserved (line 527) | def test_nested_code_preserved(self): method test_unclosed_tag_behavior (line 534) | def test_unclosed_tag_behavior(self): class TestDecisionAgentExecute (line 548) | class TestDecisionAgentExecute: method test_llm_decision (line 549) | def test_llm_decision(self): method test_fallback_on_bad_llm (line 572) | def test_fallback_on_bad_llm(self): method test_fallback_on_no_llm (line 587) | def test_fallback_on_no_llm(self): class TestRendererCwd (line 604) | class TestRendererCwd: method test_local_cwd_is_output_dir (line 607) | def test_local_cwd_is_output_dir(self, tmp_path): class TestChatStripThinking (line 631) | class TestChatStripThinking: method test_strip_thinking_false_by_default (line 634) | def test_strip_thinking_false_by_default(self): method test_strip_thinking_true_removes_tags (line 671) | def test_strip_thinking_true_removes_tags(self): class TestLatexDisplayMath (line 714) | class TestLatexDisplayMath: method test_dollar_dollar_to_equation (line 717) | def test_dollar_dollar_to_equation(self): method test_multiline_dollar_dollar (line 735) | def test_multiline_dollar_dollar(self): method test_inline_dollar_dollar_not_escaped (line 748) | def test_inline_dollar_dollar_not_escaped(self): class TestLatexFigurePlacement (line 762) | class TestLatexFigurePlacement: method test_figure_uses_top_placement (line 765) | def test_figure_uses_top_placement(self): method test_figure_has_centering (line 772) | def test_figure_has_centering(self): class TestChatWithPromptStripThinking (line 787) | class TestChatWithPromptStripThinking: method test_default_strips_thinking (line 790) | def test_default_strips_thinking(self): method test_can_disable_stripping (line 806) | def test_can_disable_stripping(self): FILE: tests/test_domain_detector.py class TestProfileLoading (line 28) | class TestProfileLoading: method setup_method (line 29) | def setup_method(self): method test_load_all_profiles_returns_dict (line 32) | def test_load_all_profiles_returns_dict(self): method test_profiles_have_required_fields (line 37) | def test_profiles_have_required_fields(self): method test_get_profile_existing (line 45) | def test_get_profile_existing(self): method test_get_profile_nonexistent (line 52) | def test_get_profile_nonexistent(self): method test_get_generic_profile (line 56) | def test_get_generic_profile(self): method test_ml_profiles_exist (line 61) | def test_ml_profiles_exist(self): method test_physics_profiles_exist (line 66) | def test_physics_profiles_exist(self): method test_other_domain_profiles_exist (line 71) | def test_other_domain_profiles_exist(self): method test_physics_profile_paradigm (line 84) | def test_physics_profile_paradigm(self): method test_economics_profile_paradigm (line 90) | def test_economics_profile_paradigm(self): class TestKeywordDetection (line 102) | class TestKeywordDetection: method test_ml_vision_keywords (line 103) | def test_ml_vision_keywords(self): method test_ml_nlp_keywords (line 107) | def test_ml_nlp_keywords(self): method test_ml_rl_keywords (line 111) | def test_ml_rl_keywords(self): method test_physics_keywords (line 115) | def test_physics_keywords(self): method test_chemistry_keywords (line 119) | def test_chemistry_keywords(self): method test_biology_keywords (line 123) | def test_biology_keywords(self): method test_economics_keywords (line 126) | def test_economics_keywords(self): method test_math_keywords (line 130) | def test_math_keywords(self): method test_security_keywords (line 134) | def test_security_keywords(self): method test_robotics_keywords (line 137) | def test_robotics_keywords(self): method test_generic_ml_fallback (line 140) | def test_generic_ml_fallback(self): method test_unknown_topic (line 144) | def test_unknown_topic(self): method test_case_insensitive (line 147) | def test_case_insensitive(self): class TestDetectDomain (line 157) | class TestDetectDomain: method test_detect_ml_vision (line 158) | def test_detect_ml_vision(self): method test_detect_physics (line 163) | def test_detect_physics(self): method test_detect_with_hypotheses (line 168) | def test_detect_with_hypotheses(self): method test_detect_generic_fallback (line 175) | def test_detect_generic_fallback(self): method test_detect_domain_id_shortcut (line 179) | def test_detect_domain_id_shortcut(self): class TestIsMLDomain (line 192) | class TestIsMLDomain: method test_ml_domains (line 193) | def test_ml_domains(self): method test_non_ml_domains (line 199) | def test_non_ml_domains(self): method test_generic_not_ml (line 205) | def test_generic_not_ml(self): class TestDomainProfile (line 215) | class TestDomainProfile: method test_default_values (line 216) | def test_default_values(self): method test_custom_values (line 223) | def test_custom_values(self): class TestEnums (line 241) | class TestEnums: method test_experiment_paradigm_values (line 242) | def test_experiment_paradigm_values(self): method test_metric_type_values (line 248) | def test_metric_type_values(self): class TestDetectionAccuracy (line 259) | class TestDetectionAccuracy: method test_keyword_detection_accuracy (line 309) | def test_keyword_detection_accuracy(self): method test_full_detection_accuracy (line 325) | def test_full_detection_accuracy(self): FILE: tests/test_entry_point_validation.py class TestValidateEntryPoint (line 18) | class TestValidateEntryPoint: method test_valid_entry_point (line 21) | def test_valid_entry_point(self) -> None: method test_valid_nested_entry_point (line 24) | def test_valid_nested_entry_point(self) -> None: method test_valid_dot_slash_prefix (line 27) | def test_valid_dot_slash_prefix(self) -> None: method test_valid_dot_in_middle (line 30) | def test_valid_dot_in_middle(self) -> None: method test_valid_deeply_nested (line 33) | def test_valid_deeply_nested(self) -> None: method test_rejects_absolute_path (line 36) | def test_rejects_absolute_path(self) -> None: method test_rejects_path_traversal (line 41) | def test_rejects_path_traversal(self) -> None: method test_rejects_dotdot_in_middle (line 46) | def test_rejects_dotdot_in_middle(self) -> None: method test_rejects_empty_string (line 51) | def test_rejects_empty_string(self) -> None: method test_rejects_whitespace_only (line 56) | def test_rejects_whitespace_only(self) -> None: class TestValidateEntryPointResolved (line 65) | class TestValidateEntryPointResolved: method test_valid_path_passes (line 68) | def test_valid_path_passes(self, tmp_path: Path) -> None: method test_symlink_escape_rejected (line 72) | def test_symlink_escape_rejected(self, tmp_path: Path) -> None: method test_nested_valid_path_passes (line 86) | def test_nested_valid_path_passes(self, tmp_path: Path) -> None: class TestExperimentSandboxEntryPointValidation (line 96) | class TestExperimentSandboxEntryPointValidation: method _make_sandbox (line 99) | def _make_sandbox(self, tmp_path: Path) -> ExperimentSandbox: method test_rejects_path_traversal (line 105) | def test_rejects_path_traversal(self, tmp_path: Path) -> None: method test_rejects_absolute_path (line 123) | def test_rejects_absolute_path(self, tmp_path: Path) -> None: FILE: tests/test_experiment_diagnosis.py class TestMissingDependency (line 27) | class TestMissingDependency: method test_detects_module_not_found (line 28) | def test_detects_module_not_found(self): method test_detects_box2d (line 37) | def test_detects_box2d(self): class TestPermissionError (line 47) | class TestPermissionError: method test_detects_hf_permission (line 48) | def test_detects_hf_permission(self): class TestTimeGuard (line 58) | class TestTimeGuard: method test_detects_dominant_time_guard (line 59) | def test_detects_dominant_time_guard(self): method test_no_time_guard_if_most_complete (line 73) | def test_no_time_guard_if_most_complete(self): class TestSyntheticData (line 89) | class TestSyntheticData: method test_detects_synthetic_fallback (line 90) | def test_detects_synthetic_fallback(self): class TestGPUOOM (line 99) | class TestGPUOOM: method test_detects_oom (line 100) | def test_detects_oom(self): class TestIdenticalConditions (line 109) | class TestIdenticalConditions: method test_detects_from_ablation_warnings (line 110) | def test_detects_from_ablation_warnings(self): class TestCodeCrash (line 123) | class TestCodeCrash: method test_detects_traceback (line 124) | def test_detects_traceback(self): class TestQualityAssessment (line 143) | class TestQualityAssessment: method test_full_paper_mode (line 144) | def test_full_paper_mode(self): method test_preliminary_study_mode (line 163) | def test_preliminary_study_mode(self): method test_technical_report_no_conditions (line 175) | def test_technical_report_no_conditions(self): method test_technical_report_synthetic_data (line 184) | def test_technical_report_synthetic_data(self): class TestRepairPrompt (line 198) | class TestRepairPrompt: method test_generates_prompt (line 199) | def test_generates_prompt(self): method test_serialization (line 209) | def test_serialization(self): class TestRealArtifacts (line 224) | class TestRealArtifacts: method _load (line 225) | def _load(self, run_id: str) -> tuple[dict, dict | None]: method test_run_e57360_diagnosis (line 239) | def test_run_e57360_diagnosis(self): method test_run_8b4a1b_diagnosis (line 246) | def test_run_8b4a1b_diagnosis(self): class TestDatasetNotFoundError (line 253) | class TestDatasetNotFoundError: method test_detects_hf_dataset_not_found (line 256) | def test_detects_hf_dataset_not_found(self): method test_suggested_fix_mentions_precached (line 274) | def test_suggested_fix_mentions_precached(self): class TestNearRandomAccuracy (line 287) | class TestNearRandomAccuracy: method test_detects_near_random_cifar10 (line 290) | def test_detects_near_random_cifar10(self): method test_normal_accuracy_not_flagged (line 302) | def test_normal_accuracy_not_flagged(self): method test_zero_accuracy_not_flagged (line 314) | def test_zero_accuracy_not_flagged(self): class TestRealArtifactsContinued (line 327) | class TestRealArtifactsContinued(TestRealArtifacts): method test_run_acbdfa_diagnosis (line 330) | def test_run_acbdfa_diagnosis(self): FILE: tests/test_experiment_repair.py class TestBuildRepairPrompt (line 36) | class TestBuildRepairPrompt: method test_basic_prompt (line 37) | def test_basic_prompt(self): method test_scope_reduction_included (line 63) | def test_scope_reduction_included(self): method test_dep_fix_section (line 83) | def test_dep_fix_section(self): method test_long_code_truncated (line 98) | def test_long_code_truncated(self): method test_output_format_section (line 104) | def test_output_format_section(self): class TestRepairResult (line 116) | class TestRepairResult: method test_serialization (line 117) | def test_serialization(self): method test_serialization_with_cycles (line 128) | def test_serialization_with_cycles(self): class TestExtractCodeBlocks (line 155) | class TestExtractCodeBlocks: method test_named_blocks (line 156) | def test_named_blocks(self): method test_unnamed_block_fallback (line 175) | def test_unnamed_block_fallback(self): method test_no_blocks (line 185) | def test_no_blocks(self): method test_path_normalization (line 190) | def test_path_normalization(self): class TestBuildExperimentSummary (line 204) | class TestBuildExperimentSummary: method test_basic_summary (line 205) | def test_basic_summary(self): method test_failed_run (line 225) | def test_failed_run(self): method test_multi_seed_grouping (line 238) | def test_multi_seed_grouping(self): class TestLoadExperimentCode (line 265) | class TestLoadExperimentCode: method test_loads_from_stage_13 (line 266) | def test_loads_from_stage_13(self, tmp_path): method test_loads_from_stage_10 (line 276) | def test_loads_from_stage_10(self, tmp_path): method test_empty_when_no_code (line 284) | def test_empty_when_no_code(self, tmp_path): class TestLoadExperimentSummary (line 289) | class TestLoadExperimentSummary: method test_loads_summary (line 290) | def test_loads_summary(self, tmp_path): class TestSelectBestResults (line 306) | class TestSelectBestResults: method test_picks_best_across_cycles (line 307) | def test_picks_best_across_cycles(self, tmp_path): method test_returns_none_when_empty (line 328) | def test_returns_none_when_empty(self, tmp_path): class TestRunRepairLoop (line 338) | class TestRunRepairLoop: method _make_run_dir (line 339) | def _make_run_dir(self, tmp_path, n_conditions=1, has_code=True): method test_skips_when_already_sufficient (line 368) | def test_skips_when_already_sufficient(self, tmp_path): method test_returns_failure_when_no_code (line 405) | def test_returns_failure_when_no_code(self, tmp_path): method test_repair_loop_with_mocked_llm (line 428) | def test_repair_loop_with_mocked_llm(self, tmp_path): class TestBuildExperimentSummaryTwoPartKeys (line 506) | class TestBuildExperimentSummaryTwoPartKeys: method test_two_part_keys_parsed (line 512) | def test_two_part_keys_parsed(self): method test_two_part_keys_create_synthetic_seed (line 533) | def test_two_part_keys_create_synthetic_seed(self): method test_mixed_two_and_three_part_keys (line 552) | def test_mixed_two_and_three_part_keys(self): method test_empty_metrics_still_empty (line 579) | def test_empty_metrics_still_empty(self): class TestRepairSummaryPromotion (line 598) | class TestRepairSummaryPromotion: method test_empty_repair_does_not_overwrite_rich_summary (line 603) | def test_empty_repair_does_not_overwrite_rich_summary(self, tmp_path): method test_richer_repair_does_overwrite (line 657) | def test_richer_repair_does_overwrite(self, tmp_path): FILE: tests/test_experiment_schema.py class TestCondition (line 24) | class TestCondition: method test_default_role (line 25) | def test_default_role(self): method test_custom_role (line 29) | def test_custom_role(self): method test_variant_with_parent (line 33) | def test_variant_with_parent(self): class TestUniversalExperimentPlan (line 48) | class TestUniversalExperimentPlan: method test_empty_plan (line 49) | def test_empty_plan(self): method test_plan_with_conditions (line 54) | def test_plan_with_conditions(self): method test_to_legacy_format (line 67) | def test_to_legacy_format(self): method test_to_yaml (line 85) | def test_to_yaml(self): class TestFromLegacy (line 106) | class TestFromLegacy: method test_basic_legacy_plan (line 107) | def test_basic_legacy_plan(self): method test_legacy_string_names (line 131) | def test_legacy_string_names(self): method test_legacy_yaml_string (line 141) | def test_legacy_yaml_string(self): method test_roundtrip_legacy (line 158) | def test_roundtrip_legacy(self): method test_empty_legacy (line 175) | def test_empty_legacy(self): method test_metrics_as_list (line 179) | def test_metrics_as_list(self): class TestEnums (line 190) | class TestEnums: method test_condition_role_values (line 191) | def test_condition_role_values(self): method test_experiment_type_values (line 196) | def test_experiment_type_values(self): FILE: tests/test_figure_agent.py class _FakeLLMResponse (line 22) | class _FakeLLMResponse: class _FakeLLM (line 30) | class _FakeLLM: method __init__ (line 33) | def __init__(self, response: str = "{}"): method chat (line 37) | def chat(self, messages, *, system=None, max_tokens=None, class TestStyleConfig (line 94) | class TestStyleConfig: method test_constants_exist (line 95) | def test_constants_exist(self): method test_get_style_preamble (line 107) | def test_get_style_preamble(self): method test_custom_dpi (line 115) | def test_custom_dpi(self): class TestPlannerAgent (line 125) | class TestPlannerAgent: method test_domain_detection_classification (line 126) | def test_domain_detection_classification(self): method test_domain_detection_rl (line 131) | def test_domain_detection_rl(self): method test_domain_detection_default (line 136) | def test_domain_detection_default(self): method test_analyze_data_basic (line 141) | def test_analyze_data_basic(self): method test_analyze_data_training_history (line 156) | def test_analyze_data_training_history(self): method test_fallback_plan (line 168) | def test_fallback_plan(self): method test_execute_with_llm_response (line 187) | def test_execute_with_llm_response(self): method test_execute_fallback_on_empty_llm (line 241) | def test_execute_fallback_on_empty_llm(self): class TestCodeGenAgent (line 261) | class TestCodeGenAgent: method test_template_bar_comparison (line 262) | def test_template_bar_comparison(self): method test_template_grouped_bar (line 290) | def test_template_grouped_bar(self): method test_template_heatmap (line 318) | def test_template_heatmap(self): method test_llm_fallback_for_unknown_type (line 343) | def test_llm_fallback_for_unknown_type(self): method test_strip_fences (line 367) | def test_strip_fences(self): method test_strip_fences_no_fences (line 372) | def test_strip_fences_no_fences(self): method test_multiple_figures (line 377) | def test_multiple_figures(self): class TestRendererAgent (line 409) | class TestRendererAgent: method test_render_simple_script (line 410) | def test_render_simple_script(self, tmp_path): method test_render_syntax_error (line 457) | def test_render_syntax_error(self, tmp_path): method test_render_empty_script (line 475) | def test_render_empty_script(self, tmp_path): method test_script_saved_for_reproducibility (line 490) | def test_script_saved_for_reproducibility(self, tmp_path): class TestCriticAgent (line 512) | class TestCriticAgent: method test_numerical_accuracy_pass (line 513) | def test_numerical_accuracy_pass(self): method test_numerical_accuracy_fail (line 525) | def test_numerical_accuracy_fail(self): method test_text_correctness_missing_labels (line 532) | def test_text_correctness_missing_labels(self): method test_text_correctness_all_present (line 541) | def test_text_correctness_all_present(self): method test_visual_quality_llm_review (line 554) | def test_visual_quality_llm_review(self): method test_visual_quality_low_score (line 567) | def test_visual_quality_low_score(self): method test_execute_full_review (line 577) | def test_execute_full_review(self): method test_review_failed_render (line 611) | def test_review_failed_render(self): class TestIntegratorAgent (line 631) | class TestIntegratorAgent: method test_build_manifest (line 632) | def test_build_manifest(self): method test_generate_markdown_refs (line 661) | def test_generate_markdown_refs(self): method test_generate_descriptions (line 675) | def test_generate_descriptions(self): method test_execute_empty (line 692) | def test_execute_empty(self): method test_execute_with_figures (line 703) | def test_execute_with_figures(self, tmp_path): method test_section_ordering (line 727) | def test_section_ordering(self): class TestOrchestrator (line 737) | class TestOrchestrator: method test_orchestrate_basic (line 738) | def test_orchestrate_basic(self, tmp_path): method test_figure_plan_serialization (line 820) | def test_figure_plan_serialization(self): method test_get_chart_files (line 831) | def test_get_chart_files(self): class TestFigureAgentConfig (line 847) | class TestFigureAgentConfig: method test_default_config (line 848) | def test_default_config(self): method test_parse_from_dict (line 858) | def test_parse_from_dict(self): method test_parse_from_dict_extended_fields (line 871) | def test_parse_from_dict_extended_fields(self): method test_parse_empty (line 888) | def test_parse_empty(self): method test_experiment_config_has_figure_agent (line 894) | def test_experiment_config_has_figure_agent(self): class TestBackwardCompatibility (line 905) | class TestBackwardCompatibility: method test_visualize_still_importable (line 906) | def test_visualize_still_importable(self): method test_figure_agent_importable (line 919) | def test_figure_agent_importable(self): FILE: tests/test_knowledge_graph.py function graph (line 33) | def graph() -> KnowledgeGraphBuilder: function populated_graph (line 38) | def populated_graph(graph: KnowledgeGraphBuilder) -> KnowledgeGraphBuilder: class TestEntity (line 72) | class TestEntity: method test_create_entity (line 73) | def test_create_entity(self) -> None: method test_to_dict (line 78) | def test_to_dict(self) -> None: method test_from_dict (line 84) | def test_from_dict(self) -> None: class TestRelation (line 90) | class TestRelation: method test_create_relation (line 91) | def test_create_relation(self) -> None: method test_to_dict (line 96) | def test_to_dict(self) -> None: method test_from_dict (line 102) | def test_from_dict(self) -> None: class TestKnowledgeGraphBuilder (line 111) | class TestKnowledgeGraphBuilder: method test_add_entity (line 112) | def test_add_entity(self, graph: KnowledgeGraphBuilder) -> None: method test_add_duplicate_updates (line 117) | def test_add_duplicate_updates(self, graph: KnowledgeGraphBuilder) -> ... method test_capacity_limit (line 127) | def test_capacity_limit(self) -> None: method test_add_relation (line 134) | def test_add_relation(self, graph: KnowledgeGraphBuilder) -> None: method test_add_relation_missing_entity (line 140) | def test_add_relation_missing_entity(self, graph: KnowledgeGraphBuilde... method test_duplicate_relation (line 144) | def test_duplicate_relation(self, graph: KnowledgeGraphBuilder) -> None: method test_get_entities_by_type (line 151) | def test_get_entities_by_type(self, populated_graph: KnowledgeGraphBui... method test_get_relations_for (line 155) | def test_get_relations_for(self, populated_graph: KnowledgeGraphBuilde... method test_remove_entity (line 159) | def test_remove_entity(self, populated_graph: KnowledgeGraphBuilder) -... method test_remove_nonexistent_entity (line 165) | def test_remove_nonexistent_entity(self, graph: KnowledgeGraphBuilder)... method test_convenience_methods (line 168) | def test_convenience_methods(self, graph: KnowledgeGraphBuilder) -> None: class TestGraphPersistence (line 180) | class TestGraphPersistence: method test_save_and_load (line 181) | def test_save_and_load(self, populated_graph: KnowledgeGraphBuilder, t... method test_load_nonexistent (line 191) | def test_load_nonexistent(self, graph: KnowledgeGraphBuilder, tmp_path... method test_load_malformed (line 194) | def test_load_malformed(self, graph: KnowledgeGraphBuilder, tmp_path: ... class TestKnowledgeGraphQuery (line 203) | class TestKnowledgeGraphQuery: method test_find_research_gaps (line 204) | def test_find_research_gaps(self, populated_graph: KnowledgeGraphBuild... method test_find_research_gaps_with_domain (line 210) | def test_find_research_gaps_with_domain(self, populated_graph: Knowled... method test_find_trending_methods (line 215) | def test_find_trending_methods(self, populated_graph: KnowledgeGraphBu... method test_get_method_comparison (line 220) | def test_get_method_comparison(self, populated_graph: KnowledgeGraphBu... method test_get_method_comparison_not_found (line 227) | def test_get_method_comparison_not_found(self, populated_graph: Knowle... method test_suggest_topics (line 232) | def test_suggest_topics(self, populated_graph: KnowledgeGraphBuilder) ... method test_suggest_topics_empty_interests (line 237) | def test_suggest_topics_empty_interests(self, populated_graph: Knowled... class TestVisualizer (line 246) | class TestVisualizer: method test_export_dot (line 247) | def test_export_dot(self, populated_graph: KnowledgeGraphBuilder, tmp_... method test_export_cytoscape (line 255) | def test_export_cytoscape(self, populated_graph: KnowledgeGraphBuilder... method test_graph_summary (line 263) | def test_graph_summary(self, populated_graph: KnowledgeGraphBuilder) -... FILE: tests/test_mcp.py class TestMCPTools (line 21) | class TestMCPTools: method test_tool_definitions_not_empty (line 22) | def test_tool_definitions_not_empty(self) -> None: method test_all_tools_have_required_fields (line 25) | def test_all_tools_have_required_fields(self) -> None: method test_get_tool_schema_exists (line 32) | def test_get_tool_schema_exists(self) -> None: method test_get_tool_schema_missing (line 37) | def test_get_tool_schema_missing(self) -> None: method test_list_tool_names (line 40) | def test_list_tool_names(self) -> None: method test_run_pipeline_requires_topic (line 46) | def test_run_pipeline_requires_topic(self) -> None: method test_get_paper_has_format_enum (line 51) | def test_get_paper_has_format_enum(self) -> None: class TestMCPServer (line 64) | class TestMCPServer: method test_get_tools (line 65) | def test_get_tools(self) -> None: method test_handle_unknown_tool (line 72) | def test_handle_unknown_tool(self) -> None: method test_handle_run_pipeline (line 78) | def test_handle_run_pipeline(self) -> None: method test_handle_get_status_missing_run (line 84) | def test_handle_get_status_missing_run(self) -> None: method test_handle_search_literature (line 89) | def test_handle_search_literature(self) -> None: method test_handle_review_paper (line 94) | def test_handle_review_paper(self) -> None: method test_start_stop (line 99) | def test_start_stop(self) -> None: method test_handle_get_results_missing (line 111) | def test_handle_get_results_missing(self) -> None: method test_handle_get_paper_missing (line 116) | def test_handle_get_paper_missing(self) -> None: class TestMCPClient (line 127) | class TestMCPClient: method test_init (line 128) | def test_init(self) -> None: method test_connect_disconnect (line 133) | def test_connect_disconnect(self) -> None: method test_list_tools_not_connected (line 144) | def test_list_tools_not_connected(self) -> None: method test_call_tool_not_connected (line 149) | def test_call_tool_not_connected(self) -> None: method test_list_resources_not_connected (line 154) | def test_list_resources_not_connected(self) -> None: method test_read_resource_not_connected (line 159) | def test_read_resource_not_connected(self) -> None: method test_list_tools_connected (line 164) | def test_list_tools_connected(self) -> None: method test_tools_cached (line 174) | def test_tools_cached(self) -> None: class TestMCPServerRegistry (line 192) | class TestMCPServerRegistry: method test_register_and_list (line 193) | def test_register_and_list(self) -> None: method test_unregister (line 204) | def test_unregister(self) -> None: method test_get (line 214) | def test_get(self) -> None: method test_get_missing (line 224) | def test_get_missing(self) -> None: method test_close_all (line 228) | def test_close_all(self) -> None: class TestSSETransport (line 245) | class TestSSETransport: method test_start_stop (line 246) | def test_start_stop(self) -> None: method test_receive_not_implemented (line 257) | def test_receive_not_implemented(self) -> None: FILE: tests/test_memory_system.py function tmp_store_dir (line 35) | def tmp_store_dir(tmp_path: Path) -> Path: function store (line 42) | def store(tmp_store_dir: Path) -> MemoryStore: function populated_store (line 47) | def populated_store(store: MemoryStore) -> MemoryStore: function embedding_fn (line 57) | def embedding_fn() -> object: class TestMemoryStoreCRUD (line 71) | class TestMemoryStoreCRUD: method test_add_entry (line 72) | def test_add_entry(self, store: MemoryStore) -> None: method test_add_invalid_category (line 77) | def test_add_invalid_category(self, store: MemoryStore) -> None: method test_add_all_categories (line 81) | def test_add_all_categories(self, store: MemoryStore) -> None: method test_get_entry (line 86) | def test_get_entry(self, store: MemoryStore) -> None: method test_get_nonexistent (line 93) | def test_get_nonexistent(self, store: MemoryStore) -> None: method test_get_all_no_filter (line 96) | def test_get_all_no_filter(self, populated_store: MemoryStore) -> None: method test_get_all_with_filter (line 100) | def test_get_all_with_filter(self, populated_store: MemoryStore) -> None: method test_update_confidence_success (line 104) | def test_update_confidence_success(self, store: MemoryStore) -> None: method test_update_confidence_clamp_high (line 111) | def test_update_confidence_clamp_high(self, store: MemoryStore) -> None: method test_update_confidence_clamp_low (line 118) | def test_update_confidence_clamp_low(self, store: MemoryStore) -> None: method test_update_confidence_nonexistent (line 125) | def test_update_confidence_nonexistent(self, store: MemoryStore) -> None: method test_mark_accessed (line 128) | def test_mark_accessed(self, store: MemoryStore) -> None: method test_capacity_enforcement (line 138) | def test_capacity_enforcement(self, tmp_store_dir: Path) -> None: method test_count_empty (line 148) | def test_count_empty(self, store: MemoryStore) -> None: class TestMemoryPersistence (line 156) | class TestMemoryPersistence: method test_save_and_load (line 157) | def test_save_and_load(self, tmp_store_dir: Path) -> None: method test_save_creates_directory (line 168) | def test_save_creates_directory(self, tmp_path: Path) -> None: method test_load_empty_dir (line 175) | def test_load_empty_dir(self, tmp_store_dir: Path) -> None: method test_load_malformed_jsonl (line 179) | def test_load_malformed_jsonl(self, tmp_store_dir: Path) -> None: method test_roundtrip_preserves_data (line 188) | def test_roundtrip_preserves_data(self, tmp_store_dir: Path) -> None: class TestMemoryPrune (line 211) | class TestMemoryPrune: method test_prune_low_confidence (line 212) | def test_prune_low_confidence(self, store: MemoryStore) -> None: method test_prune_nothing_to_remove (line 219) | def test_prune_nothing_to_remove(self, store: MemoryStore) -> None: class TestMemoryEntry (line 228) | class TestMemoryEntry: method test_to_dict (line 229) | def test_to_dict(self) -> None: method test_from_dict (line 241) | def test_from_dict(self) -> None: method test_from_dict_defaults (line 253) | def test_from_dict_defaults(self) -> None: class TestTimeDecay (line 263) | class TestTimeDecay: method test_fresh_entry (line 264) | def test_fresh_entry(self) -> None: method test_half_life (line 269) | def test_half_life(self) -> None: method test_expired (line 275) | def test_expired(self) -> None: method test_future_timestamp (line 281) | def test_future_timestamp(self) -> None: method test_naive_datetime (line 287) | def test_naive_datetime(self) -> None: class TestConfidenceUpdate (line 294) | class TestConfidenceUpdate: method test_increase (line 295) | def test_increase(self) -> None: method test_decrease (line 298) | def test_decrease(self) -> None: method test_clamp_ceiling (line 301) | def test_clamp_ceiling(self) -> None: method test_clamp_floor (line 304) | def test_clamp_floor(self) -> None: class TestEmbeddings (line 311) | class TestEmbeddings: method test_tfidf_fallback (line 312) | def test_tfidf_fallback(self) -> None: method test_tfidf_normalized (line 318) | def test_tfidf_normalized(self) -> None: method test_tfidf_empty (line 324) | def test_tfidf_empty(self) -> None: method test_tokenize (line 332) | def test_tokenize(self) -> None: method test_hash_token_deterministic (line 338) | def test_hash_token_deterministic(self) -> None: method test_embed_batch (line 343) | def test_embed_batch(self) -> None: method test_backend_detection (line 348) | def test_backend_detection(self) -> None: class TestRetriever (line 357) | class TestRetriever: method test_cosine_similarity_identical (line 358) | def test_cosine_similarity_identical(self) -> None: method test_cosine_similarity_orthogonal (line 362) | def test_cosine_similarity_orthogonal(self) -> None: method test_cosine_similarity_opposite (line 367) | def test_cosine_similarity_opposite(self) -> None: method test_cosine_similarity_empty (line 372) | def test_cosine_similarity_empty(self) -> None: method test_cosine_similarity_mismatched_length (line 375) | def test_cosine_similarity_mismatched_length(self) -> None: method test_recall_empty_store (line 378) | def test_recall_empty_store(self, store: MemoryStore) -> None: method test_recall_returns_results (line 383) | def test_recall_returns_results(self, store: MemoryStore) -> None: method test_recall_respects_top_k (line 391) | def test_recall_respects_top_k(self, store: MemoryStore) -> None: method test_format_for_prompt (line 398) | def test_format_for_prompt(self, store: MemoryStore) -> None: method test_format_for_prompt_empty (line 405) | def test_format_for_prompt_empty(self, store: MemoryStore) -> None: class TestIdeationMemory (line 414) | class TestIdeationMemory: method test_record_topic_success (line 415) | def test_record_topic_success(self, store: MemoryStore, embedding_fn: ... method test_record_topic_failure (line 422) | def test_record_topic_failure(self, store: MemoryStore) -> None: method test_record_hypothesis (line 429) | def test_record_hypothesis(self, store: MemoryStore) -> None: method test_get_anti_patterns (line 435) | def test_get_anti_patterns(self, store: MemoryStore) -> None: method test_recall_similar_topics_empty (line 444) | def test_recall_similar_topics_empty(self, store: MemoryStore) -> None: class TestExperimentMemory (line 454) | class TestExperimentMemory: method test_record_hyperparams (line 455) | def test_record_hyperparams(self, store: MemoryStore) -> None: method test_record_architecture (line 461) | def test_record_architecture(self, store: MemoryStore) -> None: method test_record_training_trick (line 468) | def test_record_training_trick(self, store: MemoryStore) -> None: method test_recall_best_configs_empty (line 475) | def test_recall_best_configs_empty(self, store: MemoryStore) -> None: class TestWritingMemory (line 485) | class TestWritingMemory: method test_record_review_feedback (line 486) | def test_record_review_feedback(self, store: MemoryStore) -> None: method test_record_successful_structure (line 492) | def test_record_successful_structure(self, store: MemoryStore) -> None: method test_recall_writing_tips_empty (line 499) | def test_recall_writing_tips_empty(self, store: MemoryStore) -> None: FILE: tests/test_metaclaw_bridge/test_config.py function _minimal_config_data (line 6) | def _minimal_config_data(**overrides): function test_metaclaw_bridge_defaults (line 26) | def test_metaclaw_bridge_defaults(): function test_metaclaw_bridge_enabled (line 36) | def test_metaclaw_bridge_enabled(): function test_metaclaw_bridge_none_is_default (line 68) | def test_metaclaw_bridge_none_is_default(): FILE: tests/test_metaclaw_bridge/test_lesson_to_skill.py function _make_lesson (line 16) | def _make_lesson(stage: str = "experiment_run", severity: str = "error")... function test_format_lessons (line 28) | def test_format_lessons(): function test_list_existing_skills (line 36) | def test_list_existing_skills(tmp_path): function test_list_existing_skills_missing_dir (line 46) | def test_list_existing_skills_missing_dir(): function test_parse_skills_response_valid (line 51) | def test_parse_skills_response_valid(): function test_parse_skills_response_with_code_fence (line 65) | def test_parse_skills_response_with_code_fence(): function test_parse_skills_response_invalid (line 78) | def test_parse_skills_response_invalid(): function test_write_skill (line 83) | def test_write_skill(tmp_path): FILE: tests/test_metaclaw_bridge/test_prm_gate.py function test_gate_instructions_cover_expected_stages (line 11) | def test_gate_instructions_cover_expected_stages(): function test_should_gate (line 19) | def test_should_gate(): function test_from_bridge_config_disabled (line 32) | def test_from_bridge_config_disabled(): function test_from_bridge_config_enabled (line 39) | def test_from_bridge_config_enabled(): function test_evaluate_stage_majority_pass (line 57) | def test_evaluate_stage_majority_pass(mock_call): function test_evaluate_stage_majority_fail (line 70) | def test_evaluate_stage_majority_fail(mock_call): function test_evaluate_stage_all_failed (line 83) | def test_evaluate_stage_all_failed(mock_call): FILE: tests/test_metaclaw_bridge/test_session.py function test_session_creation (line 6) | def test_session_creation(): function test_session_headers (line 12) | def test_session_headers(): function test_session_headers_no_stage (line 20) | def test_session_headers_no_stage(): function test_session_end (line 26) | def test_session_end(): FILE: tests/test_metaclaw_bridge/test_skill_feedback.py function test_append_and_load (line 12) | def test_append_and_load(tmp_path): function test_append_many (line 29) | def test_append_many(tmp_path): function test_compute_stats (line 39) | def test_compute_stats(tmp_path): function test_record_stage_skills (line 57) | def test_record_stage_skills(tmp_path): function test_empty_store (line 72) | def test_empty_store(tmp_path): FILE: tests/test_metaclaw_bridge/test_stage_skill_map.py function test_all_23_stages_mapped (line 10) | def test_all_23_stages_mapped(): function test_stage_config_has_required_keys (line 26) | def test_stage_config_has_required_keys(): function test_get_stage_config_known (line 37) | def test_get_stage_config_known(): function test_get_stage_config_unknown_returns_default (line 43) | def test_get_stage_config_unknown_returns_default(): function test_lesson_category_mapping_complete (line 49) | def test_lesson_category_mapping_complete(): FILE: tests/test_metric_parser.py function parser (line 18) | def parser(): function tmp_run_dir (line 23) | def tmp_run_dir(tmp_path): class TestJSONParsing (line 32) | class TestJSONParsing: method test_parse_comparison_results (line 33) | def test_parse_comparison_results(self, parser, tmp_run_dir): method test_parse_convergence_results (line 60) | def test_parse_convergence_results(self, parser, tmp_run_dir): method test_parse_regression_table (line 85) | def test_parse_regression_table(self, parser, tmp_run_dir): method test_parse_top_level_scalars (line 102) | def test_parse_top_level_scalars(self, parser, tmp_run_dir): method test_skip_nan_inf (line 110) | def test_skip_nan_inf(self, parser, tmp_run_dir): method test_invalid_json_falls_through (line 126) | def test_invalid_json_falls_through(self, parser, tmp_run_dir): class TestCSVParsing (line 138) | class TestCSVParsing: method test_parse_condition_csv (line 139) | def test_parse_condition_csv(self, parser, tmp_run_dir): method test_parse_convergence_csv (line 148) | def test_parse_convergence_csv(self, parser, tmp_run_dir): method test_csv_skip_invalid (line 157) | def test_csv_skip_invalid(self, parser, tmp_run_dir): class TestStdoutParsing (line 171) | class TestStdoutParsing: method test_parse_plain_metrics (line 172) | def test_parse_plain_metrics(self, parser, tmp_run_dir): method test_parse_condition_metrics (line 178) | def test_parse_condition_metrics(self, parser, tmp_run_dir): method test_fallback_to_stdout_log (line 184) | def test_fallback_to_stdout_log(self, parser, tmp_run_dir): class TestExperimentResults (line 196) | class TestExperimentResults: method test_to_flat_metrics_empty (line 197) | def test_to_flat_metrics_empty(self): method test_to_flat_metrics_scalars (line 201) | def test_to_flat_metrics_scalars(self): method test_to_flat_metrics_conditions (line 207) | def test_to_flat_metrics_conditions(self): method test_to_flat_metrics_convergence (line 216) | def test_to_flat_metrics_convergence(self): method test_to_flat_metrics_regression (line 229) | def test_to_flat_metrics_regression(self): class TestParsePriority (line 244) | class TestParsePriority: method test_json_takes_priority_over_csv (line 245) | def test_json_takes_priority_over_csv(self, parser, tmp_run_dir): method test_csv_takes_priority_over_stdout (line 252) | def test_csv_takes_priority_over_stdout(self, parser, tmp_run_dir): method test_empty_json_falls_to_csv (line 258) | def test_empty_json_falls_to_csv(self, parser, tmp_run_dir): class TestMetricType (line 271) | class TestMetricType: method test_values (line 272) | def test_values(self): FILE: tests/test_minimax_provider.py class _DummyHTTPResponse (line 25) | class _DummyHTTPResponse: method __init__ (line 28) | def __init__(self, payload: Mapping[str, Any]): method read (line 31) | def read(self) -> bytes: method __enter__ (line 34) | def __enter__(self) -> _DummyHTTPResponse: method __exit__ (line 37) | def __exit__(self, *a: object) -> None: function _make_minimax_client (line 41) | def _make_minimax_client( class TestMiniMaxPreset (line 61) | class TestMiniMaxPreset: method test_minimax_in_provider_presets (line 64) | def test_minimax_in_provider_presets(self): method test_minimax_base_url (line 67) | def test_minimax_base_url(self): class TestMiniMaxFromRCConfig (line 76) | class TestMiniMaxFromRCConfig: method test_from_rc_config_sets_minimax_base_url (line 79) | def test_from_rc_config_sets_minimax_base_url(self): method test_from_rc_config_reads_minimax_api_key_from_env (line 96) | def test_from_rc_config_reads_minimax_api_key_from_env(self, monkeypat... method test_from_rc_config_custom_base_url_overrides_preset (line 111) | def test_from_rc_config_custom_base_url_overrides_preset(self): class TestMiniMaxTemperatureClamping (line 131) | class TestMiniMaxTemperatureClamping: method _capture_body (line 134) | def _capture_body( method test_temperature_above_one_clamped (line 158) | def test_temperature_above_one_clamped(self, monkeypatch): method test_temperature_within_range_unchanged (line 163) | def test_temperature_within_range_unchanged(self, monkeypatch): method test_temperature_zero_allowed (line 168) | def test_temperature_zero_allowed(self, monkeypatch): method test_temperature_negative_clamped_to_zero (line 173) | def test_temperature_negative_clamped_to_zero(self, monkeypatch): method test_non_minimax_url_no_clamping (line 178) | def test_non_minimax_url_no_clamping(self, monkeypatch): class TestMiniMaxModelChain (line 204) | class TestMiniMaxModelChain: method test_model_chain_default (line 207) | def test_model_chain_default(self): method test_model_chain_custom_fallbacks (line 211) | def test_model_chain_custom_fallbacks(self): class TestMiniMaxRawCall (line 228) | class TestMiniMaxRawCall: method test_request_body_structure (line 231) | def test_request_body_structure(self, monkeypatch): method test_json_mode_adds_response_format (line 262) | def test_json_mode_adds_response_format(self, monkeypatch): class TestMiniMaxCLI (line 288) | class TestMiniMaxCLI: method test_minimax_in_provider_choices (line 291) | def test_minimax_in_provider_choices(self): method test_minimax_in_provider_urls (line 297) | def test_minimax_in_provider_urls(self): method test_minimax_in_provider_models (line 302) | def test_minimax_in_provider_models(self): class TestMiniMaxFactory (line 315) | class TestMiniMaxFactory: method test_create_llm_client_returns_llm_client (line 318) | def test_create_llm_client_returns_llm_client(self): class TestMiniMaxChatFallback (line 342) | class TestMiniMaxChatFallback: method test_fallback_to_highspeed_on_primary_failure (line 345) | def test_fallback_to_highspeed_on_primary_failure(self, monkeypatch): class TestMiniMaxLiveAPI (line 377) | class TestMiniMaxLiveAPI: method _live_client (line 380) | def _live_client(self) -> LLMClient: method test_simple_chat_completion (line 392) | def test_simple_chat_completion(self): method test_json_mode (line 402) | def test_json_mode(self): method test_preflight_check (line 423) | def test_preflight_check(self): FILE: tests/test_neuroscience_domain.py class TestNeuroscienceProfiles (line 32) | class TestNeuroscienceProfiles: method setup_method (line 33) | def setup_method(self): method test_computational_profile_exists (line 36) | def test_computational_profile_exists(self): method test_computational_profile_fields (line 42) | def test_computational_profile_fields(self): method test_computational_profile_baselines (line 50) | def test_computational_profile_baselines(self): method test_imaging_profile_exists (line 57) | def test_imaging_profile_exists(self): method test_imaging_profile_fields (line 63) | def test_imaging_profile_fields(self): class TestNeuroscienceKeywordDetection (line 76) | class TestNeuroscienceKeywordDetection: method test_spiking_network (line 77) | def test_spiking_network(self): method test_brian2 (line 80) | def test_brian2(self): method test_hodgkin_huxley (line 83) | def test_hodgkin_huxley(self): method test_integrate_and_fire (line 86) | def test_integrate_and_fire(self): method test_izhikevich (line 89) | def test_izhikevich(self): method test_neural_decoding (line 92) | def test_neural_decoding(self): method test_firing_rate (line 95) | def test_firing_rate(self): method test_fmri (line 98) | def test_fmri(self): method test_eeg (line 101) | def test_eeg(self): method test_nilearn (line 104) | def test_nilearn(self): method test_mne_python (line 107) | def test_mne_python(self): method test_generic_neuroscience (line 110) | def test_generic_neuroscience(self): method test_detect_domain_integration (line 114) | def test_detect_domain_integration(self): method test_detect_domain_id_shortcut (line 118) | def test_detect_domain_id_shortcut(self): class TestNeuroscienceAdapter (line 128) | class TestNeuroscienceAdapter: method test_computational_gets_neuroscience_adapter (line 129) | def test_computational_gets_neuroscience_adapter(self): method test_imaging_gets_neuroscience_adapter (line 140) | def test_imaging_gets_neuroscience_adapter(self): method test_code_generation_blocks_nonempty (line 147) | def test_code_generation_blocks_nonempty(self): method test_experiment_design_blocks (line 157) | def test_experiment_design_blocks(self): method test_result_analysis_blocks (line 167) | def test_result_analysis_blocks(self): method test_blueprint_context (line 175) | def test_blueprint_context(self): FILE: tests/test_opencode_bridge.py class TestComplexityScorer (line 27) | class TestComplexityScorer: method test_low_complexity_simple_classification (line 30) | def test_low_complexity_simple_classification(self): method test_high_complexity_multimodal_gan (line 41) | def test_high_complexity_multimodal_gan(self): method test_historical_failures_boost_score (line 62) | def test_historical_failures_boost_score(self): method test_empty_plan_returns_zero (line 72) | def test_empty_plan_returns_zero(self): method test_threshold_boundary (line 78) | def test_threshold_boundary(self): method test_signals_all_present (line 93) | def test_signals_all_present(self): method test_score_clamped_to_unit_interval (line 105) | def test_score_clamped_to_unit_interval(self): method test_domain_complexity_keywords (line 117) | def test_domain_complexity_keywords(self): class TestOpenCodeBridge (line 128) | class TestOpenCodeBridge: method test_check_available_returns_false_when_not_installed (line 131) | def test_check_available_returns_false_when_not_installed(self): method test_check_available_returns_false_on_timeout (line 138) | def test_check_available_returns_false_on_timeout(self): method test_check_available_returns_true (line 148) | def test_check_available_returns_true(self): method test_workspace_creates_correct_files (line 161) | def test_workspace_creates_correct_files(self, tmp_path): method test_opencode_config_azure_format (line 184) | def test_opencode_config_azure_format(self, tmp_path): method test_opencode_config_openai_format (line 209) | def test_opencode_config_openai_format(self, tmp_path): method test_opencode_config_preserves_prefixed_model (line 228) | def test_opencode_config_preserves_prefixed_model(self, tmp_path): method test_resolve_model_azure_uses_openai_prefix (line 249) | def test_resolve_model_azure_uses_openai_prefix(self): method test_resolve_model_preserves_explicit_prefix (line 259) | def test_resolve_model_preserves_explicit_prefix(self): method test_resolve_model_no_model_default (line 269) | def test_resolve_model_no_model_default(self): method test_collect_files_ignores_pycache (line 274) | def test_collect_files_ignores_pycache(self, tmp_path): method test_collect_files_includes_requirements (line 286) | def test_collect_files_includes_requirements(self, tmp_path): method test_collect_files_flattens_subdirectories (line 293) | def test_collect_files_flattens_subdirectories(self, tmp_path): method test_collect_files_root_takes_priority_over_subdir (line 307) | def test_collect_files_root_takes_priority_over_subdir(self, tmp_path): method test_generate_returns_error_on_not_installed (line 316) | def test_generate_returns_error_on_not_installed(self, tmp_path): method test_generate_returns_error_on_cli_failure (line 328) | def test_generate_returns_error_on_cli_failure(self, tmp_path): method test_generate_success (line 346) | def test_generate_success(self, tmp_path): method test_invoke_opencode_uses_resolved_path (line 367) | def test_invoke_opencode_uses_resolved_path(self, tmp_path): class TestHasMainGuard (line 392) | class TestHasMainGuard: method test_with_guard (line 395) | def test_with_guard(self): method test_without_guard (line 399) | def test_without_guard(self): method test_syntax_error (line 403) | def test_syntax_error(self): method test_empty (line 406) | def test_empty(self): method test_single_quote_guard (line 409) | def test_single_quote_guard(self): class TestEnsureMainEntryPoint (line 414) | class TestEnsureMainEntryPoint: method test_already_has_guard_unchanged (line 417) | def test_already_has_guard_unchanged(self): method test_no_main_py_unchanged (line 425) | def test_no_main_py_unchanged(self): method test_swap_entry_point_from_other_file (line 430) | def test_swap_entry_point_from_other_file(self): method test_inject_entry_for_main_function (line 449) | def test_inject_entry_for_main_function(self): method test_inject_entry_for_run_function (line 457) | def test_inject_entry_for_run_function(self): method test_no_known_entry_function_warns (line 465) | def test_no_known_entry_function_warns(self): method test_non_py_files_not_checked (line 473) | def test_non_py_files_not_checked(self): method test_swap_preserves_other_files (line 485) | def test_swap_preserves_other_files(self): class TestOpenCodeConfig (line 504) | class TestOpenCodeConfig: method test_default_values (line 507) | def test_default_values(self): method test_parse_from_dict (line 517) | def test_parse_from_dict(self): method test_empty_dict_returns_default (line 536) | def test_empty_dict_returns_default(self): class TestCountHistoricalFailures (line 546) | class TestCountHistoricalFailures: method test_no_failures (line 547) | def test_no_failures(self, tmp_path): method test_counts_beast_mode_failures (line 550) | def test_counts_beast_mode_failures(self, tmp_path): method test_counts_validation_failures (line 556) | def test_counts_validation_failures(self, tmp_path): method test_deduplicates_multiple_failure_indicators (line 562) | def test_deduplicates_multiple_failure_indicators(self, tmp_path): FILE: tests/test_overleaf.py class TestConflictResolver (line 22) | class TestConflictResolver: method test_no_conflicts (line 23) | def test_no_conflicts(self, tmp_path: Path) -> None: method test_has_conflicts (line 28) | def test_has_conflicts(self, tmp_path: Path) -> None: method test_detect_conflicts (line 41) | def test_detect_conflicts(self, tmp_path: Path) -> None: method test_resolve_ours (line 56) | def test_resolve_ours(self, tmp_path: Path) -> None: method test_resolve_theirs (line 75) | def test_resolve_theirs(self, tmp_path: Path) -> None: method test_multiple_conflicts (line 90) | def test_multiple_conflicts(self, tmp_path: Path) -> None: class TestConflictHelpers (line 110) | class TestConflictHelpers: method test_extract_conflicts_empty (line 111) | def test_extract_conflicts_empty(self) -> None: method test_resolve_content_ours (line 114) | def test_resolve_content_ours(self) -> None: method test_resolve_content_theirs (line 120) | def test_resolve_content_theirs(self) -> None: class TestFileWatcher (line 132) | class TestFileWatcher: method test_no_changes_initially (line 133) | def test_no_changes_initially(self, tmp_path: Path) -> None: method test_detect_new_file (line 138) | def test_detect_new_file(self, tmp_path: Path) -> None: method test_detect_modified_file (line 144) | def test_detect_modified_file(self, tmp_path: Path) -> None: method test_detect_deleted_file (line 155) | def test_detect_deleted_file(self, tmp_path: Path) -> None: method test_only_watches_extensions (line 163) | def test_only_watches_extensions(self, tmp_path: Path) -> None: method test_nonexistent_dir (line 169) | def test_nonexistent_dir(self, tmp_path: Path) -> None: class TestLatexFormatter (line 179) | class TestLatexFormatter: method test_normalize_paths (line 180) | def test_normalize_paths(self) -> None: method test_ensure_document_class_adds (line 186) | def test_ensure_document_class_adds(self) -> None: method test_ensure_document_class_noop (line 191) | def test_ensure_document_class_noop(self) -> None: method test_strip_local_comments (line 196) | def test_strip_local_comments(self) -> None: method test_fix_encoding (line 203) | def test_fix_encoding(self) -> None: method test_fix_encoding_noop (line 208) | def test_fix_encoding_noop(self) -> None: method test_format_for_overleaf (line 213) | def test_format_for_overleaf(self, tmp_path: Path) -> None: class TestOverleafSync (line 227) | class TestOverleafSync: method test_init (line 228) | def test_init(self) -> None: method test_get_status_before_setup (line 234) | def test_get_status_before_setup(self) -> None: method test_push_before_setup_raises (line 240) | def test_push_before_setup_raises(self, tmp_path: Path) -> None: method test_pull_before_setup_raises (line 245) | def test_pull_before_setup_raises(self) -> None: method test_resolve_before_setup_raises (line 250) | def test_resolve_before_setup_raises(self) -> None: method test_setup_clones (line 256) | def test_setup_clones(self, mock_run: MagicMock, tmp_path: Path) -> None: FILE: tests/test_paper_verifier.py function _make_registry (line 23) | def _make_registry(**kwargs) -> VerifiedRegistry: class TestCleanPaper (line 42) | class TestCleanPaper: method test_all_numbers_verified_passes (line 43) | def test_all_numbers_verified_passes(self): method test_common_constants_allowed (line 68) | def test_common_constants_allowed(self): method test_year_numbers_allowed (line 78) | def test_year_numbers_allowed(self): class TestFabricatedNumbers (line 93) | class TestFabricatedNumbers: method test_fabricated_in_results_rejects (line 94) | def test_fabricated_in_results_rejects(self): method test_fabricated_in_table_rejects (line 107) | def test_fabricated_in_table_rejects(self): method test_fabricated_in_discussion_warns (line 120) | def test_fabricated_in_discussion_warns(self): method test_numbers_in_cite_skipped (line 131) | def test_numbers_in_cite_skipped(self): method test_numbers_in_comments_skipped (line 140) | def test_numbers_in_comments_skipped(self): class TestFabricatedConditions (line 156) | class TestFabricatedConditions: method test_unknown_condition_in_table (line 157) | def test_unknown_condition_in_table(self): class TestFabricationRate (line 180) | class TestFabricationRate: method test_rate_zero_for_clean_paper (line 181) | def test_rate_zero_for_clean_paper(self): method test_rate_nonzero_for_fabricated (line 190) | def test_rate_nonzero_for_fabricated(self): class TestRealPapers (line 205) | class TestRealPapers: method _load (line 206) | def _load(self, run_id: str) -> tuple[str, VerifiedRegistry]: method test_run_e57360_severe_fabrication_detected (line 225) | def test_run_e57360_severe_fabrication_detected(self): method test_run_6a1ec9_severe_fabrication_detected (line 236) | def test_run_6a1ec9_severe_fabrication_detected(self): method test_run_85fefc_fabrication_detected (line 242) | def test_run_85fefc_fabrication_detected(self): method test_run_acbdfa_moderate_fabrication (line 249) | def test_run_acbdfa_moderate_fabrication(self): FILE: tests/test_project_manager.py function tmp_projects (line 21) | def tmp_projects(tmp_path: Path) -> Path: function manager (line 26) | def manager(tmp_projects: Path) -> ProjectManager: function config_yaml (line 31) | def config_yaml(tmp_path: Path) -> Path: function pool_path (line 38) | def pool_path(tmp_path: Path) -> Path: class TestProjectModel (line 47) | class TestProjectModel: method test_to_dict_roundtrip (line 48) | def test_to_dict_roundtrip(self) -> None: method test_from_dict_defaults (line 56) | def test_from_dict_defaults(self) -> None: method test_from_dict_with_iso_date (line 62) | def test_from_dict_with_iso_date(self) -> None: class TestIdeaModel (line 78) | class TestIdeaModel: method test_score_calculation (line 79) | def test_score_calculation(self) -> None: method test_score_weighted (line 83) | def test_score_weighted(self) -> None: method test_to_dict_roundtrip (line 87) | def test_to_dict_roundtrip(self) -> None: class TestProjectManager (line 100) | class TestProjectManager: method test_create_project (line 101) | def test_create_project(self, manager: ProjectManager, config_yaml: Pa... method test_create_sets_active (line 107) | def test_create_sets_active(self, manager: ProjectManager, config_yaml... method test_create_duplicate_raises (line 112) | def test_create_duplicate_raises(self, manager: ProjectManager, config... method test_delete_project (line 117) | def test_delete_project(self, manager: ProjectManager, config_yaml: Pa... method test_delete_unknown_raises (line 122) | def test_delete_unknown_raises(self, manager: ProjectManager) -> None: method test_get_project (line 126) | def test_get_project(self, manager: ProjectManager, config_yaml: Path)... method test_get_unknown_raises (line 131) | def test_get_unknown_raises(self, manager: ProjectManager) -> None: method test_list_all_sorted (line 135) | def test_list_all_sorted(self, manager: ProjectManager, config_yaml: P... method test_get_status (line 143) | def test_get_status(self, manager: ProjectManager, config_yaml: Path) ... method test_switch_project (line 150) | def test_switch_project(self, manager: ProjectManager, config_yaml: Pa... method test_switch_unknown_raises (line 157) | def test_switch_unknown_raises(self, manager: ProjectManager) -> None: method test_compare_projects (line 161) | def test_compare_projects(self, manager: ProjectManager, config_yaml: ... method test_start_run (line 170) | def test_start_run(self, manager: ProjectManager, config_yaml: Path) -... method test_finish_run (line 176) | def test_finish_run(self, manager: ProjectManager, config_yaml: Path) ... method test_registry_persistence (line 184) | def test_registry_persistence(self, tmp_projects: Path, config_yaml: P... method test_delete_switches_active (line 192) | def test_delete_switches_active(self, manager: ProjectManager, config_... method test_config_copied_to_project_dir (line 201) | def test_config_copied_to_project_dir(self, manager: ProjectManager, c... class TestProjectScheduler (line 213) | class TestProjectScheduler: method test_enqueue_and_next (line 214) | def test_enqueue_and_next(self, manager: ProjectManager, config_yaml: ... method test_concurrency_limit (line 221) | def test_concurrency_limit(self, manager: ProjectManager, config_yaml:... method test_mark_done_frees_slot (line 230) | def test_mark_done_frees_slot(self, manager: ProjectManager, config_ya... method test_priority_order (line 241) | def test_priority_order(self, manager: ProjectManager, config_yaml: Pa... method test_enqueue_unknown_raises (line 251) | def test_enqueue_unknown_raises(self, manager: ProjectManager) -> None: method test_duplicate_enqueue_ignored (line 256) | def test_duplicate_enqueue_ignored(self, manager: ProjectManager, conf... method test_get_status (line 263) | def test_get_status(self, manager: ProjectManager, config_yaml: Path) ... method test_can_start_empty_queue (line 271) | def test_can_start_empty_queue(self, manager: ProjectManager) -> None: class TestIdeaPool (line 281) | class TestIdeaPool: method test_add_idea (line 282) | def test_add_idea(self, pool_path: Path) -> None: method test_remove_idea (line 288) | def test_remove_idea(self, pool_path: Path) -> None: method test_remove_unknown_raises (line 294) | def test_remove_unknown_raises(self, pool_path: Path) -> None: method test_get_idea (line 299) | def test_get_idea(self, pool_path: Path) -> None: method test_evaluate (line 305) | def test_evaluate(self, pool_path: Path) -> None: method test_evaluate_clamps_values (line 313) | def test_evaluate_clamps_values(self, pool_path: Path) -> None: method test_rank (line 320) | def test_rank(self, pool_path: Path) -> None: method test_list_all (line 329) | def test_list_all(self, pool_path: Path) -> None: method test_persistence (line 335) | def test_persistence(self, pool_path: Path) -> None: method test_to_project (line 342) | def test_to_project(self, pool_path: Path, tmp_path: Path, config_yaml... FILE: tests/test_prompt_adapter.py class TestPromptBlocks (line 23) | class TestPromptBlocks: method test_default_empty (line 24) | def test_default_empty(self): method test_all_fields (line 30) | def test_all_fields(self): class TestMLPromptAdapter (line 50) | class TestMLPromptAdapter: method test_returns_empty_blocks (line 51) | def test_returns_empty_blocks(self): method test_all_methods_return_empty (line 63) | def test_all_methods_return_empty(self): class TestGenericPromptAdapter (line 87) | class TestGenericPromptAdapter: method test_provides_code_hints (line 88) | def test_provides_code_hints(self): method test_convergence_hints (line 98) | def test_convergence_hints(self): method test_progressive_spec_hints (line 108) | def test_progressive_spec_hints(self): method test_experiment_design_has_terminology (line 118) | def test_experiment_design_has_terminology(self): class TestPhysicsAdapter (line 136) | class TestPhysicsAdapter: method test_physics_adapter_loaded (line 137) | def test_physics_adapter_loaded(self): method test_physics_code_blocks_nonempty (line 144) | def test_physics_code_blocks_nonempty(self): class TestEconomicsAdapter (line 158) | class TestEconomicsAdapter: method test_economics_adapter_loaded (line 159) | def test_economics_adapter_loaded(self): method test_economics_design_blocks (line 166) | def test_economics_design_blocks(self): class TestGetAdapter (line 180) | class TestGetAdapter: method test_ml_domains_get_ml_adapter (line 181) | def test_ml_domains_get_ml_adapter(self): method test_generic_domain_gets_generic_adapter (line 191) | def test_generic_domain_gets_generic_adapter(self): method test_physics_uses_physics_adapter (line 196) | def test_physics_uses_physics_adapter(self): method test_unknown_domain_gets_generic (line 204) | def test_unknown_domain_gets_generic(self): class TestBlueprintContext (line 215) | class TestBlueprintContext: method test_blueprint_includes_file_structure (line 216) | def test_blueprint_includes_file_structure(self): method test_blueprint_includes_hints (line 228) | def test_blueprint_includes_hints(self): method test_ml_adapter_blueprint_context (line 238) | def test_ml_adapter_blueprint_context(self): class TestAdapterRegistration (line 257) | class TestAdapterRegistration: method test_register_custom_adapter (line 258) | def test_register_custom_adapter(self): FILE: tests/test_rc_adapters.py function test_adapter_bundle_defaults_are_recording_types (line 16) | def test_adapter_bundle_defaults_are_recording_types(): function test_recording_cron_adapter_records_call_and_returns_id (line 26) | def test_recording_cron_adapter_records_call_and_returns_id(): function test_recording_message_adapter_notify_records_call (line 33) | def test_recording_message_adapter_notify_records_call(): function test_recording_memory_adapter_append_records_entries (line 40) | def test_recording_memory_adapter_append_records_entries(): function test_recording_sessions_adapter_spawn_records_calls (line 47) | def test_recording_sessions_adapter_spawn_records_calls(): function test_recording_webfetch_fetch_returns_success_response (line 54) | def test_recording_webfetch_fetch_returns_success_response(): function test_recording_browser_open_returns_browser_page (line 63) | def test_recording_browser_open_returns_browser_page(): function test_fetch_response_dataclass_fields (line 71) | def test_fetch_response_dataclass_fields(): function test_browser_page_dataclass_fields (line 78) | def test_browser_page_dataclass_fields(): function test_all_adapters_start_with_empty_call_lists (line 84) | def test_all_adapters_start_with_empty_call_lists(): FILE: tests/test_rc_cache.py class TestCacheKey (line 19) | class TestCacheKey: method test_deterministic (line 20) | def test_deterministic(self, tmp_path): method test_different_query (line 26) | def test_different_query(self): method test_case_insensitive (line 31) | def test_case_insensitive(self): method test_length_16 (line 36) | def test_length_16(self): class TestGetPut (line 41) | class TestGetPut: method test_put_and_get (line 42) | def test_put_and_get(self, tmp_path): method test_cache_miss (line 50) | def test_cache_miss(self, tmp_path): method test_cache_expired (line 54) | def test_cache_expired(self, tmp_path): method test_cache_not_expired (line 60) | def test_cache_not_expired(self, tmp_path): method test_corrupted_cache_returns_none (line 66) | def test_corrupted_cache_returns_none(self, tmp_path): class TestClear (line 73) | class TestClear: method test_clear_removes_all (line 74) | def test_clear_removes_all(self, tmp_path): method test_clear_empty (line 81) | def test_clear_empty(self, tmp_path): class TestStats (line 86) | class TestStats: method test_stats_empty (line 87) | def test_stats_empty(self, tmp_path): method test_stats_with_entries (line 92) | def test_stats_with_entries(self, tmp_path): class TestSearchDegradation (line 99) | class TestSearchDegradation: method test_search_uses_cache_on_failure (line 100) | def test_search_uses_cache_on_failure(self, tmp_path): method test_search_caches_successful_results (line 147) | def test_search_caches_successful_results(self, tmp_path): FILE: tests/test_rc_checkpoint.py class TestCheckpoint (line 26) | class TestCheckpoint: method test_write_checkpoint (line 27) | def test_write_checkpoint(self, tmp_path: Path): method test_read_checkpoint_returns_next_stage (line 35) | def test_read_checkpoint_returns_next_stage(self, tmp_path: Path): method test_read_checkpoint_no_file (line 40) | def test_read_checkpoint_no_file(self, tmp_path: Path): method test_read_checkpoint_last_stage (line 43) | def test_read_checkpoint_last_stage(self, tmp_path: Path): method test_read_checkpoint_corrupted (line 47) | def test_read_checkpoint_corrupted(self, tmp_path: Path): method test_read_checkpoint_invalid_stage (line 51) | def test_read_checkpoint_invalid_stage(self, tmp_path: Path): method test_resume_from_checkpoint_uses_default (line 57) | def test_resume_from_checkpoint_uses_default(self, tmp_path: Path): method test_resume_from_checkpoint_uses_next_stage (line 60) | def test_resume_from_checkpoint_uses_next_stage(self, tmp_path: Path): class TestNoncriticalStages (line 65) | class TestNoncriticalStages: method test_knowledge_archive_is_noncritical (line 66) | def test_knowledge_archive_is_noncritical(self): method test_citation_verify_is_critical (line 69) | def test_citation_verify_is_critical(self): method test_topic_init_is_critical (line 73) | def test_topic_init_is_critical(self): method test_paper_draft_is_critical (line 76) | def test_paper_draft_is_critical(self): method test_stage_sequence_still_ends_with_citation_verify (line 79) | def test_stage_sequence_still_ends_with_citation_verify(self): class TestContentMetrics (line 83) | class TestContentMetrics: method test_metrics_empty_run_dir (line 84) | def test_metrics_empty_run_dir(self, tmp_path: Path): method test_metrics_with_draft (line 91) | def test_metrics_with_draft(self, tmp_path: Path): method test_metrics_with_verification (line 102) | def test_metrics_with_verification(self, tmp_path: Path): method test_metrics_no_stage23 (line 126) | def test_metrics_no_stage23(self, tmp_path: Path): method test_metrics_with_non_dict_summary (line 130) | def test_metrics_with_non_dict_summary(self, tmp_path: Path): method test_metrics_with_summary_missing_fields (line 143) | def test_metrics_with_summary_missing_fields(self, tmp_path: Path): method test_summary_includes_content_metrics (line 156) | def test_summary_includes_content_metrics(self, tmp_path: Path): FILE: tests/test_rc_citation_resolve.py function _make_paper (line 24) | def _make_paper( class TestLoadSeminalPapersByKey (line 51) | class TestLoadSeminalPapersByKey: method test_loads_well_known_keys (line 54) | def test_loads_well_known_keys(self): method test_entries_have_required_fields (line 64) | def test_entries_have_required_fields(self): method test_graceful_on_load_failure (line 74) | def test_graceful_on_load_failure(self): class TestSeminalToBibtex (line 91) | class TestSeminalToBibtex: method test_conference_paper (line 94) | def test_conference_paper(self): method test_journal_paper (line 109) | def test_journal_paper(self): method test_neurips_is_conference (line 122) | def test_neurips_is_conference(self): class TestResolveMissingCitations (line 138) | class TestResolveMissingCitations: method test_seminal_papers_resolved_without_api (line 141) | def test_seminal_papers_resolved_without_api(self): method test_seminal_papers_not_duplicated_in_existing_bib (line 168) | def test_seminal_papers_not_duplicated_in_existing_bib(self): method test_garbage_results_rejected_by_similarity (line 185) | def test_garbage_results_rejected_by_similarity(self): method test_year_mismatch_rejected (line 214) | def test_year_mismatch_rejected(self): method test_good_api_result_accepted (line 238) | def test_good_api_result_accepted(self): method test_empty_missing_keys_returns_empty (line 266) | def test_empty_missing_keys_returns_empty(self): method test_unparseable_keys_skipped (line 275) | def test_unparseable_keys_skipped(self): method test_import_failure_returns_seminal_only (line 285) | def test_import_failure_returns_seminal_only(self): method test_search_exception_handled_gracefully (line 303) | def test_search_exception_handled_gracefully(self): method test_bug194_he2016deep_not_replaced_with_jokowi (line 317) | def test_bug194_he2016deep_not_replaced_with_jokowi(self): method test_bug194_vaswani2017attention_not_replaced_with_health_supplement (line 332) | def test_bug194_vaswani2017attention_not_replaced_with_health_suppleme... method test_bug194_srivastava2014dropout_not_replaced_with_cnn_sentence (line 346) | def test_bug194_srivastava2014dropout_not_replaced_with_cnn_sentence(s... method test_multiple_seminal_and_api_mixed (line 360) | def test_multiple_seminal_and_api_mixed(self): method test_no_results_from_api_skips (line 389) | def test_no_results_from_api_skips(self): method test_close_year_accepted (line 401) | def test_close_year_accepted(self): method test_completely_unrelated_title_rejected (line 427) | def test_completely_unrelated_title_rejected(self): method test_picks_best_result_from_multiple (line 457) | def test_picks_best_result_from_multiple(self): FILE: tests/test_rc_citation_verify.py class TestParseBibtexEntries (line 86) | class TestParseBibtexEntries: method test_parses_three_entries (line 87) | def test_parses_three_entries(self) -> None: method test_entry_keys (line 91) | def test_entry_keys(self) -> None: method test_entry_fields (line 98) | def test_entry_fields(self) -> None: method test_entry_type (line 105) | def test_entry_type(self) -> None: method test_empty_bib (line 111) | def test_empty_bib(self) -> None: method test_malformed_bib (line 114) | def test_malformed_bib(self) -> None: class TestTitleSimilarity (line 118) | class TestTitleSimilarity: method test_identical (line 119) | def test_identical(self) -> None: method test_case_insensitive (line 125) | def test_case_insensitive(self) -> None: method test_high_similarity (line 131) | def test_high_similarity(self) -> None: method test_low_similarity (line 138) | def test_low_similarity(self) -> None: method test_empty_strings (line 145) | def test_empty_strings(self) -> None: class TestVerifyByArxivId (line 150) | class TestVerifyByArxivId: method test_verified_match (line 151) | def test_verified_match(self) -> None: method test_hallucinated_error_response (line 165) | def test_hallucinated_error_response(self) -> None: method test_network_failure_returns_none (line 177) | def test_network_failure_returns_none(self) -> None: method test_title_mismatch_suspicious (line 182) | def test_title_mismatch_suspicious(self) -> None: class TestVerifyByDoi (line 205) | class TestVerifyByDoi: method test_verified_crossref (line 206) | def test_verified_crossref(self) -> None: method test_doi_404_hallucinated (line 224) | def test_doi_404_hallucinated(self) -> None: method test_network_error_returns_none (line 242) | def test_network_error_returns_none(self) -> None: method test_doi_exists_no_title (line 247) | def test_doi_exists_no_title(self) -> None: class TestVerifyByTitleSearch (line 262) | class TestVerifyByTitleSearch: method test_verified_via_search (line 263) | def test_verified_via_search(self) -> None: method test_no_results_hallucinated (line 281) | def test_no_results_hallucinated(self) -> None: method test_weak_match_hallucinated (line 288) | def test_weak_match_hallucinated(self) -> None: method test_partial_match_suspicious (line 304) | def test_partial_match_suspicious(self) -> None: method test_network_failure_returns_none (line 320) | def test_network_failure_returns_none(self) -> None: class TestVerifyCitations (line 329) | class TestVerifyCitations: method test_full_pipeline_mocked (line 330) | def test_full_pipeline_mocked(self) -> None: method test_empty_bib (line 370) | def test_empty_bib(self) -> None: method test_no_title_entry_skipped (line 375) | def test_no_title_entry_skipped(self) -> None: class TestVerificationReport (line 387) | class TestVerificationReport: method test_integrity_score (line 388) | def test_integrity_score(self) -> None: method test_integrity_score_with_skips (line 394) | def test_integrity_score_with_skips(self) -> None: method test_integrity_score_all_skipped (line 400) | def test_integrity_score_all_skipped(self) -> None: method test_to_dict (line 406) | def test_to_dict(self) -> None: class TestFilterVerifiedBibtex (line 413) | class TestFilterVerifiedBibtex: method _make_report (line 414) | def _make_report(self) -> VerificationReport: method test_includes_verified_and_suspicious (line 445) | def test_includes_verified_and_suspicious(self) -> None: method test_excludes_suspicious (line 452) | def test_excludes_suspicious(self) -> None: method test_empty_bib (line 459) | def test_empty_bib(self) -> None: class TestAnnotatePaperHallucinations (line 464) | class TestAnnotatePaperHallucinations: method test_latex_citations (line 465) | def test_latex_citations(self) -> None: method test_markdown_citations (line 490) | def test_markdown_citations(self) -> None: method test_suspicious_annotation (line 515) | def test_suspicious_annotation(self) -> None: method test_no_modifications_all_verified (line 532) | def test_no_modifications_all_verified(self) -> None: class TestCitationResultSerialization (line 549) | class TestCitationResultSerialization: method test_to_dict_basic (line 550) | def test_to_dict_basic(self) -> None: method test_to_dict_with_matched_paper (line 564) | def test_to_dict_with_matched_paper(self) -> None: class TestStage23Integration (line 585) | class TestStage23Integration: method test_stage_exists_in_enum (line 586) | def test_stage_exists_in_enum(self) -> None: method test_stage_in_sequence (line 592) | def test_stage_in_sequence(self) -> None: method test_contract_exists (line 599) | def test_contract_exists(self) -> None: method test_executor_registered (line 608) | def test_executor_registered(self) -> None: method test_phase_map (line 614) | def test_phase_map(self) -> None: method test_total_stages_is_23 (line 620) | def test_total_stages_is_23(self) -> None: FILE: tests/test_rc_cli.py function _write_valid_config (line 14) | def _write_valid_config(path: Path) -> None: function test_main_with_no_args_returns_zero_and_prints_help (line 40) | def test_main_with_no_args_returns_zero_and_prints_help( function test_help_subcommands_exit_zero (line 51) | def test_help_subcommands_exit_zero(argv: list[str]) -> None: function test_generate_run_id_format (line 57) | def test_generate_run_id_format() -> None: function test_cmd_run_missing_config_returns_one (line 63) | def test_cmd_run_missing_config_returns_one( function test_cmd_validate_missing_config_returns_one (line 81) | def test_cmd_validate_missing_config_returns_one( function test_cmd_validate_valid_config_returns_zero (line 92) | def test_cmd_validate_valid_config_returns_zero( function test_main_dispatches_run_command (line 103) | def test_main_dispatches_run_command(monkeypatch: pytest.MonkeyPatch) ->... function test_main_dispatches_validate_command (line 134) | def test_main_dispatches_validate_command(monkeypatch: pytest.MonkeyPatc... function test_run_parser_accepts_required_flags (line 158) | def test_run_parser_accepts_required_flags( function test_validate_parser_accepts_config_flag (line 165) | def test_validate_parser_accepts_config_flag(monkeypatch: pytest.MonkeyP... function test_resolve_config_finds_arc_yaml_first (line 173) | def test_resolve_config_finds_arc_yaml_first( function test_resolve_config_falls_back_to_config_yaml (line 184) | def test_resolve_config_falls_back_to_config_yaml( function test_resolve_config_returns_none_when_missing (line 194) | def test_resolve_config_returns_none_when_missing( function test_resolve_config_explicit_path_no_search (line 202) | def test_resolve_config_explicit_path_no_search() -> None: function _write_example_config (line 211) | def _write_example_config(path: Path) -> None: function test_cmd_init_creates_config (line 229) | def test_cmd_init_creates_config( function test_cmd_init_refuses_overwrite (line 246) | def test_cmd_init_refuses_overwrite( function test_cmd_init_force_overwrites (line 259) | def test_cmd_init_force_overwrites( function test_cmd_run_missing_config_shows_init_hint (line 272) | def test_cmd_run_missing_config_shows_init_hint( function test_resume_finds_existing_checkpoint_dir (line 291) | def test_resume_finds_existing_checkpoint_dir( function test_resume_no_checkpoint_warns (line 342) | def test_resume_no_checkpoint_warns( function test_main_dispatches_init (line 379) | def test_main_dispatches_init(monkeypatch: pytest.MonkeyPatch) -> None: FILE: tests/test_rc_config.py function _write_valid_config (line 18) | def _write_valid_config(tmp_path: Path) -> Path: function _valid_config_data (line 68) | def _valid_config_data() -> dict[str, dict[str, object]]: function test_valid_config_data_helper_returns_expected_baseline_shape (line 98) | def test_valid_config_data_helper_returns_expected_baseline_shape(): function test_validate_config_with_valid_data_returns_ok_true (line 105) | def test_validate_config_with_valid_data_returns_ok_true(tmp_path: Path): function test_validate_config_missing_required_fields_returns_errors (line 115) | def test_validate_config_missing_required_fields_returns_errors(tmp_path... function test_validate_config_rejects_invalid_project_mode (line 125) | def test_validate_config_rejects_invalid_project_mode(tmp_path: Path): function test_validate_config_rejects_invalid_knowledge_base_backend (line 135) | def test_validate_config_rejects_invalid_knowledge_base_backend(tmp_path... function test_validate_config_rejects_invalid_hitl_required_stages_entries (line 146) | def test_validate_config_rejects_invalid_hitl_required_stages_entries( function test_validate_config_rejects_non_list_hitl_required_stages (line 158) | def test_validate_config_rejects_non_list_hitl_required_stages(tmp_path:... function test_validate_config_rejects_invalid_experiment_mode (line 168) | def test_validate_config_rejects_invalid_experiment_mode(tmp_path: Path): function test_validate_config_accepts_docker_mode (line 178) | def test_validate_config_accepts_docker_mode(tmp_path: Path): function test_validate_config_rejects_invalid_metric_direction (line 187) | def test_validate_config_rejects_invalid_metric_direction(tmp_path: Path): function test_rcconfig_from_dict_happy_path (line 197) | def test_rcconfig_from_dict_happy_path(tmp_path: Path): function test_rcconfig_from_dict_missing_fields_raises_value_error (line 210) | def test_rcconfig_from_dict_missing_fields_raises_value_error(tmp_path: ... function test_rcconfig_load_from_yaml_file (line 218) | def test_rcconfig_load_from_yaml_file(tmp_path: Path): function test_load_config_wrapper_returns_rcconfig (line 227) | def test_load_config_wrapper_returns_rcconfig(tmp_path: Path): function test_security_config_defaults_match_expected_values (line 235) | def test_security_config_defaults_match_expected_values(): function test_experiment_config_defaults_mode_is_simulated (line 243) | def test_experiment_config_defaults_mode_is_simulated(): function test_sandbox_config_defaults_match_expected_values (line 250) | def test_sandbox_config_defaults_match_expected_values(): function test_to_dict_roundtrip_rehydrates_equivalent_rcconfig (line 260) | def test_to_dict_roundtrip_rehydrates_equivalent_rcconfig(tmp_path: Path): function test_check_paths_false_skips_missing_kb_root_validation (line 279) | def test_check_paths_false_skips_missing_kb_root_validation(tmp_path: Pa... function test_path_validation_missing_kb_root_is_error (line 289) | def test_path_validation_missing_kb_root_is_error(tmp_path: Path): function test_validate_config_missing_kb_subdirs_emits_warnings (line 298) | def test_validate_config_missing_kb_subdirs_emits_warnings(tmp_path: Path): function test_rcconfig_from_dict_uses_default_security_when_missing (line 312) | def test_rcconfig_from_dict_uses_default_security_when_missing(tmp_path:... function test_load_uses_file_parent_as_default_project_root (line 320) | def test_load_uses_file_parent_as_default_project_root(tmp_path: Path): FILE: tests/test_rc_contracts.py function test_contracts_dict_has_exactly_23_entries (line 9) | def test_contracts_dict_has_exactly_23_entries(): function test_every_stage_has_matching_contract_entry (line 13) | def test_every_stage_has_matching_contract_entry(): function test_each_stage_member_resolves_to_stage_contract (line 18) | def test_each_stage_member_resolves_to_stage_contract(stage: Stage): function test_contract_stage_field_matches_dict_key (line 23) | def test_contract_stage_field_matches_dict_key(stage: Stage, contract: S... function test_output_files_is_non_empty_for_all_contracts (line 28) | def test_output_files_is_non_empty_for_all_contracts(contract: StageCont... function test_error_code_starts_with_e_and_contains_stage_number (line 33) | def test_error_code_starts_with_e_and_contains_stage_number( function test_max_retries_is_non_negative_for_all_contracts (line 42) | def test_max_retries_is_non_negative_for_all_contracts(contract: StageCo... function test_gate_stages_have_expected_max_retries (line 46) | def test_gate_stages_have_expected_max_retries(): function test_gate_stage_contracts_are_never_retried (line 53) | def test_gate_stage_contracts_are_never_retried(stage: Stage): function test_topic_init_contract_has_expected_input_output_files (line 57) | def test_topic_init_contract_has_expected_input_output_files(): function test_export_publish_contract_has_expected_outputs (line 64) | def test_export_publish_contract_has_expected_outputs(): function test_dod_is_non_empty_string_for_all_contracts (line 71) | def test_dod_is_non_empty_string_for_all_contracts(contract: StageContra... function test_input_files_is_tuple_of_strings (line 77) | def test_input_files_is_tuple_of_strings(contract: StageContract): function test_output_files_is_tuple_of_strings (line 83) | def test_output_files_is_tuple_of_strings(contract: StageContract): function test_error_codes_are_unique_across_contracts (line 88) | def test_error_codes_are_unique_across_contracts(): function test_contracts_follow_stage_sequence_order (line 93) | def test_contracts_follow_stage_sequence_order(): function test_contract_stage_int_matches_stage_enum_value (line 98) | def test_contract_stage_int_matches_stage_enum_value(stage: Stage): FILE: tests/test_rc_docker_sandbox.py function test_sandbox_result_fields (line 21) | def test_sandbox_result_fields(): function test_build_run_command_network_none (line 38) | def test_build_run_command_network_none(tmp_path: Path): function test_build_run_command_setup_only (line 58) | def test_build_run_command_setup_only(tmp_path: Path): function test_build_run_command_full_network (line 81) | def test_build_run_command_full_network(tmp_path: Path): function test_build_run_command_no_gpu (line 97) | def test_build_run_command_no_gpu(tmp_path: Path): function test_build_run_command_specific_gpus (line 108) | def test_build_run_command_specific_gpus(tmp_path: Path): function test_harness_injection (line 124) | def test_harness_injection(tmp_path: Path): function test_factory_returns_experiment_sandbox (line 138) | def test_factory_returns_experiment_sandbox(tmp_path: Path): function test_factory_returns_docker_sandbox (line 148) | def test_factory_returns_docker_sandbox(mock_avail, mock_image, tmp_path... function test_factory_falls_back_when_docker_unavailable (line 155) | def test_factory_falls_back_when_docker_unavailable(mock_avail, tmp_path... function test_factory_raises_when_image_missing (line 165) | def test_factory_raises_when_image_missing(mock_avail, mock_image, tmp_p... function test_docker_run_success (line 175) | def test_docker_run_success(mock_run, tmp_path: Path): function test_docker_run_timeout (line 192) | def test_docker_run_timeout(mock_run, tmp_path: Path): function test_detect_pip_packages (line 205) | def test_detect_pip_packages(tmp_path: Path): function test_detect_pip_packages_finds_unknown (line 216) | def test_detect_pip_packages_finds_unknown(tmp_path: Path): function test_detect_pip_packages_skips_setup_py (line 226) | def test_detect_pip_packages_skips_setup_py(tmp_path: Path): function test_detect_pip_packages_maps_imports (line 234) | def test_detect_pip_packages_maps_imports(tmp_path: Path): function test_next_container_name_is_thread_safe (line 244) | def test_next_container_name_is_thread_safe(): function test_write_requirements_txt_from_auto_detect (line 267) | def test_write_requirements_txt_from_auto_detect(tmp_path: Path): function test_write_requirements_txt_with_pip_pre_install (line 284) | def test_write_requirements_txt_with_pip_pre_install(tmp_path: Path): function test_write_requirements_txt_respects_existing (line 301) | def test_write_requirements_txt_respects_existing(tmp_path: Path): function test_write_requirements_txt_no_packages (line 319) | def test_write_requirements_txt_no_packages(tmp_path: Path): function test_check_docker_available_true (line 336) | def test_check_docker_available_true(mock_run): function test_check_docker_available_false (line 342) | def test_check_docker_available_false(mock_run): function test_check_docker_available_no_binary (line 348) | def test_check_docker_available_no_binary(mock_run): function test_ensure_image_true (line 353) | def test_ensure_image_true(mock_run): function test_ensure_image_false (line 359) | def test_ensure_image_false(mock_run): function test_default_network_policy_is_setup_only (line 367) | def test_default_network_policy_is_setup_only(): function test_default_auto_install_deps_enabled (line 373) | def test_default_auto_install_deps_enabled(): function test_run_project_rejects_path_traversal (line 382) | def test_run_project_rejects_path_traversal(mock_run: MagicMock, tmp_pat... function test_run_project_rejects_absolute_path (line 403) | def test_run_project_rejects_absolute_path(mock_run: MagicMock, tmp_path... function test_cleanup_on_normal_exit (line 423) | def test_cleanup_on_normal_exit(mock_run: MagicMock, mock_remove: MagicM... function test_cleanup_on_timeout (line 439) | def test_cleanup_on_timeout( function test_cleanup_on_exception (line 455) | def test_cleanup_on_exception(mock_run: MagicMock, mock_remove: MagicMoc... function test_keep_containers_skips_removal (line 470) | def test_keep_containers_skips_removal( FILE: tests/test_rc_e2e_regression.py class _DummyResponse (line 13) | class _DummyResponse: method __init__ (line 14) | def __init__(self, payload: bytes) -> None: method read (line 17) | def read(self) -> bytes: method __enter__ (line 20) | def __enter__(self) -> _DummyResponse: method __exit__ (line 23) | def __exit__(self, exc_type, exc, tb) -> None: class TestRateLimitRetry (line 28) | class TestRateLimitRetry: method test_s2_429_retries_and_succeeds (line 29) | def test_s2_429_retries_and_succeeds(self) -> None: method test_s2_persistent_429_exhausts_retries_and_returns_empty (line 78) | def test_s2_persistent_429_exhausts_retries_and_returns_empty(self) ->... class TestDegradationChain (line 108) | class TestDegradationChain: method test_search_degrades_to_cache_on_api_failure (line 109) | def test_search_degrades_to_cache_on_api_failure(self, tmp_path: Path)... method test_search_empty_on_total_failure (line 148) | def test_search_empty_on_total_failure(self, tmp_path: Path) -> None: class TestLLMFallback (line 172) | class TestLLMFallback: method test_primary_403_forbidden_fallback_succeeds (line 173) | def test_primary_403_forbidden_fallback_succeeds(self) -> None: method test_preflight_detects_401 (line 204) | def test_preflight_detects_401(self) -> None: class TestNoncriticalStageSkip (line 228) | class TestNoncriticalStageSkip: method _make_rc_config (line 230) | def _make_rc_config(tmp_path: Path): method test_noncritical_stage_failure_is_skipped (line 249) | def test_noncritical_stage_failure_is_skipped(self, tmp_path: Path) ->... method test_critical_stage_failure_still_aborts (line 289) | def test_critical_stage_failure_still_aborts(self, tmp_path: Path) -> ... FILE: tests/test_rc_evolution.py class TestLessonEntry (line 25) | class TestLessonEntry: method test_to_dict_and_from_dict_roundtrip (line 26) | def test_to_dict_and_from_dict_roundtrip(self) -> None: method test_from_dict_handles_missing_fields (line 43) | def test_from_dict_handles_missing_fields(self) -> None: class TestClassifyError (line 53) | class TestClassifyError: method test_timeout_classified_as_system (line 54) | def test_timeout_classified_as_system(self) -> None: method test_validation_classified_as_experiment (line 57) | def test_validation_classified_as_experiment(self) -> None: method test_citation_classified_as_literature (line 60) | def test_citation_classified_as_literature(self) -> None: method test_paper_classified_as_writing (line 63) | def test_paper_classified_as_writing(self) -> None: method test_unknown_defaults_to_pipeline (line 66) | def test_unknown_defaults_to_pipeline(self) -> None: class TestTimeWeight (line 73) | class TestTimeWeight: method test_recent_lesson_has_high_weight (line 74) | def test_recent_lesson_has_high_weight(self) -> None: method test_30_day_old_has_half_weight (line 78) | def test_30_day_old_has_half_weight(self) -> None: method test_90_day_old_returns_zero (line 83) | def test_90_day_old_returns_zero(self) -> None: method test_invalid_timestamp_returns_zero (line 87) | def test_invalid_timestamp_returns_zero(self) -> None: method test_empty_timestamp_returns_zero (line 90) | def test_empty_timestamp_returns_zero(self) -> None: class TestExtractLessons (line 97) | class TestExtractLessons: method _make_result (line 98) | def _make_result(self, stage_num, status, error=None, decision="procee... method test_extracts_lesson_from_failed_stage (line 110) | def test_extracts_lesson_from_failed_stage(self) -> None: method test_extracts_lesson_from_blocked_stage (line 117) | def test_extracts_lesson_from_blocked_stage(self) -> None: method test_extracts_lesson_from_pivot_decision (line 124) | def test_extracts_lesson_from_pivot_decision(self) -> None: method test_no_lessons_from_successful_proceed (line 130) | def test_no_lessons_from_successful_proceed(self) -> None: method test_multiple_results_multiple_lessons (line 135) | def test_multiple_results_multiple_lessons(self) -> None: method test_extracts_decision_rationale (line 144) | def test_extracts_decision_rationale(self, tmp_path: Path) -> None: method test_extracts_rationale_from_raw_text_excerpt (line 156) | def test_extracts_rationale_from_raw_text_excerpt(self, tmp_path: Path... method test_extracts_stderr_runtime_lesson (line 176) | def test_extracts_stderr_runtime_lesson(self, tmp_path: Path) -> None: method test_extracts_nan_metric_lesson (line 191) | def test_extracts_nan_metric_lesson(self, tmp_path: Path) -> None: method test_no_runtime_lessons_without_run_dir (line 204) | def test_no_runtime_lessons_without_run_dir(self) -> None: class TestEvolutionStore (line 213) | class TestEvolutionStore: method test_append_and_load (line 214) | def test_append_and_load(self, tmp_path: Path) -> None: method test_append_many (line 229) | def test_append_many(self, tmp_path: Path) -> None: method test_append_many_empty_is_noop (line 240) | def test_append_many_empty_is_noop(self, tmp_path: Path) -> None: method test_load_all_empty_store (line 245) | def test_load_all_empty_store(self, tmp_path: Path) -> None: method test_query_for_stage_returns_relevant_lessons (line 249) | def test_query_for_stage_returns_relevant_lessons(self, tmp_path: Path... method test_query_respects_max_lessons (line 261) | def test_query_respects_max_lessons(self, tmp_path: Path) -> None: method test_build_overlay_returns_empty_for_no_lessons (line 270) | def test_build_overlay_returns_empty_for_no_lessons(self, tmp_path: Pa... method test_build_overlay_returns_formatted_text (line 274) | def test_build_overlay_returns_formatted_text(self, tmp_path: Path) ->... method test_old_lessons_filtered_by_time_weight (line 284) | def test_old_lessons_filtered_by_time_weight(self, tmp_path: Path) -> ... method test_creates_directory_if_not_exists (line 291) | def test_creates_directory_if_not_exists(self, tmp_path: Path) -> None: class TestPromptManagerEvolutionOverlay (line 300) | class TestPromptManagerEvolutionOverlay: method test_overlay_appended_to_user_prompt (line 301) | def test_overlay_appended_to_user_prompt(self) -> None: method test_no_overlay_when_empty (line 316) | def test_no_overlay_when_empty(self) -> None: FILE: tests/test_rc_executor.py class FakeLLMClient (line 19) | class FakeLLMClient: method __init__ (line 20) | def __init__(self, response_text: str = "mock response"): method chat (line 24) | def chat(self, messages: list[dict[str, str]], **kwargs: object): class FakeLLMClientWithConfig (line 32) | class FakeLLMClientWithConfig(FakeLLMClient): method __init__ (line 33) | def __init__(self, response_text: str = "mock response"): function rc_config (line 41) | def rc_config(tmp_path: Path) -> RCConfig: function adapters (line 74) | def adapters() -> AdapterBundle: function run_dir (line 79) | def run_dir(tmp_path: Path) -> Path: function _write_prior_artifact (line 85) | def _write_prior_artifact( function test_executor_map_has_23_entries (line 93) | def test_executor_map_has_23_entries() -> None: function test_every_stage_member_has_matching_executor (line 98) | def test_every_stage_member_has_matching_executor() -> None: function test_stage_result_dataclass_fields (line 103) | def test_stage_result_dataclass_fields() -> None: function test_utcnow_iso_returns_valid_iso_timestamp (line 115) | def test_utcnow_iso_returns_valid_iso_timestamp() -> None: function test_extract_yaml_block_variants (line 130) | def test_extract_yaml_block_variants(text: str, expected: str) -> None: function test_safe_json_loads_valid_and_invalid (line 142) | def test_safe_json_loads_valid_and_invalid(payload: str, default, expect... function test_safe_filename_sanitization (line 156) | def test_safe_filename_sanitization(raw: str, expected: str) -> None: function test_safe_filename_truncates_to_100_chars (line 160) | def test_safe_filename_truncates_to_100_chars() -> None: function test_build_context_preamble_basic_fields (line 167) | def test_build_context_preamble_basic_fields( function test_build_context_preamble_includes_selected_prior_artifacts (line 176) | def test_build_context_preamble_includes_selected_prior_artifacts( function test_read_prior_artifact_finds_newest_file (line 197) | def test_read_prior_artifact_finds_newest_file(run_dir: Path) -> None: function test_read_prior_artifact_finds_directory_path (line 204) | def test_read_prior_artifact_finds_directory_path(run_dir: Path) -> None: function test_read_prior_artifact_returns_none_when_not_found (line 212) | def test_read_prior_artifact_returns_none_when_not_found(run_dir: Path) ... function test_read_best_analysis_prefers_best_file (line 216) | def test_read_best_analysis_prefers_best_file(run_dir: Path) -> None: function test_read_best_analysis_falls_back_to_prior_artifact (line 230) | def test_read_best_analysis_falls_back_to_prior_artifact(run_dir: Path) ... function test_read_best_analysis_returns_empty_when_none (line 242) | def test_read_best_analysis_returns_empty_when_none(run_dir: Path) -> None: function test_write_stage_meta_writes_expected_json (line 250) | def test_write_stage_meta_writes_expected_json(run_dir: Path) -> None: function test_execute_stage_creates_stage_dir_writes_artifacts_and_meta (line 275) | def test_execute_stage_creates_stage_dir_writes_artifacts_and_meta( function test_execute_stage_contract_validation_missing_output_file_marks_failed (line 319) | def test_execute_stage_contract_validation_missing_output_file_marks_fai... function test_execute_stage_contract_validation_missing_output_directory_marks_failed (line 351) | def test_execute_stage_contract_validation_missing_output_directory_mark... function test_execute_stage_missing_required_input_returns_failed (line 389) | def test_execute_stage_missing_required_input_returns_failed( function test_execute_stage_gate_behavior_auto_approve_true_keeps_done (line 406) | def test_execute_stage_gate_behavior_auto_approve_true_keeps_done( function test_execute_stage_gate_behavior_auto_approve_false_blocks (line 451) | def test_execute_stage_gate_behavior_auto_approve_false_blocks( function test_execute_stage_llm_client_creation_error_falls_back_without_crash (line 496) | def test_execute_stage_llm_client_creation_error_falls_back_without_crash( function test_execute_stage_executor_exception_returns_failed (line 518) | def test_execute_stage_executor_exception_returns_failed( function test_stage_executor_mapping_values_are_callable (line 567) | def test_stage_executor_mapping_values_are_callable(stage: Stage) -> None: class TestStageHealth (line 571) | class TestStageHealth: method test_stage_health_json_written (line 572) | def test_stage_health_json_written(self, tmp_path: Path) -> None: method test_stage_health_has_required_fields (line 592) | def test_stage_health_has_required_fields(self, tmp_path: Path) -> None: method test_stage_health_duration_positive (line 630) | def test_stage_health_duration_positive(self, tmp_path: Path) -> None: class TestIterativeRefine (line 666) | class TestIterativeRefine: method _prepare_refine_inputs (line 667) | def _prepare_refine_inputs(self, run_dir: Path) -> None: method test_refine_simulated_mode_skips (line 693) | def test_refine_simulated_mode_skips( method test_refine_no_llm_saves_original_as_final (line 725) | def test_refine_no_llm_saves_original_as_final( method test_refine_with_llm_generates_improved_code (line 754) | def test_refine_with_llm_generates_improved_code( method test_refine_converges_after_no_improvement (line 784) | def test_refine_converges_after_no_improvement( method test_refine_artifacts_include_version_files (line 858) | def test_refine_artifacts_include_version_files( method test_refine_sandbox_mode_runs_code (line 891) | def test_refine_sandbox_mode_runs_code( class TestExportPublishCodePackage (line 972) | class TestExportPublishCodePackage: method test_export_packages_experiment_final (line 973) | def test_export_packages_experiment_final( method test_export_falls_back_to_experiment_py (line 1001) | def test_export_falls_back_to_experiment_py( method test_export_no_experiment_skips_code_dir (line 1027) | def test_export_no_experiment_skips_code_dir( method test_export_detects_multiple_dependencies (line 1051) | def test_export_detects_multiple_dependencies( method test_export_code_readme_contains_title (line 1086) | def test_export_code_readme_contains_title( function test_contracts_stage13_includes_experiment_final (line 1113) | def test_contracts_stage13_includes_experiment_final() -> None: function test_contracts_stage22_includes_code_dir (line 1117) | def test_contracts_stage22_includes_code_dir() -> None: class TestExtractTopicKeywords (line 1124) | class TestExtractTopicKeywords: method test_basic_extraction (line 1125) | def test_basic_extraction(self) -> None: method test_includes_domain_keywords (line 1139) | def test_includes_domain_keywords(self) -> None: method test_deduplication (line 1149) | def test_deduplication(self) -> None: method test_empty_topic (line 1155) | def test_empty_topic(self) -> None: class TestTopicConstraintBlock (line 1163) | class TestTopicConstraintBlock: method test_contains_topic (line 1164) | def test_contains_topic(self) -> None: method test_contains_prohibition (line 1168) | def test_contains_prohibition(self) -> None: method test_hard_constraint_markers (line 1174) | def test_hard_constraint_markers(self) -> None: class TestParseDecision (line 1183) | class TestParseDecision: method test_proceed_default (line 1184) | def test_proceed_default(self) -> None: method test_proceed_explicit (line 1187) | def test_proceed_explicit(self) -> None: method test_pivot_detected (line 1191) | def test_pivot_detected(self) -> None: method test_refine_detected (line 1195) | def test_refine_detected(self) -> None: method test_pivot_case_insensitive (line 1199) | def test_pivot_case_insensitive(self) -> None: method test_pivot_takes_priority_over_proceed (line 1203) | def test_pivot_takes_priority_over_proceed(self) -> None: method test_decision_in_body_not_heading (line 1207) | def test_decision_in_body_not_heading(self) -> None: class TestResearchDecisionStructured (line 1212) | class TestResearchDecisionStructured: method test_decision_produces_structured_json (line 1213) | def test_decision_produces_structured_json( method test_pivot_decision_from_llm (line 1231) | def test_pivot_decision_from_llm( method test_no_llm_defaults_to_proceed (line 1245) | def test_no_llm_defaults_to_proceed( class TestMultiPerspectiveGenerate (line 1258) | class TestMultiPerspectiveGenerate: method test_generates_all_perspectives (line 1259) | def test_generates_all_perspectives(self, tmp_path: Path) -> None: method test_saves_perspective_content (line 1274) | def test_saves_perspective_content(self, tmp_path: Path) -> None: method test_renders_variables_in_prompts (line 1284) | def test_renders_variables_in_prompts(self, tmp_path: Path) -> None: class TestSynthesizePerspectives (line 1294) | class TestSynthesizePerspectives: method test_combines_perspectives (line 1295) | def test_combines_perspectives(self) -> None: class TestHypothesisGenDebate (line 1309) | class TestHypothesisGenDebate: method test_hypothesis_gen_with_llm_creates_perspectives (line 1310) | def test_hypothesis_gen_with_llm_creates_perspectives( method test_hypothesis_gen_without_llm_no_perspectives (line 1330) | def test_hypothesis_gen_without_llm_no_perspectives( class TestResultAnalysisDebate (line 1347) | class TestResultAnalysisDebate: method test_result_analysis_with_llm_creates_perspectives (line 1348) | def test_result_analysis_with_llm_creates_perspectives( method test_result_analysis_without_llm_no_perspectives (line 1369) | def test_result_analysis_without_llm_no_perspectives( class TestParseMetricsFromStdout (line 1384) | class TestParseMetricsFromStdout: method test_parses_simple_name_value (line 1387) | def test_parses_simple_name_value(self) -> None: method test_parses_compound_names (line 1395) | def test_parses_compound_names(self) -> None: method test_ignores_non_numeric_lines (line 1403) | def test_ignores_non_numeric_lines(self) -> None: method test_empty_stdout_returns_empty_dict (line 1411) | def test_empty_stdout_returns_empty_dict(self) -> None: method test_handles_negative_values (line 1416) | def test_handles_negative_values(self) -> None: method test_filters_log_lines (line 1423) | def test_filters_log_lines(self) -> None: method test_filters_long_name_lines (line 1438) | def test_filters_long_name_lines(self) -> None: class TestDetectRuntimeIssues (line 1446) | class TestDetectRuntimeIssues: method _make_sandbox_result (line 1449) | def _make_sandbox_result( method test_no_issues_returns_empty_string (line 1466) | def test_no_issues_returns_empty_string(self) -> None: method test_detects_nan_in_metrics (line 1470) | def test_detects_nan_in_metrics(self) -> None: method test_detects_inf_in_metrics (line 1476) | def test_detects_inf_in_metrics(self) -> None: method test_detects_nan_in_stdout (line 1481) | def test_detects_nan_in_stdout(self) -> None: method test_detects_runtime_warning_in_stderr (line 1486) | def test_detects_runtime_warning_in_stderr(self) -> None: method test_detects_division_error_in_stderr (line 1496) | def test_detects_division_error_in_stderr(self) -> None: method test_ignores_benign_stderr (line 1502) | def test_ignores_benign_stderr(self) -> None: method test_combined_nan_and_stderr (line 1507) | def test_combined_nan_and_stderr(self) -> None: method test_detects_dummy_metric_identical_values (line 1516) | def test_detects_dummy_metric_identical_values(self) -> None: method test_no_dummy_metric_when_values_differ (line 1528) | def test_no_dummy_metric_when_values_differ(self) -> None: class TestRemoveBibtexEntries (line 1539) | class TestRemoveBibtexEntries: method test_removes_specified_keys (line 1542) | def test_removes_specified_keys(self) -> None: method test_keeps_all_when_no_match (line 1551) | def test_keeps_all_when_no_match(self) -> None: method test_empty_bib (line 1556) | def test_empty_bib(self) -> None: class TestRemoveCitationsFromText (line 1560) | class TestRemoveCitationsFromText: method test_removes_latex_cite (line 1563) | def test_removes_latex_cite(self) -> None: method test_removes_markdown_cite (line 1569) | def test_removes_markdown_cite(self) -> None: method test_cleans_multi_cite_comma (line 1574) | def test_cleans_multi_cite_comma(self) -> None: class TestCollectRawExperimentMetrics (line 1580) | class TestCollectRawExperimentMetrics: method test_returns_empty_when_no_runs (line 1583) | def test_returns_empty_when_no_runs(self, tmp_path: Path) -> None: method test_extracts_metrics_from_stdout (line 1590) | def test_extracts_metrics_from_stdout(self, tmp_path: Path) -> None: method test_extracts_from_metrics_dict (line 1605) | def test_extracts_from_metrics_dict(self, tmp_path: Path) -> None: method test_deduplicates_metrics (line 1616) | def test_deduplicates_metrics(self, tmp_path: Path) -> None: class TestCollectExperimentEvidence (line 1630) | class TestCollectExperimentEvidence: method test_returns_empty_when_no_artifacts (line 1633) | def test_returns_empty_when_no_artifacts(self, tmp_path: Path) -> None: method test_includes_main_py_code (line 1638) | def test_includes_main_py_code(self, run_dir: Path) -> None: method test_includes_run_metrics (line 1646) | def test_includes_run_metrics(self, run_dir: Path) -> None: method test_includes_stderr_excerpt (line 1657) | def test_includes_stderr_excerpt(self, run_dir: Path) -> None: method test_includes_refinement_summary (line 1670) | def test_includes_refinement_summary(self, run_dir: Path) -> None: method test_includes_actual_trial_count (line 1686) | def test_includes_actual_trial_count(self, run_dir: Path) -> None: class TestWritePaperSections (line 1697) | class TestWritePaperSections: method test_produces_three_part_draft (line 1700) | def test_produces_three_part_draft(self) -> None: method test_each_call_receives_prior_context (line 1739) | def test_each_call_receives_prior_context(self) -> None: class TestLoadHardwareProfile (line 1771) | class TestLoadHardwareProfile: method run_dir (line 1775) | def run_dir(self, tmp_path: Path) -> Path: method test_loads_valid_profile (line 1780) | def test_loads_valid_profile(self, run_dir: Path) -> None: method test_returns_none_when_missing (line 1791) | def test_returns_none_when_missing(self, run_dir: Path) -> None: method test_returns_none_on_invalid_json (line 1794) | def test_returns_none_on_invalid_json(self, run_dir: Path) -> None: class TestExpandSearchQueries (line 1801) | class TestExpandSearchQueries: method test_adds_broader_queries (line 1804) | def test_adds_broader_queries(self) -> None: method test_deduplicates (line 1810) | def test_deduplicates(self) -> None: method test_preserves_original_queries (line 1817) | def test_preserves_original_queries(self) -> None: method test_adds_survey_benchmark_variants (line 1824) | def test_adds_survey_benchmark_variants(self) -> None: class TestComputeBudgetBlock (line 1837) | class TestComputeBudgetBlock: method test_compute_budget_block_exists_in_prompt_manager (line 1840) | def test_compute_budget_block_exists_in_prompt_manager(self) -> None: method test_compute_budget_injected_into_code_generation (line 1847) | def test_compute_budget_injected_into_code_generation( class TestPartialTimeoutStatus (line 1915) | class TestPartialTimeoutStatus: method test_timed_out_with_metrics_sets_partial_status (line 1918) | def test_timed_out_with_metrics_sets_partial_status( class TestTimeoutAwareRefine (line 1994) | class TestTimeoutAwareRefine: method _prepare_timed_out_run (line 1997) | def _prepare_timed_out_run(self, run_dir: Path) -> None: method test_timeout_refine_injects_scale_reduction_prompt (line 2020) | def test_timeout_refine_injects_scale_reduction_prompt( class TestDataIntegrityBlock (line 2081) | class TestDataIntegrityBlock: method test_paper_draft_blocked_with_no_metrics (line 2084) | def test_paper_draft_blocked_with_no_metrics( method test_paper_draft_proceeds_with_metrics (line 2111) | def test_paper_draft_proceeds_with_metrics( class TestTitleGuidelines (line 2148) | class TestTitleGuidelines: method test_title_guidelines_block_exists (line 2151) | def test_title_guidelines_block_exists(self) -> None: method test_abstract_structure_block_exists (line 2159) | def test_abstract_structure_block_exists(self) -> None: method test_title_guidelines_injected_into_paper_draft (line 2166) | def test_title_guidelines_injected_into_paper_draft( class TestConferenceWritingQuality (line 2195) | class TestConferenceWritingQuality: method test_writing_guide_format_all (line 2198) | def test_writing_guide_format_all(self) -> None: method test_writing_guide_format_subset (line 2206) | def test_writing_guide_format_subset(self) -> None: method test_paper_draft_system_includes_principles (line 2214) | def test_paper_draft_system_includes_principles(self) -> None: class TestRefineTimeoutAndIterationCap (line 2234) | class TestRefineTimeoutAndIterationCap: method test_refine_timeout_uses_full_budget (line 2237) | def test_refine_timeout_uses_full_budget(self) -> None: method test_iteration_cap_is_10 (line 2248) | def test_iteration_cap_is_10(self) -> None: method test_refine_respects_high_iteration_count (line 2256) | def test_refine_respects_high_iteration_count( class TestNaNDivergenceDetection (line 2315) | class TestNaNDivergenceDetection: method test_parse_metrics_filters_nan (line 2318) | def test_parse_metrics_filters_nan(self) -> None: method test_parse_metrics_filters_inf (line 2327) | def test_parse_metrics_filters_inf(self) -> None: method test_detect_nan_divergence_finds_nan (line 2336) | def test_detect_nan_divergence_finds_nan(self) -> None: method test_detect_nan_divergence_finds_diverging_loss (line 2343) | def test_detect_nan_divergence_finds_diverging_loss(self) -> None: method test_detect_nan_divergence_returns_none_for_clean (line 2350) | def test_detect_nan_divergence_returns_none_for_clean(self) -> None: method test_runtime_issues_detects_diverging_loss (line 2356) | def test_runtime_issues_detects_diverging_loss(self) -> None: method test_compute_budget_includes_nan_guard (line 2367) | def test_compute_budget_includes_nan_guard(self) -> None: class TestExperimentHarness (line 2378) | class TestExperimentHarness: method test_harness_should_stop (line 2381) | def test_harness_should_stop(self) -> None: method test_harness_report_metric (line 2390) | def test_harness_report_metric(self, capsys: pytest.CaptureFixture[str... method test_harness_rejects_nan (line 2399) | def test_harness_rejects_nan(self, capsys: pytest.CaptureFixture[str])... method test_harness_rejects_inf (line 2408) | def test_harness_rejects_inf(self, capsys: pytest.CaptureFixture[str])... method test_harness_finalize (line 2415) | def test_harness_finalize(self, tmp_path: Path) -> None: method test_harness_progress (line 2435) | def test_harness_progress(self) -> None: method test_harness_injected_into_sandbox (line 2442) | def test_harness_injected_into_sandbox(self, tmp_path: Path) -> None: method test_harness_not_overwritten_by_project (line 2465) | def test_harness_not_overwritten_by_project(self, tmp_path: Path) -> N... method test_prompt_mentions_harness (line 2489) | def test_prompt_mentions_harness(self) -> None: class TestStdoutTruncation (line 2500) | class TestStdoutTruncation: method test_long_stdout_truncated_in_refine (line 2503) | def test_long_stdout_truncated_in_refine( class TestNoImproveStreakFix (line 2567) | class TestNoImproveStreakFix: method test_empty_metrics_dont_increment_streak (line 2570) | def test_empty_metrics_dont_increment_streak( class TestStdoutFailureDetection (line 2629) | class TestStdoutFailureDetection: method test_fail_signal_in_stdout_marks_failed (line 2632) | def test_fail_signal_in_stdout_marks_failed(self, tmp_path: Path) -> N... method test_clean_exit_no_fail_signal_marks_completed (line 2693) | def test_clean_exit_no_fail_signal_marks_completed(self, tmp_path: Pat... class TestMetricValUndefined (line 2750) | class TestMetricValUndefined: method test_metric_val_initialized_before_use (line 2753) | def test_metric_val_initialized_before_use(self) -> None: class TestConsecutiveEmptyMetrics (line 2765) | class TestConsecutiveEmptyMetrics: method test_detects_consecutive_empty (line 2768) | def test_detects_consecutive_empty(self, tmp_path: Path) -> None: method test_not_empty_when_metrics_exist (line 2790) | def test_not_empty_when_metrics_exist(self, tmp_path: Path) -> None: method test_false_when_no_previous_cycle (line 2810) | def test_false_when_no_previous_cycle(self, tmp_path: Path) -> None: class TestMultiConditionEnforcement (line 2831) | class TestMultiConditionEnforcement: method test_code_generation_prompt_has_multi_condition_block (line 2834) | def test_code_generation_prompt_has_multi_condition_block(self) -> None: method test_multi_condition_labels_required (line 2849) | def test_multi_condition_labels_required(self) -> None: class TestEvidenceBoundedWriting (line 2863) | class TestEvidenceBoundedWriting: method test_paper_draft_has_evidence_bounding_rules (line 2866) | def test_paper_draft_has_evidence_bounding_rules(self) -> None: method test_hedging_language_guidance (line 2882) | def test_hedging_language_guidance(self) -> None: class TestConditionCoverageDetection (line 2897) | class TestConditionCoverageDetection: method test_coverage_hint_injected_when_no_labels (line 2900) | def test_coverage_hint_injected_when_no_labels( method test_no_hint_when_labels_present (line 2962) | def test_no_hint_when_labels_present( class TestBreadthFirstPrompt (line 3030) | class TestBreadthFirstPrompt: method test_breadth_first_in_code_generation (line 3033) | def test_breadth_first_in_code_generation(self) -> None: class TestRefineFilePreservation (line 3047) | class TestRefineFilePreservation: method test_supporting_files_preserved_in_refine (line 3050) | def test_supporting_files_preserved_in_refine( class TestCodeGenTopicNeutral (line 3119) | class TestCodeGenTopicNeutral: method test_no_gradient_descent_bias (line 3122) | def test_no_gradient_descent_bias(self) -> None: method test_topic_relevant_guidance (line 3139) | def test_topic_relevant_guidance(self) -> None: class TestRefineTopicAlignment (line 3154) | class TestRefineTopicAlignment: method test_topic_alignment_in_refine_prompt (line 3157) | def test_topic_alignment_in_refine_prompt(self) -> None: function _make_prose (line 3180) | def _make_prose(word_count: int) -> str: # noqa: E302 function _make_bullets (line 3190) | def _make_bullets(word_count: int) -> str: function _make_comparative_prose (line 3197) | def _make_comparative_prose(word_count: int) -> str: function _make_results_prose (line 3210) | def _make_results_prose(word_count: int) -> str: function _build_draft (line 3221) | def _build_draft(**section_overrides: str) -> str: class TestValidateDraftQuality (line 3241) | class TestValidateDraftQuality: method test_short_section_triggers_warning (line 3244) | def test_short_section_triggers_warning(self) -> None: method test_bullet_density_triggers_warning (line 3252) | def test_bullet_density_triggers_warning(self) -> None: method test_clean_draft_no_warnings (line 3262) | def test_clean_draft_no_warnings(self) -> None: method test_balance_warning (line 3269) | def test_balance_warning(self) -> None: method test_writes_json_to_stage_dir (line 3282) | def test_writes_json_to_stage_dir(self, tmp_path: Path) -> None: FILE: tests/test_rc_hardware.py class TestHardwareProfile (line 24) | class TestHardwareProfile: method test_to_dict (line 25) | def test_to_dict(self): method test_cpu_only_profile (line 35) | def test_cpu_only_profile(self): class TestDetectNvidia (line 48) | class TestDetectNvidia: method test_high_vram_nvidia (line 49) | def test_high_vram_nvidia(self): method test_low_vram_nvidia (line 65) | def test_low_vram_nvidia(self): method test_nvidia_smi_not_found (line 77) | def test_nvidia_smi_not_found(self): method test_nvidia_smi_failure (line 84) | def test_nvidia_smi_failure(self): method test_nvidia_smi_timeout (line 91) | def test_nvidia_smi_timeout(self): class TestDetectMPS (line 103) | class TestDetectMPS: method test_apple_silicon (line 104) | def test_apple_silicon(self): method test_non_darwin (line 123) | def test_non_darwin(self): method test_intel_mac (line 127) | def test_intel_mac(self): class TestDetectHardware (line 139) | class TestDetectHardware: method test_falls_back_to_cpu (line 140) | def test_falls_back_to_cpu(self): method test_nvidia_takes_priority (line 152) | def test_nvidia_takes_priority(self): class TestEnsureTorchAvailable (line 174) | class TestEnsureTorchAvailable: method test_already_installed (line 175) | def test_already_installed(self): method test_cpu_only_skips_install (line 183) | def test_cpu_only_skips_install(self): method test_install_succeeds (line 191) | def test_install_succeeds(self): method test_install_fails (line 208) | def test_install_fails(self): method test_python_not_found (line 217) | def test_python_not_found(self): class TestIsMetricName (line 229) | class TestIsMetricName: method test_valid_metrics (line 230) | def test_valid_metrics(self): method test_log_lines_filtered (line 237) | def test_log_lines_filtered(self): method test_too_many_words_filtered (line 245) | def test_too_many_words_filtered(self): method test_short_names_pass (line 248) | def test_short_names_pass(self): FILE: tests/test_rc_health.py class _VersionInfo (line 16) | class _VersionInfo(NamedTuple): class _DummyHTTPResponse (line 24) | class _DummyHTTPResponse: method __init__ (line 28) | def __init__( method read (line 34) | def read(self) -> bytes: method __enter__ (line 37) | def __enter__(self) -> _DummyHTTPResponse: method __exit__ (line 40) | def __exit__(self, exc_type: object, exc: object, tb: object) -> None: function _write_valid_config (line 44) | def _write_valid_config(path: Path) -> None: function test_check_python_version_pass (line 66) | def test_check_python_version_pass() -> None: function test_check_python_version_fail (line 72) | def test_check_python_version_fail() -> None: function test_check_yaml_import_pass (line 79) | def test_check_yaml_import_pass() -> None: function test_check_yaml_import_fail (line 85) | def test_check_yaml_import_fail() -> None: function test_check_config_valid_pass (line 92) | def test_check_config_valid_pass(tmp_path: Path) -> None: function test_check_config_invalid (line 99) | def test_check_config_invalid(tmp_path: Path) -> None: function test_check_config_missing_file (line 107) | def test_check_config_missing_file(tmp_path: Path) -> None: function test_check_llm_connectivity_pass (line 113) | def test_check_llm_connectivity_pass() -> None: function test_check_llm_connectivity_timeout (line 119) | def test_check_llm_connectivity_timeout() -> None: function test_check_llm_connectivity_http_error (line 129) | def test_check_llm_connectivity_http_error() -> None: function test_check_api_key_valid (line 141) | def test_check_api_key_valid() -> None: function test_check_api_key_invalid_401 (line 150) | def test_check_api_key_invalid_401() -> None: function test_check_model_available_pass (line 162) | def test_check_model_available_pass() -> None: function test_check_model_not_available (line 174) | def test_check_model_not_available() -> None: function test_check_model_chain_all_available (line 187) | def test_check_model_chain_all_available() -> None: function test_check_model_chain_primary_missing_fallback_ok (line 200) | def test_check_model_chain_primary_missing_fallback_ok() -> None: function test_check_model_chain_all_missing (line 215) | def test_check_model_chain_all_missing() -> None: function test_check_model_chain_no_models (line 229) | def test_check_model_chain_no_models() -> None: function test_check_sandbox_python_exists (line 237) | def test_check_sandbox_python_exists() -> None: function test_check_sandbox_python_missing (line 246) | def test_check_sandbox_python_missing() -> None: function test_check_matplotlib_available (line 255) | def test_check_matplotlib_available() -> None: function test_check_matplotlib_missing (line 261) | def test_check_matplotlib_missing() -> None: function test_check_experiment_mode_simulated (line 268) | def test_check_experiment_mode_simulated() -> None: function test_check_experiment_mode_sandbox (line 273) | def test_check_experiment_mode_sandbox() -> None: function test_run_doctor_all_pass_openai (line 278) | def test_run_doctor_all_pass_openai(tmp_path: Path) -> None: function test_run_doctor_with_failures (line 333) | def test_run_doctor_with_failures(tmp_path: Path) -> None: function test_doctor_report_json_structure (line 388) | def test_doctor_report_json_structure(tmp_path: Path) -> None: function test_doctor_report_overall_logic (line 409) | def test_doctor_report_overall_logic() -> None: function test_print_doctor_report_pass (line 426) | def test_print_doctor_report_pass(capsys: pytest.CaptureFixture[str]) ->... function test_print_doctor_report_fail (line 438) | def test_print_doctor_report_fail(capsys: pytest.CaptureFixture[str]) ->... function test_check_acp_agent_found (line 459) | def test_check_acp_agent_found() -> None: function test_check_acp_agent_missing (line 466) | def test_check_acp_agent_missing() -> None: function _write_acp_config (line 474) | def _write_acp_config(path: Path) -> None: function test_run_doctor_acp_skips_http_checks (line 496) | def test_run_doctor_acp_skips_http_checks(tmp_path: Path) -> None: function test_run_doctor_acp_includes_agent_check (line 537) | def test_run_doctor_acp_includes_agent_check(tmp_path: Path) -> None: function test_print_doctor_report_ascii_fallback (line 578) | def test_print_doctor_report_ascii_fallback(monkeypatch: pytest.MonkeyPa... FILE: tests/test_rc_kb.py function _kb_root (line 19) | def _kb_root(tmp_path: Path) -> Path: function test_kb_entry_dataclass_creation (line 23) | def test_kb_entry_dataclass_creation(): function test_write_kb_entry_creates_expected_file_path (line 37) | def test_write_kb_entry_creates_expected_file_path(tmp_path: Path): function test_write_kb_entry_includes_frontmatter_markers (line 45) | def test_write_kb_entry_includes_frontmatter_markers(tmp_path: Path): function test_write_kb_entry_markdown_backend_has_no_obsidian_extras (line 53) | def test_write_kb_entry_markdown_backend_has_no_obsidian_extras(tmp_path... function test_write_kb_entry_obsidian_backend_includes_tags_and_wikilinks (line 72) | def test_write_kb_entry_obsidian_backend_includes_tags_and_wikilinks(tmp... function test_markdown_frontmatter_output_format_and_fields (line 91) | def test_markdown_frontmatter_output_format_and_fields(): function test_obsidian_enhancements_with_tags_and_links (line 114) | def test_obsidian_enhancements_with_tags_and_links(): function test_obsidian_enhancements_with_no_tags_or_links_returns_empty (line 130) | def test_obsidian_enhancements_with_no_tags_or_links_returns_empty(): function test_kb_category_map_has_exactly_22_stage_entries (line 135) | def test_kb_category_map_has_exactly_22_stage_entries(): function test_kb_category_map_values_are_valid_categories (line 140) | def test_kb_category_map_values_are_valid_categories(): function test_write_stage_to_kb_places_entry_in_mapped_category (line 152) | def test_write_stage_to_kb_places_entry_in_mapped_category(tmp_path: Path): function test_write_stage_to_kb_reads_artifact_file_contents (line 164) | def test_write_stage_to_kb_reads_artifact_file_contents(tmp_path: Path): function test_write_stage_to_kb_handles_missing_artifacts_gracefully (line 177) | def test_write_stage_to_kb_handles_missing_artifacts_gracefully(tmp_path... function test_write_stage_to_kb_truncates_large_artifact_content (line 188) | def test_write_stage_to_kb_truncates_large_artifact_content(tmp_path: Pa... function test_write_stage_to_kb_directory_artifact_records_listing (line 202) | def test_write_stage_to_kb_directory_artifact_records_listing(tmp_path: ... function test_generate_weekly_report_creates_file_in_reviews_category (line 217) | def test_generate_weekly_report_creates_file_in_reviews_category(tmp_pat... function test_generate_weekly_report_with_empty_run_dirs (line 230) | def test_generate_weekly_report_with_empty_run_dirs(tmp_path: Path): function test_generate_weekly_report_aggregates_statistics_correctly (line 238) | def test_generate_weekly_report_aggregates_statistics_correctly(tmp_path... function test_generate_weekly_report_ignores_missing_summary_files (line 280) | def test_generate_weekly_report_ignores_missing_summary_files(tmp_path: ... FILE: tests/test_rc_literature.py function _make_paper (line 39) | def _make_paper(**kwargs: Any) -> Paper: class TestAuthor (line 110) | class TestAuthor: method test_last_name_simple (line 111) | def test_last_name_simple(self) -> None: method test_last_name_accented (line 115) | def test_last_name_accented(self) -> None: method test_last_name_single (line 119) | def test_last_name_single(self) -> None: method test_last_name_empty (line 123) | def test_last_name_empty(self) -> None: class TestPaper (line 133) | class TestPaper: method test_cite_key_format (line 134) | def test_cite_key_format(self) -> None: method test_cite_key_no_authors (line 139) | def test_cite_key_no_authors(self) -> None: method test_cite_key_no_year (line 143) | def test_cite_key_no_year(self) -> None: method test_to_bibtex_contains_fields (line 147) | def test_to_bibtex_contains_fields(self) -> None: method test_to_bibtex_override (line 157) | def test_to_bibtex_override(self) -> None: method test_to_bibtex_article_no_venue (line 161) | def test_to_bibtex_article_no_venue(self) -> None: method test_to_bibtex_arxiv_category_venue (line 167) | def test_to_bibtex_arxiv_category_venue(self) -> None: method test_to_dict (line 174) | def test_to_dict(self) -> None: method test_paper_frozen (line 182) | def test_paper_frozen(self) -> None: class TestSemanticScholar (line 193) | class TestSemanticScholar: method test_parse_s2_paper (line 194) | def test_parse_s2_paper(self) -> None: method test_search_semantic_scholar_mock (line 207) | def test_search_semantic_scholar_mock( method test_search_semantic_scholar_network_error (line 231) | def test_search_semantic_scholar_network_error( class TestArxiv (line 257) | class TestArxiv: method test_convert_result (line 258) | def test_convert_result(self) -> None: method test_search_arxiv_mock (line 287) | def test_search_arxiv_mock(self, monkeypatch: pytest.MonkeyPatch) -> N... method test_search_arxiv_error_graceful (line 326) | def test_search_arxiv_error_graceful(self, monkeypatch: pytest.MonkeyP... class TestDeduplication (line 369) | class TestDeduplication: method test_dedup_by_doi (line 370) | def test_dedup_by_doi(self) -> None: method test_dedup_by_arxiv_id (line 379) | def test_dedup_by_arxiv_id(self) -> None: method test_dedup_by_title (line 394) | def test_dedup_by_title(self) -> None: method test_dedup_no_duplicates (line 413) | def test_dedup_no_duplicates(self) -> None: method test_normalise_title (line 419) | def test_normalise_title(self) -> None: class TestPapersToBibtex (line 424) | class TestPapersToBibtex: method test_generates_combined (line 425) | def test_generates_combined(self) -> None: class TestSearchPapers (line 434) | class TestSearchPapers: method test_search_papers_combines_sources (line 435) | def test_search_papers_combines_sources( method test_default_sources_openalex_first (line 465) | def test_default_sources_openalex_first(self) -> None: method test_s2_failure_does_not_block_others (line 472) | def test_s2_failure_does_not_block_others( method test_search_papers_unknown_source (line 498) | def test_search_papers_unknown_source( method test_search_papers_multi_query (line 505) | def test_search_papers_multi_query(self, monkeypatch: pytest.MonkeyPat... class TestEdgeCases (line 537) | class TestEdgeCases: method test_paper_with_no_meaningful_title_word (line 538) | def test_paper_with_no_meaningful_title_word(self) -> None: method test_paper_multiple_authors_bibtex (line 545) | def test_paper_multiple_authors_bibtex(self) -> None: method test_empty_s2_response (line 556) | def test_empty_s2_response(self) -> None: class TestArxivCircuitBreaker (line 569) | class TestArxivCircuitBreaker: method setup_method (line 570) | def setup_method(self) -> None: method test_failure_triggers_circuit_breaker (line 574) | def test_failure_triggers_circuit_breaker(self) -> None: method test_breaker_open_skips_requests (line 585) | def test_breaker_open_skips_requests(self) -> None: method test_success_resets_breaker (line 596) | def test_success_resets_breaker(self) -> None: method test_half_open_probe_failure_doubles_cooldown (line 607) | def test_half_open_probe_failure_doubles_cooldown(self) -> None: method test_search_with_http_error (line 618) | def test_search_with_http_error(self, monkeypatch: pytest.MonkeyPatch)... class TestOpenAlex (line 692) | class TestOpenAlex: method test_parse_openalex_response (line 693) | def test_parse_openalex_response(self, monkeypatch: pytest.MonkeyPatch... method test_abstract_reconstruction (line 719) | def test_abstract_reconstruction(self) -> None: method test_abstract_empty (line 726) | def test_abstract_empty(self) -> None: method test_openalex_network_error (line 731) | def test_openalex_network_error(self, monkeypatch: pytest.MonkeyPatch)... class TestMultiSourceFallback (line 752) | class TestMultiSourceFallback: method test_openalex_failure_falls_back_to_s2_and_arxiv (line 753) | def test_openalex_failure_falls_back_to_s2_and_arxiv( class TestCacheTTL (line 791) | class TestCacheTTL: method test_source_specific_ttl (line 792) | def test_source_specific_ttl(self, tmp_path: Any) -> None: method test_citation_verify_ttl_is_permanent (line 805) | def test_citation_verify_ttl_is_permanent(self) -> None: FILE: tests/test_rc_llm.py class _DummyHTTPResponse (line 13) | class _DummyHTTPResponse: method __init__ (line 14) | def __init__(self, payload: Mapping[str, Any]): method read (line 17) | def read(self) -> bytes: method __enter__ (line 20) | def __enter__(self) -> _DummyHTTPResponse: method __exit__ (line 23) | def __exit__(self, exc_type: object, exc: object, tb: object) -> None: function _make_client (line 27) | def _make_client( function _capture_raw_call (line 44) | def _capture_raw_call( function test_llm_config_defaults (line 68) | def test_llm_config_defaults(): function test_llm_config_custom_values (line 75) | def test_llm_config_custom_values(): function test_llm_response_dataclass_fields (line 92) | def test_llm_response_dataclass_fields(): function test_llm_response_defaults (line 99) | def test_llm_response_defaults(): function test_llm_client_initialization_stores_config (line 109) | def test_llm_client_initialization_stores_config(): function test_llm_client_model_chain_is_primary_plus_fallbacks (line 115) | def test_llm_client_model_chain_is_primary_plus_fallbacks(): function test_needs_max_completion_tokens_for_new_models (line 122) | def test_needs_max_completion_tokens_for_new_models(): function test_needs_max_completion_tokens_false_for_old_models (line 127) | def test_needs_max_completion_tokens_false_for_old_models(): function test_build_request_body_structure_via_raw_call (line 132) | def test_build_request_body_structure_via_raw_call(monkeypatch: pytest.M... function test_build_request_uses_max_completion_tokens_for_new_models (line 140) | def test_build_request_uses_max_completion_tokens_for_new_models( function test_build_request_uses_max_tokens_for_old_models (line 150) | def test_build_request_uses_max_tokens_for_old_models(monkeypatch: pytes... function test_parse_response_with_valid_payload_via_raw_call (line 157) | def test_parse_response_with_valid_payload_via_raw_call( function test_parse_response_truncated_when_finish_reason_length (line 174) | def test_parse_response_truncated_when_finish_reason_length( function test_parse_response_missing_optional_fields_graceful (line 188) | def test_parse_response_missing_optional_fields_graceful( function test_from_rc_config_builds_expected_llm_config (line 202) | def test_from_rc_config_builds_expected_llm_config(): function test_from_rc_config_reads_api_key_from_env_when_missing (line 219) | def test_from_rc_config_reads_api_key_from_env_when_missing( function test_new_param_models_contains_expected_models (line 236) | def test_new_param_models_contains_expected_models(): function test_raw_call_adds_json_mode_response_format (line 241) | def test_raw_call_adds_json_mode_response_format(monkeypatch: pytest.Mon... function test_raw_call_sets_auth_and_user_agent_headers (line 262) | def test_raw_call_sets_auth_and_user_agent_headers(monkeypatch: pytest.M... function test_chat_prepends_system_message (line 282) | def test_chat_prepends_system_message(monkeypatch: pytest.MonkeyPatch): function test_chat_uses_fallback_after_first_model_error (line 302) | def test_chat_uses_fallback_after_first_model_error(monkeypatch: pytest.... FILE: tests/test_rc_novelty.py class TestExtractKeywords (line 27) | class TestExtractKeywords: method test_basic_extraction (line 28) | def test_basic_extraction(self) -> None: method test_stop_words_removed (line 35) | def test_stop_words_removed(self) -> None: method test_short_tokens_removed (line 41) | def test_short_tokens_removed(self) -> None: method test_deduplication (line 48) | def test_deduplication(self) -> None: method test_empty_input (line 52) | def test_empty_input(self) -> None: method test_preserves_order (line 55) | def test_preserves_order(self) -> None: class TestJaccardKeywords (line 65) | class TestJaccardKeywords: method test_identical_sets (line 66) | def test_identical_sets(self) -> None: method test_disjoint_sets (line 69) | def test_disjoint_sets(self) -> None: method test_partial_overlap (line 72) | def test_partial_overlap(self) -> None: method test_empty_first (line 76) | def test_empty_first(self) -> None: method test_empty_second (line 79) | def test_empty_second(self) -> None: method test_both_empty (line 82) | def test_both_empty(self) -> None: class TestComputeSimilarity (line 91) | class TestComputeSimilarity: method test_returns_float_0_to_1 (line 92) | def test_returns_float_0_to_1(self) -> None: method test_high_similarity_for_matching_content (line 100) | def test_high_similarity_for_matching_content(self) -> None: method test_low_similarity_for_unrelated_content (line 109) | def test_low_similarity_for_unrelated_content(self) -> None: method test_empty_keywords (line 118) | def test_empty_keywords(self) -> None: class TestBuildNoveltyQueries (line 128) | class TestBuildNoveltyQueries: method test_includes_topic (line 129) | def test_includes_topic(self) -> None: method test_extracts_hypothesis_titles (line 133) | def test_extracts_hypothesis_titles(self) -> None: method test_caps_at_5 (line 143) | def test_caps_at_5(self) -> None: method test_skips_short_titles (line 151) | def test_skips_short_titles(self) -> None: method test_empty_hypotheses (line 157) | def test_empty_hypotheses(self) -> None: class TestAssessNovelty (line 168) | class TestAssessNovelty: method test_no_similar_papers_is_high (line 169) | def test_no_similar_papers_is_high(self) -> None: method test_moderate_similarity (line 174) | def test_moderate_similarity(self) -> None: method test_high_similarity_low_novelty (line 180) | def test_high_similarity_low_novelty(self) -> None: method test_multiple_high_impact_overlaps_penalize (line 186) | def test_multiple_high_impact_overlaps_penalize(self) -> None: method test_score_bounded_0_to_1 (line 196) | def test_score_bounded_0_to_1(self) -> None: method test_critical_assessment (line 201) | def test_critical_assessment(self) -> None: class TestCheckNovelty (line 216) | class TestCheckNovelty: method test_basic_flow (line 220) | def test_basic_flow(self, mock_search: MagicMock) -> None: method test_with_similar_papers (line 235) | def test_with_similar_papers(self, mock_search: MagicMock) -> None: method test_with_pipeline_papers (line 260) | def test_with_pipeline_papers(self, mock_search: MagicMock) -> None: method test_search_failure_graceful (line 284) | def test_search_failure_graceful(self, mock_search: MagicMock) -> None: method test_output_keys_complete (line 295) | def test_output_keys_complete(self, mock_search: MagicMock) -> None: method test_recommendation_values (line 319) | def test_recommendation_values(self, mock_search: MagicMock) -> None: method test_json_serializable (line 329) | def test_json_serializable(self, mock_search: MagicMock) -> None: method test_similar_papers_capped_at_20 (line 340) | def test_similar_papers_capped_at_20(self, mock_search: MagicMock) -> ... class TestHypothesisGenNoveltyIntegration (line 369) | class TestHypothesisGenNoveltyIntegration: method test_novelty_report_written_when_available (line 372) | def test_novelty_report_written_when_available(self, tmp_path: Path) -... method test_novelty_failure_does_not_block (line 422) | def test_novelty_failure_does_not_block(self, tmp_path: Path) -> None: FILE: tests/test_rc_preflight.py function _make_client (line 10) | def _make_client( class TestPreflight (line 29) | class TestPreflight: method test_preflight_success (line 30) | def test_preflight_success(self): method test_preflight_401_invalid_key (line 39) | def test_preflight_401_invalid_key(self): method test_preflight_403_model_forbidden (line 47) | def test_preflight_403_model_forbidden(self): method test_preflight_404_bad_endpoint (line 55) | def test_preflight_404_bad_endpoint(self): method test_preflight_429_rate_limited (line 63) | def test_preflight_429_rate_limited(self): method test_preflight_timeout (line 71) | def test_preflight_timeout(self): method test_preflight_all_models_failed (line 79) | def test_preflight_all_models_failed(self): method test_preflight_unknown_http_error (line 87) | def test_preflight_unknown_http_error(self): FILE: tests/test_rc_prompts.py class TestRender (line 23) | class TestRender: method test_simple_substitution (line 24) | def test_simple_substitution(self) -> None: method test_multiple_variables (line 27) | def test_multiple_variables(self) -> None: method test_missing_variable_left_untouched (line 33) | def test_missing_variable_left_untouched(self) -> None: method test_json_schema_not_substituted (line 36) | def test_json_schema_not_substituted(self) -> None: method test_json_schema_complex_not_substituted (line 40) | def test_json_schema_complex_not_substituted(self) -> None: method test_curly_braces_in_code_not_substituted (line 44) | def test_curly_braces_in_code_not_substituted(self) -> None: method test_underscore_variable (line 48) | def test_underscore_variable(self) -> None: method test_numeric_suffix (line 51) | def test_numeric_suffix(self) -> None: method test_empty_template (line 54) | def test_empty_template(self) -> None: method test_no_placeholders (line 57) | def test_no_placeholders(self) -> None: class TestPromptManagerDefaults (line 66) | class TestPromptManagerDefaults: method test_all_stages_present (line 67) | def test_all_stages_present(self) -> None: method test_system_prompt_nonempty (line 96) | def test_system_prompt_nonempty(self) -> None: method test_for_stage_returns_rendered_prompt (line 101) | def test_for_stage_returns_rendered_prompt(self) -> None: method test_json_mode_stages (line 115) | def test_json_mode_stages(self) -> None: method test_non_json_stages (line 128) | def test_non_json_stages(self) -> None: method test_max_tokens (line 133) | def test_max_tokens(self) -> None: method test_block_topic_constraint (line 139) | def test_block_topic_constraint(self) -> None: method test_block_pkg_hint (line 145) | def test_block_pkg_hint(self) -> None: method test_sub_prompt_code_repair (line 151) | def test_sub_prompt_code_repair(self) -> None: method test_sub_prompt_iterative_improve (line 163) | def test_sub_prompt_iterative_improve(self) -> None: method test_sub_prompt_iterative_repair (line 175) | def test_sub_prompt_iterative_repair(self) -> None: class TestPromptManagerOverrides (line 188) | class TestPromptManagerOverrides: method test_override_system_prompt (line 189) | def test_override_system_prompt(self, tmp_path: Path) -> None: method test_override_user_template (line 202) | def test_override_user_template(self, tmp_path: Path) -> None: method test_override_block (line 214) | def test_override_block(self, tmp_path: Path) -> None: method test_override_json_mode (line 224) | def test_override_json_mode(self, tmp_path: Path) -> None: method test_missing_file_uses_defaults (line 235) | def test_missing_file_uses_defaults(self, tmp_path: Path) -> None: method test_invalid_yaml_uses_defaults (line 240) | def test_invalid_yaml_uses_defaults(self, tmp_path: Path) -> None: method test_unknown_stage_in_override_ignored (line 246) | def test_unknown_stage_in_override_ignored(self, tmp_path: Path) -> None: class TestExportYaml (line 264) | class TestExportYaml: method test_export_roundtrip (line 265) | def test_export_roundtrip(self, tmp_path: Path) -> None: method test_export_contains_all_stages (line 277) | def test_export_contains_all_stages(self, tmp_path: Path) -> None: method test_export_with_overrides (line 285) | def test_export_with_overrides(self, tmp_path: Path) -> None: class TestRenderedPrompt (line 303) | class TestRenderedPrompt: method test_defaults (line 304) | def test_defaults(self) -> None: method test_with_options (line 309) | def test_with_options(self) -> None: method test_frozen (line 314) | def test_frozen(self) -> None: FILE: tests/test_rc_quality.py class TestDetectTemplateContent (line 50) | class TestDetectTemplateContent: method test_real_text_no_matches (line 51) | def test_real_text_no_matches(self): method test_template_text_has_matches (line 55) | def test_template_text_has_matches(self): method test_detects_insert_placeholder (line 59) | def test_detects_insert_placeholder(self): method test_detects_todo_placeholder (line 64) | def test_detects_todo_placeholder(self): method test_detects_template_section (line 69) | def test_detects_template_section(self): method test_detects_future_tense_placeholder (line 74) | def test_detects_future_tense_placeholder(self): method test_detects_lorem_ipsum (line 79) | def test_detects_lorem_ipsum(self): method test_match_has_line_number (line 84) | def test_match_has_line_number(self): method test_real_paper_section_clean (line 90) | def test_real_paper_section_clean(self): method test_empty_text (line 94) | def test_empty_text(self): class TestComputeTemplateRatio (line 99) | class TestComputeTemplateRatio: method test_real_text_low_ratio (line 100) | def test_real_text_low_ratio(self): method test_template_text_high_ratio (line 104) | def test_template_text_high_ratio(self): method test_mixed_content_moderate_ratio (line 108) | def test_mixed_content_moderate_ratio(self): method test_empty_text_zero_ratio (line 112) | def test_empty_text_zero_ratio(self): method test_ratio_bounded_0_1 (line 116) | def test_ratio_bounded_0_1(self): method test_real_paper_section_low_ratio (line 120) | def test_real_paper_section_low_ratio(self): class TestAssessQuality (line 125) | class TestAssessQuality: method test_report_has_all_fields (line 126) | def test_report_has_all_fields(self): method test_report_to_dict (line 133) | def test_report_to_dict(self): method test_report_has_template_flag (line 141) | def test_report_has_template_flag(self): class TestCheckStrictQuality (line 149) | class TestCheckStrictQuality: method test_real_text_passes (line 150) | def test_real_text_passes(self): method test_template_text_fails (line 154) | def test_template_text_fails(self): method test_custom_threshold (line 159) | def test_custom_threshold(self): method test_failure_message_includes_examples (line 163) | def test_failure_message_includes_examples(self): FILE: tests/test_rc_report.py class TestReport (line 12) | class TestReport: method test_report_missing_run_dir (line 13) | def test_report_missing_run_dir(self, tmp_path: Path): method test_report_no_summary (line 17) | def test_report_no_summary(self, tmp_path: Path): method test_report_minimal_run (line 21) | def test_report_minimal_run(self, tmp_path: Path): method test_report_with_paper (line 40) | def test_report_with_paper(self, tmp_path: Path): method test_report_with_citations (line 62) | def test_report_with_citations(self, tmp_path: Path): method test_report_with_failures (line 92) | def test_report_with_failures(self, tmp_path: Path): method test_report_with_experiment_results (line 110) | def test_report_with_experiment_results(self, tmp_path: Path): FILE: tests/test_rc_runner.py function rc_config (line 18) | def rc_config(tmp_path: Path) -> RCConfig: function adapters (line 37) | def adapters() -> AdapterBundle: function run_dir (line 42) | def run_dir(tmp_path: Path) -> Path: function _done (line 48) | def _done(stage: Stage, artifacts: tuple[str, ...] = ("out.md",)) -> Sta... function _failed (line 52) | def _failed(stage: Stage, msg: str = "boom") -> StageResult: function _blocked (line 56) | def _blocked(stage: Stage) -> StageResult: function test_execute_pipeline_runs_stages_in_sequence (line 65) | def test_execute_pipeline_runs_stages_in_sequence( function test_execute_pipeline_stops_on_failed_stage (line 90) | def test_execute_pipeline_stops_on_failed_stage( function test_execute_pipeline_stops_on_gate_when_stop_on_gate_enabled (line 116) | def test_execute_pipeline_stops_on_gate_when_stop_on_gate_enabled( function test_execute_pipeline_continues_after_gate_when_stop_on_gate_disabled (line 143) | def test_execute_pipeline_continues_after_gate_when_stop_on_gate_disabled( function test_execute_pipeline_writes_pipeline_summary_json (line 169) | def test_execute_pipeline_writes_pipeline_summary_json( function test_pipeline_summary_has_expected_fields_and_values (line 190) | def test_pipeline_summary_has_expected_fields_and_values( function test_execute_pipeline_from_stage_skips_earlier_stages (line 228) | def test_execute_pipeline_from_stage_skips_earlier_stages( function test_execute_pipeline_writes_kb_entries_when_kb_root_provided (line 254) | def test_execute_pipeline_writes_kb_entries_when_kb_root_provided( function test_execute_pipeline_passes_auto_approve_flag_to_execute_stage (line 299) | def test_execute_pipeline_passes_auto_approve_flag_to_execute_stage( function test_should_start_logic (line 331) | def test_should_start_logic(stage: Stage, started: bool, expected: bool)... function test_build_pipeline_summary_core_fields (line 347) | def test_build_pipeline_summary_core_fields( function test_pipeline_prints_stage_progress (line 360) | def test_pipeline_prints_stage_progress( function test_pipeline_prints_elapsed_time (line 410) | def test_pipeline_prints_elapsed_time( function _pivot_result (line 453) | def _pivot_result(stage: Stage) -> StageResult: function _refine_result (line 459) | def _refine_result(stage: Stage) -> StageResult: function test_pivot_decision_triggers_rollback_to_hypothesis_gen (line 465) | def test_pivot_decision_triggers_rollback_to_hypothesis_gen( function test_refine_decision_triggers_rollback_to_iterative_refine (line 501) | def test_refine_decision_triggers_rollback_to_iterative_refine( function test_max_pivot_count_prevents_infinite_loop (line 531) | def test_max_pivot_count_prevents_infinite_loop( function test_proceed_decision_does_not_trigger_rollback (line 560) | def test_proceed_decision_does_not_trigger_rollback( function test_read_pivot_count_returns_zero_for_no_history (line 585) | def test_read_pivot_count_returns_zero_for_no_history(run_dir: Path) -> ... function test_record_decision_history_appends (line 589) | def test_record_decision_history_appends(run_dir: Path) -> None: function _setup_stage_artifacts (line 601) | def _setup_stage_artifacts(run_dir: Path) -> None: function test_package_deliverables_collects_all_artifacts (line 623) | def test_package_deliverables_collects_all_artifacts( function test_package_deliverables_prefers_verified_versions (line 641) | def test_package_deliverables_prefers_verified_versions( function test_package_deliverables_falls_back_to_stage22 (line 654) | def test_package_deliverables_falls_back_to_stage22( function test_package_deliverables_returns_none_when_no_stage_artifacts (line 669) | def test_package_deliverables_returns_none_when_no_stage_artifacts( function test_package_deliverables_includes_style_files (line 695) | def test_package_deliverables_includes_style_files( function test_write_checkpoint_uses_atomic_rename (line 711) | def test_write_checkpoint_uses_atomic_rename(run_dir: Path) -> None: function test_write_checkpoint_leaves_no_temp_files (line 721) | def test_write_checkpoint_leaves_no_temp_files(run_dir: Path) -> None: function test_write_checkpoint_preserves_old_on_write_failure (line 728) | def test_write_checkpoint_preserves_old_on_write_failure( function test_write_checkpoint_overwrites_previous (line 758) | def test_write_checkpoint_overwrites_previous(run_dir: Path) -> None: function _degraded (line 767) | def _degraded(stage: Stage) -> StageResult: function test_degraded_quality_gate_continues_pipeline (line 776) | def test_degraded_quality_gate_continues_pipeline( function test_package_deliverables_called_after_pipeline (line 815) | def test_package_deliverables_called_after_pipeline( function _make_stage14_summary (line 844) | def _make_stage14_summary(run_dir: Path, suffix: str, pm_value: float) -... class TestPromoteBestStage14BestJson (line 857) | class TestPromoteBestStage14BestJson: method max_config (line 862) | def max_config(self, rc_config: RCConfig) -> RCConfig: method test_best_json_written_when_current_is_best (line 867) | def test_best_json_written_when_current_is_best( method test_best_json_written_when_promotion_needed (line 883) | def test_best_json_written_when_promotion_needed( method test_best_json_written_with_equal_values (line 898) | def test_best_json_written_with_equal_values( class TestPromoteBestStage14AnalysisBest (line 916) | class TestPromoteBestStage14AnalysisBest: method max_config (line 920) | def max_config(self, rc_config: RCConfig) -> RCConfig: method test_analysis_best_written_from_best_iteration (line 924) | def test_analysis_best_written_from_best_iteration( method test_analysis_best_written_when_current_is_best (line 940) | def test_analysis_best_written_when_current_is_best( method test_no_analysis_best_when_no_analysis_md (line 955) | def test_no_analysis_best_when_no_analysis_md( class TestPromoteBestStage14DegenerateDetection (line 966) | class TestPromoteBestStage14DegenerateDetection: method test_degenerate_minimize_skipped (line 969) | def test_degenerate_minimize_skipped(self, run_dir: Path, rc_config: R... method test_legitimate_minimize_not_skipped (line 983) | def test_legitimate_minimize_not_skipped(self, run_dir: Path, rc_confi... method test_single_candidate_not_affected (line 995) | def test_single_candidate_not_affected(self, run_dir: Path, rc_config:... FILE: tests/test_rc_sanitization.py function run_dir (line 14) | def run_dir(tmp_path: Path) -> Path: function _write_experiment_summary (line 20) | def _write_experiment_summary(run_dir: Path, data: dict) -> None: function test_sanitize_replaces_unverified_numbers (line 28) | def test_sanitize_replaces_unverified_numbers(run_dir: Path) -> None: function test_sanitize_preserves_table_structure (line 53) | def test_sanitize_preserves_table_structure(run_dir: Path) -> None: function test_sanitize_no_experiment_summary (line 70) | def test_sanitize_no_experiment_summary(run_dir: Path) -> None: function test_sanitize_tolerance_within_1_percent (line 77) | def test_sanitize_tolerance_within_1_percent(run_dir: Path) -> None: function test_sanitize_header_row_preserved (line 92) | def test_sanitize_header_row_preserved(run_dir: Path) -> None: function test_sanitize_hp_columns_preserved_in_mixed_table (line 106) | def test_sanitize_hp_columns_preserved_in_mixed_table(run_dir: Path) -> ... function test_sanitize_pure_hp_table_skipped (line 129) | def test_sanitize_pure_hp_table_skipped(run_dir: Path) -> None: function test_prose_sanitization_replaces_unverified (line 148) | def test_prose_sanitization_replaces_unverified(run_dir: Path) -> None: function test_sanitize_model_name_numbers_preserved (line 172) | def test_sanitize_model_name_numbers_preserved(run_dir: Path) -> None: function test_sanitize_unicode_hyphen_model_names_preserved (line 192) | def test_sanitize_unicode_hyphen_model_names_preserved(run_dir: Path) ->... function test_prose_sanitization_preserves_introduction (line 211) | def test_prose_sanitization_preserves_introduction(run_dir: Path) -> None: function test_rl_compatibility_dqn_continuous_detected (line 236) | def test_rl_compatibility_dqn_continuous_detected() -> None: function test_rl_compatibility_ppo_continuous_ok (line 252) | def test_rl_compatibility_ppo_continuous_ok() -> None: function test_sanitize_reads_promoted_best_data (line 266) | def test_sanitize_reads_promoted_best_data(run_dir: Path) -> None: function test_sanitize_rejects_regressed_refine_data (line 307) | def test_sanitize_rejects_regressed_refine_data(run_dir: Path) -> None: function test_sanitize_condition_names_with_decimals_preserved (line 365) | def test_sanitize_condition_names_with_decimals_preserved(run_dir: Path)... function test_rl_compatibility_dqn_discrete_ok (line 388) | def test_rl_compatibility_dqn_discrete_ok() -> None: function test_sanitize_latex_tabular_replaces_unverified (line 406) | def test_sanitize_latex_tabular_replaces_unverified(run_dir: Path) -> None: function test_sanitize_latex_tabular_hp_table_skipped (line 441) | def test_sanitize_latex_tabular_hp_table_skipped(run_dir: Path) -> None: function test_sanitize_latex_tabular_with_pm (line 467) | def test_sanitize_latex_tabular_with_pm(run_dir: Path) -> None: function test_sanitize_latex_tabular_preserves_first_column (line 495) | def test_sanitize_latex_tabular_preserves_first_column(run_dir: Path) ->... function test_sanitize_skips_statistical_analysis_table (line 521) | def test_sanitize_skips_statistical_analysis_table(run_dir: Path) -> None: function test_sanitize_preserves_common_hp_values (line 550) | def test_sanitize_preserves_common_hp_values(run_dir: Path) -> None: FILE: tests/test_rc_sentinel.py class TestHeartbeatWriting (line 20) | class TestHeartbeatWriting: method test_write_heartbeat_creates_file (line 21) | def test_write_heartbeat_creates_file(self, tmp_path: Path) -> None: method test_heartbeat_contains_required_fields (line 26) | def test_heartbeat_contains_required_fields(self, tmp_path: Path) -> N... method test_heartbeat_updates_on_each_stage (line 35) | def test_heartbeat_updates_on_each_stage(self, tmp_path: Path) -> None: class TestHeartbeatInPipeline (line 44) | class TestHeartbeatInPipeline: method test_pipeline_writes_heartbeat_after_each_stage (line 45) | def test_pipeline_writes_heartbeat_after_each_stage( class TestSentinelScript (line 100) | class TestSentinelScript: method test_sentinel_script_exists (line 101) | def test_sentinel_script_exists(self) -> None: method test_sentinel_script_is_valid_bash (line 105) | def test_sentinel_script_is_valid_bash(self) -> None: method test_sentinel_script_is_executable (line 114) | def test_sentinel_script_is_executable(self) -> None: method test_sentinel_script_has_shebang (line 118) | def test_sentinel_script_has_shebang(self) -> None: method test_sentinel_prints_usage_on_no_args (line 123) | def test_sentinel_prints_usage_on_no_args(self) -> None: FILE: tests/test_rc_stages.py function test_stage_enum_has_exactly_23_members (line 23) | def test_stage_enum_has_exactly_23_members(): function test_stage_values_follow_sequence_order (line 30) | def test_stage_values_follow_sequence_order(index: int, stage: Stage): function test_stage_sequence_contains_all_23_stages_in_order (line 34) | def test_stage_sequence_contains_all_23_stages_in_order(): function test_next_stage_boundary_values (line 41) | def test_next_stage_boundary_values(): function test_previous_stage_boundary_values (line 46) | def test_previous_stage_boundary_values(): function test_gate_stages_matches_expected_set (line 51) | def test_gate_stages_matches_expected_set(): function test_gate_rollback_map_matches_expected_targets (line 57) | def test_gate_rollback_map_matches_expected_targets(): function test_phase_map_has_8_phases_with_expected_membership (line 65) | def test_phase_map_has_8_phases_with_expected_membership(): function test_phase_map_covers_all_stages_exactly_once (line 108) | def test_phase_map_covers_all_stages_exactly_once(): function test_start_event_transitions_to_running_from_allowed_states (line 118) | def test_start_event_transitions_to_running_from_allowed_states(status: ... function test_succeed_event_on_non_gate_stage_transitions_to_done (line 125) | def test_succeed_event_on_non_gate_stage_transitions_to_done(): function test_succeed_event_on_gate_stage_transitions_to_blocked_approval (line 139) | def test_succeed_event_on_gate_stage_transitions_to_blocked_approval(): function test_approve_event_transitions_blocked_stage_to_done (line 153) | def test_approve_event_transitions_blocked_stage_to_done(): function test_reject_event_rolls_back_to_default_gate_mapping (line 166) | def test_reject_event_rolls_back_to_default_gate_mapping(): function test_reject_event_uses_explicit_rollback_stage_when_provided (line 182) | def test_reject_event_uses_explicit_rollback_stage_when_provided(): function test_timeout_event_transitions_to_paused_with_block_decision (line 196) | def test_timeout_event_transitions_to_paused_with_block_decision(): function test_fail_event_transitions_running_to_failed_with_retry_decision (line 209) | def test_fail_event_transitions_running_to_failed_with_retry_decision(): function test_retry_event_transitions_failed_to_retrying (line 218) | def test_retry_event_transitions_failed_to_retrying(): function test_resume_event_transitions_paused_to_running (line 226) | def test_resume_event_transitions_paused_to_running(): function test_pause_event_transitions_failed_to_paused (line 233) | def test_pause_event_transitions_failed_to_paused(): function test_invalid_transition_raises_value_error (line 242) | def test_invalid_transition_raises_value_error(): function test_advance_rejects_unknown_transition_event_string (line 247) | def test_advance_rejects_unknown_transition_event_string(): function test_gate_required_for_gate_stages_with_default_config (line 253) | def test_gate_required_for_gate_stages_with_default_config(stage: Stage): function test_gate_required_respects_hitl_stage_subset (line 258) | def test_gate_required_respects_hitl_stage_subset(stage: Stage): function test_gate_required_is_false_for_non_gate_stages (line 264) | def test_gate_required_is_false_for_non_gate_stages(stage: Stage): function test_default_rollback_stage_for_known_gate_mappings (line 276) | def test_default_rollback_stage_for_known_gate_mappings(stage: Stage, ex... function test_default_rollback_stage_for_unknown_stage_uses_previous_stage (line 280) | def test_default_rollback_stage_for_unknown_stage_uses_previous_stage(): function test_default_rollback_stage_for_first_stage_returns_self (line 284) | def test_default_rollback_stage_for_first_stage_returns_self(): function test_transition_outcome_field_values_are_exposed (line 288) | def test_transition_outcome_field_values_are_exposed(): function test_sequence_and_neighbor_maps_are_consistent_for_all_stages (line 302) | def test_sequence_and_neighbor_maps_are_consistent_for_all_stages(): function test_transition_map_covers_all_stage_status_values (line 312) | def test_transition_map_covers_all_stage_status_values(): function test_decision_rollback_has_pivot_and_refine (line 324) | def test_decision_rollback_has_pivot_and_refine(): function test_decision_rollback_pivot_targets_hypothesis_gen (line 329) | def test_decision_rollback_pivot_targets_hypothesis_gen(): function test_decision_rollback_refine_targets_iterative_refine (line 333) | def test_decision_rollback_refine_targets_iterative_refine(): function test_max_decision_pivots_is_positive (line 337) | def test_max_decision_pivots_is_positive(): FILE: tests/test_rc_templates.py class TestConferenceTemplate (line 48) | class TestConferenceTemplate: method test_neurips_basic_fields (line 51) | def test_neurips_basic_fields(self) -> None: method test_iclr_basic_fields (line 62) | def test_iclr_basic_fields(self) -> None: method test_icml_basic_fields (line 71) | def test_icml_basic_fields(self) -> None: method test_frozen (line 80) | def test_frozen(self) -> None: class TestRenderPreamble (line 85) | class TestRenderPreamble: method test_neurips_preamble_structure (line 88) | def test_neurips_preamble_structure(self) -> None: method test_iclr_preamble_no_options (line 100) | def test_iclr_preamble_no_options(self) -> None: method test_icml_author_block (line 105) | def test_icml_author_block(self) -> None: method test_icml_preamble_extra (line 112) | def test_icml_preamble_extra(self) -> None: class TestRenderFooter (line 117) | class TestRenderFooter: method test_neurips_footer (line 120) | def test_neurips_footer(self) -> None: method test_icml_footer (line 126) | def test_icml_footer(self) -> None: method test_default_bib_file (line 131) | def test_default_bib_file(self) -> None: class TestGetTemplate (line 136) | class TestGetTemplate: method test_full_name (line 139) | def test_full_name(self) -> None: method test_short_alias (line 142) | def test_short_alias(self) -> None: method test_case_insensitive (line 147) | def test_case_insensitive(self) -> None: method test_dash_and_space_normalization (line 151) | def test_dash_and_space_normalization(self) -> None: method test_unknown_raises (line 155) | def test_unknown_raises(self) -> None: class TestListConferences (line 160) | class TestListConferences: method test_returns_canonical_names (line 163) | def test_returns_canonical_names(self) -> None: method test_sorted (line 171) | def test_sorted(self) -> None: class TestConferenceRegistry (line 176) | class TestConferenceRegistry: method test_all_aliases_resolve (line 179) | def test_all_aliases_resolve(self) -> None: class TestParseSections (line 190) | class TestParseSections: method test_empty (line 193) | def test_empty(self) -> None: method test_single_heading (line 199) | def test_single_heading(self) -> None: method test_multiple_headings (line 207) | def test_multiple_headings(self) -> None: method test_preamble_before_heading (line 215) | def test_preamble_before_heading(self) -> None: method test_heading_lower (line 222) | def test_heading_lower(self) -> None: class TestExtractTitle (line 228) | class TestExtractTitle: method test_bold_title_after_heading (line 231) | def test_bold_title_after_heading(self) -> None: method test_first_non_meta_h1 (line 236) | def test_first_non_meta_h1(self) -> None: method test_fallback (line 241) | def test_fallback(self) -> None: class TestExtractAbstract (line 246) | class TestExtractAbstract: method test_from_h1 (line 249) | def test_from_h1(self) -> None: method test_from_h2 (line 254) | def test_from_h2(self) -> None: method test_missing_abstract (line 259) | def test_missing_abstract(self) -> None: class TestConvertInline (line 265) | class TestConvertInline: method test_bold (line 268) | def test_bold(self) -> None: method test_italic (line 271) | def test_italic(self) -> None: method test_inline_code (line 274) | def test_inline_code(self) -> None: method test_link (line 277) | def test_link(self) -> None: method test_special_chars_escaped (line 281) | def test_special_chars_escaped(self) -> None: method test_math_preserved (line 285) | def test_math_preserved(self) -> None: method test_cite_preserved (line 289) | def test_cite_preserved(self) -> None: method test_dollar_math_preserved (line 293) | def test_dollar_math_preserved(self) -> None: method test_pre_escaped_underscore_not_doubled (line 297) | def test_pre_escaped_underscore_not_doubled(self) -> None: method test_pre_escaped_underscore_near_math (line 303) | def test_pre_escaped_underscore_near_math(self) -> None: method test_pre_escaped_hash_not_doubled (line 312) | def test_pre_escaped_hash_not_doubled(self) -> None: class TestEscapeLatex (line 319) | class TestEscapeLatex: method test_special_chars (line 322) | def test_special_chars(self) -> None: method test_math_not_escaped (line 328) | def test_math_not_escaped(self) -> None: class TestBuildBody (line 333) | class TestBuildBody: method test_skips_title_and_abstract (line 336) | def test_skips_title_and_abstract(self) -> None: method test_subsection_promoted_when_all_h2 (line 346) | def test_subsection_promoted_when_all_h2(self) -> None: method test_h2_promoted_under_h1_title (line 354) | def test_h2_promoted_under_h1_title(self) -> None: method test_subsubsection (line 361) | def test_subsubsection(self) -> None: class TestListRendering (line 369) | class TestListRendering: method test_bullet_list (line 372) | def test_bullet_list(self) -> None: method test_numbered_list (line 380) | def test_numbered_list(self) -> None: class TestTableRendering (line 388) | class TestTableRendering: method test_parse_table_row (line 391) | def test_parse_table_row(self) -> None: method test_parse_alignments (line 394) | def test_parse_alignments(self) -> None: method test_render_simple_table (line 397) | def test_render_simple_table(self) -> None: method test_render_counters_are_thread_local (line 414) | def test_render_counters_are_thread_local(self) -> None: class TestMarkdownToLatex (line 438) | class TestMarkdownToLatex: method test_neurips_full (line 461) | def test_neurips_full(self) -> None: method test_iclr_full (line 475) | def test_iclr_full(self) -> None: method test_icml_full (line 480) | def test_icml_full(self) -> None: method test_custom_title_override (line 486) | def test_custom_title_override(self) -> None: method test_custom_authors (line 494) | def test_custom_authors(self) -> None: method test_custom_bib_file (line 498) | def test_custom_bib_file(self) -> None: method test_math_preserved_in_output (line 502) | def test_math_preserved_in_output(self) -> None: method test_empty_paper (line 508) | def test_empty_paper(self) -> None: method test_display_math_block (line 513) | def test_display_math_block(self) -> None: method test_code_block (line 518) | def test_code_block(self) -> None: method test_table_in_paper (line 525) | def test_table_in_paper(self) -> None: class TestExportConfig (line 543) | class TestExportConfig: method test_default_values (line 546) | def test_default_values(self) -> None: method test_frozen (line 554) | def test_frozen(self) -> None: method test_rcconfig_has_export (line 561) | def test_rcconfig_has_export(self) -> None: method test_rcconfig_export_from_dict (line 568) | def test_rcconfig_export_from_dict(self) -> None: class TestHitlStageValidation (line 590) | class TestHitlStageValidation: method test_stage_23_valid (line 593) | def test_stage_23_valid(self) -> None: method test_get_style_files_returns_bundled_sty (line 603) | def test_get_style_files_returns_bundled_sty(self) -> None: method test_iclr_icml_have_bst_files (line 612) | def test_iclr_icml_have_bst_files(self) -> None: method test_stage_24_invalid (line 620) | def test_stage_24_invalid(self) -> None: class TestCompletenessWordCountAndBullets (line 637) | class TestCompletenessWordCountAndBullets: method _make_sections (line 641) | def _make_sections(section_specs: list[tuple[str, int, bool]]) -> list: method test_completeness_section_word_count_short (line 660) | def test_completeness_section_word_count_short(self) -> None: method test_completeness_bullet_density (line 676) | def test_completeness_bullet_density(self) -> None: class TestAlgorithmEscaping (line 698) | class TestAlgorithmEscaping: method test_escape_underscore (line 701) | def test_escape_underscore(self) -> None: method test_escape_hash_comment (line 704) | def test_escape_hash_comment(self) -> None: method test_fullline_hash_comment (line 709) | def test_fullline_hash_comment(self) -> None: method test_escape_percent (line 713) | def test_escape_percent(self) -> None: method test_escape_ampersand (line 716) | def test_escape_ampersand(self) -> None: method test_preserve_latex_commands (line 719) | def test_preserve_latex_commands(self) -> None: method test_render_code_block_algo_escapes (line 723) | def test_render_code_block_algo_escapes(self) -> None: method test_render_code_block_verbatim_no_escape (line 735) | def test_render_code_block_verbatim_no_escape(self) -> None: FILE: tests/test_rc_validator.py function _call_source (line 22) | def _call_source(name: str) -> str: function test_validate_syntax_accepts_valid_code (line 31) | def test_validate_syntax_accepts_valid_code(): function test_validate_syntax_reports_syntax_error_with_location (line 38) | def test_validate_syntax_reports_syntax_error_with_location(): function test_validate_syntax_accepts_empty_whitespace_and_comment_only (line 52) | def test_validate_syntax_accepts_empty_whitespace_and_comment_only(code:... function test_validate_security_accepts_safe_code (line 59) | def test_validate_security_accepts_safe_code(): function test_validate_security_skips_when_code_has_syntax_error (line 67) | def test_validate_security_skips_when_code_has_syntax_error(): function test_validate_security_flags_every_dangerous_builtin_call (line 75) | def test_validate_security_flags_every_dangerous_builtin_call(builtin_na... function test_validate_security_flags_every_dangerous_call (line 93) | def test_validate_security_flags_every_dangerous_call(call_name: str): function test_validate_security_flags_every_banned_import (line 103) | def test_validate_security_flags_every_banned_import(module_name: str): function test_validate_security_flags_every_banned_from_import (line 114) | def test_validate_security_flags_every_banned_from_import(module_name: s... function test_validate_imports_recognizes_stdlib_modules_by_default (line 124) | def test_validate_imports_recognizes_stdlib_modules_by_default(): function test_validate_imports_warns_for_unavailable_package (line 131) | def test_validate_imports_warns_for_unavailable_package(): function test_validate_imports_respects_custom_available_set (line 145) | def test_validate_imports_respects_custom_available_set(): function test_validate_imports_returns_no_warnings_for_syntax_error_input (line 156) | def test_validate_imports_returns_no_warnings_for_syntax_error_input(): function test_validate_imports_handles_empty_like_inputs (line 164) | def test_validate_imports_handles_empty_like_inputs(code: str): function test_validate_code_combines_security_and_import_issues_in_order (line 171) | def test_validate_code_combines_security_and_import_issues_in_order(): function test_validate_code_short_circuits_after_syntax_error (line 184) | def test_validate_code_short_circuits_after_syntax_error(): function test_validate_code_skip_security_excludes_security_issues (line 191) | def test_validate_code_skip_security_excludes_security_issues(): function test_validate_code_skip_imports_excludes_import_warnings (line 198) | def test_validate_code_skip_imports_excludes_import_warnings(): function test_validate_code_skip_both_returns_clean_for_safe_code (line 206) | def test_validate_code_skip_both_returns_clean_for_safe_code(): function test_validate_code_uses_available_packages_for_import_validation (line 213) | def test_validate_code_uses_available_packages_for_import_validation(): function test_extract_imports_supports_import_and_from_import_styles (line 222) | def test_extract_imports_supports_import_and_from_import_styles(): function test_extract_imports_supports_multiple_aliases_and_dedupes (line 230) | def test_extract_imports_supports_multiple_aliases_and_dedupes(): function test_extract_imports_ignores_relative_import_without_module_name (line 236) | def test_extract_imports_ignores_relative_import_without_module_name(): function test_extract_imports_includes_relative_import_with_module_name (line 240) | def test_extract_imports_includes_relative_import_with_module_name(): function test_extract_imports_returns_empty_set_for_syntax_error (line 244) | def test_extract_imports_returns_empty_set_for_syntax_error(): function test_extract_imports_handles_empty_like_inputs (line 249) | def test_extract_imports_handles_empty_like_inputs(code: str): function test_format_issues_for_llm_returns_no_issues_message_when_clean (line 253) | def test_format_issues_for_llm_returns_no_issues_message_when_clean(): function test_format_issues_for_llm_formats_issues_with_and_without_line (line 257) | def test_format_issues_for_llm_formats_issues_with_and_without_line(): function test_format_issues_for_llm_preserves_issue_order (line 283) | def test_format_issues_for_llm_preserves_issue_order(): function test_code_validation_ok_true_when_no_errors_present (line 299) | def test_code_validation_ok_true_when_no_errors_present(): function test_code_validation_ok_false_when_error_present (line 307) | def test_code_validation_ok_false_when_error_present(): function test_code_validation_errors_and_warnings_filter_correctly (line 315) | def test_code_validation_errors_and_warnings_filter_correctly(): function test_code_validation_summary_for_no_issues (line 326) | def test_code_validation_summary_for_no_issues(): function test_code_validation_summary_for_errors_only (line 330) | def test_code_validation_summary_for_errors_only(): function test_code_validation_summary_for_warnings_only (line 338) | def test_code_validation_summary_for_warnings_only(): function test_code_validation_summary_for_errors_and_warnings (line 346) | def test_code_validation_summary_for_errors_and_warnings(): function test_filename_collision_detects_config_py (line 362) | def test_filename_collision_detects_config_py(): function test_filename_collision_detects_stdlib_shadows (line 370) | def test_filename_collision_detects_stdlib_shadows(): function test_filename_collision_allows_safe_names (line 377) | def test_filename_collision_allows_safe_names(): function test_filename_collision_multiple_shadows (line 391) | def test_filename_collision_multiple_shadows(): FILE: tests/test_results_table_builder.py function _make_registry (line 20) | def _make_registry( class TestBuildResultsTables (line 37) | class TestBuildResultsTables: method test_basic_table (line 38) | def test_basic_table(self): method test_best_is_bolded (line 56) | def test_best_is_bolded(self): method test_single_seed_marker (line 68) | def test_single_seed_marker(self): method test_no_conditions (line 79) | def test_no_conditions(self): method test_all_single_seed_no_per_seed_table (line 84) | def test_all_single_seed_no_per_seed_table(self): method test_per_seed_table_structure (line 95) | def test_per_seed_table_structure(self): method test_two_column_uses_table_star (line 109) | def test_two_column_uses_table_star(self): method test_verified_values_populated (line 114) | def test_verified_values_populated(self): method test_special_chars_escaped (line 124) | def test_special_chars_escaped(self): method test_minimize_direction (line 129) | def test_minimize_direction(self): class TestConditionWhitelist (line 143) | class TestConditionWhitelist: method test_basic (line 144) | def test_basic(self): method test_empty_registry (line 157) | def test_empty_registry(self): class TestRealArtifacts (line 163) | class TestRealArtifacts: method _load (line 164) | def _load(self, run_id: str) -> VerifiedRegistry: method test_run_e57360_rl_tables (line 179) | def test_run_e57360_rl_tables(self): method test_run_acbdfa_tables (line 189) | def test_run_acbdfa_tables(self): FILE: tests/test_robotics_adapter.py class TestRoboticsProfile (line 28) | class TestRoboticsProfile: method setup_method (line 29) | def setup_method(self): method test_profile_exists (line 32) | def test_profile_exists(self): method test_profile_fields (line 37) | def test_profile_fields(self): method test_profile_baselines (line 45) | def test_profile_baselines(self): class TestRoboticsKeywordDetection (line 58) | class TestRoboticsKeywordDetection: method test_robot_keyword (line 59) | def test_robot_keyword(self): method test_mujoco (line 62) | def test_mujoco(self): method test_pybullet (line 65) | def test_pybullet(self): class TestRoboticsAdapter (line 74) | class TestRoboticsAdapter: method test_gets_robotics_adapter (line 75) | def test_gets_robotics_adapter(self): method test_code_generation_blocks_nonempty (line 87) | def test_code_generation_blocks_nonempty(self): method test_experiment_design_mentions_baselines (line 97) | def test_experiment_design_mentions_baselines(self): method test_result_analysis_mentions_return (line 106) | def test_result_analysis_mentions_return(self): method test_blueprint_context (line 114) | def test_blueprint_context(self): FILE: tests/test_servers.py function _make_server (line 21) | def _make_server( function registry (line 45) | def registry() -> ServerRegistry: class TestServerEntry (line 58) | class TestServerEntry: method test_to_dict_roundtrip (line 59) | def test_to_dict_roundtrip(self) -> None: method test_defaults (line 66) | def test_defaults(self) -> None: class TestServerRegistry (line 77) | class TestServerRegistry: method test_list_all_sorted_by_priority (line 78) | def test_list_all_sorted_by_priority(self, registry: ServerRegistry) -... method test_count (line 83) | def test_count(self, registry: ServerRegistry) -> None: method test_add_server (line 86) | def test_add_server(self) -> None: method test_remove_server (line 92) | def test_remove_server(self, registry: ServerRegistry) -> None: method test_remove_unknown_raises (line 96) | def test_remove_unknown_raises(self, registry: ServerRegistry) -> None: method test_get_unknown_raises (line 100) | def test_get_unknown_raises(self, registry: ServerRegistry) -> None: method test_get_available_excludes (line 104) | def test_get_available_excludes(self, registry: ServerRegistry) -> None: method test_get_best_match_by_vram (line 110) | def test_get_best_match_by_vram(self, registry: ServerRegistry) -> None: method test_get_best_match_by_type (line 115) | def test_get_best_match_by_type(self, registry: ServerRegistry) -> None: method test_get_best_match_prefers_free (line 120) | def test_get_best_match_prefers_free(self, registry: ServerRegistry) -... method test_get_best_match_none_when_impossible (line 125) | def test_get_best_match_none_when_impossible(self, registry: ServerReg... method test_get_best_match_by_gpu (line 129) | def test_get_best_match_by_gpu(self, registry: ServerRegistry) -> None: method test_get_best_match_no_requirements (line 133) | def test_get_best_match_no_requirements(self, registry: ServerRegistry... class TestServerMonitor (line 144) | class TestServerMonitor: method test_parse_status_output (line 145) | def test_parse_status_output(self) -> None: method test_parse_status_no_gpu (line 154) | def test_parse_status_no_gpu(self) -> None: method test_get_cached_none (line 160) | def test_get_cached_none(self, registry: ServerRegistry) -> None: method test_get_gpu_usage_empty (line 164) | def test_get_gpu_usage_empty(self, registry: ServerRegistry) -> None: method test_check_status_unreachable (line 168) | def test_check_status_unreachable(self, registry: ServerRegistry) -> N... method test_check_all (line 174) | def test_check_all(self, registry: ServerRegistry) -> None: class TestSSHExecutor (line 188) | class TestSSHExecutor: method test_init (line 189) | def test_init(self) -> None: method test_run_experiment_timeout (line 194) | def test_run_experiment_timeout(self) -> None: class TestSlurmExecutor (line 217) | class TestSlurmExecutor: method test_init_wrong_type_raises (line 218) | def test_init_wrong_type_raises(self) -> None: method test_generate_sbatch_script (line 223) | def test_generate_sbatch_script(self) -> None: method test_sbatch_script_default_resources (line 231) | def test_sbatch_script_default_resources(self) -> None: method test_submit_job_parses_output (line 238) | def test_submit_job_parses_output(self) -> None: class TestCloudExecutor (line 259) | class TestCloudExecutor: method test_init_wrong_type_raises (line 260) | def test_init_wrong_type_raises(self) -> None: method test_launch_instance_stub (line 265) | def test_launch_instance_stub(self) -> None: class TestTaskDispatcher (line 278) | class TestTaskDispatcher: method test_dispatch_returns_task_id (line 279) | def test_dispatch_returns_task_id(self, registry: ServerRegistry) -> N... method test_dispatch_no_server_queues (line 285) | def test_dispatch_no_server_queues(self) -> None: method test_get_task_status_unknown (line 293) | def test_get_task_status_unknown(self, registry: ServerRegistry) -> None: FILE: tests/test_skills_library.py function sample_skill (line 40) | def sample_skill() -> Skill: function skill_yaml_dir (line 58) | def skill_yaml_dir(tmp_path: Path) -> Path: function skill_json_dir (line 78) | def skill_json_dir(tmp_path: Path) -> Path: function skillmd_dir (line 99) | def skillmd_dir(tmp_path: Path) -> Path: function external_skillmd_dir (line 134) | def external_skillmd_dir(tmp_path: Path) -> Path: class TestSkillSchema (line 158) | class TestSkillSchema: method test_create_skill (line 159) | def test_create_skill(self, sample_skill: Skill) -> None: method test_to_dict (line 165) | def test_to_dict(self, sample_skill: Skill) -> None: method test_from_dict (line 171) | def test_from_dict(self) -> None: method test_from_dict_defaults (line 185) | def test_from_dict_defaults(self) -> None: method test_roundtrip (line 191) | def test_roundtrip(self, sample_skill: Skill) -> None: method test_stage_name_to_number (line 197) | def test_stage_name_to_number(self) -> None: method test_prompt_template_alias (line 202) | def test_prompt_template_alias(self, sample_skill: Skill) -> None: class TestSkillLoader (line 209) | class TestSkillLoader: method test_load_yaml (line 210) | def test_load_yaml(self, skill_yaml_dir: Path) -> None: method test_load_json (line 216) | def test_load_json(self, skill_json_dir: Path) -> None: method test_load_nonexistent (line 221) | def test_load_nonexistent(self, tmp_path: Path) -> None: method test_load_invalid_yaml (line 225) | def test_load_invalid_yaml(self, tmp_path: Path) -> None: method test_load_unsupported_format (line 231) | def test_load_unsupported_format(self, tmp_path: Path) -> None: method test_load_directory (line 237) | def test_load_directory(self, skill_yaml_dir: Path) -> None: method test_load_empty_directory (line 241) | def test_load_empty_directory(self, tmp_path: Path) -> None: method test_load_missing_directory (line 247) | def test_load_missing_directory(self, tmp_path: Path) -> None: class TestSkillMdLoader (line 252) | class TestSkillMdLoader: method test_load_skillmd (line 253) | def test_load_skillmd(self, skillmd_dir: Path) -> None: method test_load_skillmd_minimal (line 264) | def test_load_skillmd_minimal(self, skillmd_dir: Path) -> None: method test_load_skillmd_missing (line 272) | def test_load_skillmd_missing(self, tmp_path: Path) -> None: method test_load_skillmd_no_frontmatter (line 276) | def test_load_skillmd_no_frontmatter(self, tmp_path: Path) -> None: method test_load_skillmd_directory (line 283) | def test_load_skillmd_directory(self, skillmd_dir: Path) -> None: method test_skillmd_wins_over_yaml (line 290) | def test_skillmd_wins_over_yaml(self, tmp_path: Path) -> None: class TestMatcher (line 325) | class TestMatcher: method test_tokenize (line 326) | def test_tokenize(self) -> None: method test_match_by_keyword (line 332) | def test_match_by_keyword(self, sample_skill: Skill) -> None: method test_match_filters_by_stage (line 341) | def test_match_filters_by_stage(self, sample_skill: Skill) -> None: method test_match_empty_context (line 349) | def test_match_empty_context(self, sample_skill: Skill) -> None: method test_match_no_keyword_overlap (line 353) | def test_match_no_keyword_overlap(self, sample_skill: Skill) -> None: method test_match_respects_top_k (line 361) | def test_match_respects_top_k(self) -> None: method test_match_priority_ordering (line 379) | def test_match_priority_ordering(self) -> None: method test_match_string_stage (line 399) | def test_match_string_stage(self, sample_skill: Skill) -> None: method test_match_string_stage_mismatch (line 409) | def test_match_string_stage_mismatch(self, sample_skill: Skill) -> None: method test_resolve_stage (line 417) | def test_resolve_stage(self) -> None: method test_match_description_fallback (line 422) | def test_match_description_fallback(self) -> None: method test_match_description_fallback_disabled (line 439) | def test_match_description_fallback_disabled(self) -> None: class TestFormatSkills (line 455) | class TestFormatSkills: method test_format_single_skill (line 456) | def test_format_single_skill(self, sample_skill: Skill) -> None: method test_format_empty (line 461) | def test_format_empty(self) -> None: method test_format_includes_code_template (line 464) | def test_format_includes_code_template(self, sample_skill: Skill) -> N... method test_format_includes_references (line 468) | def test_format_includes_references(self, sample_skill: Skill) -> None: method test_format_respects_max_chars (line 472) | def test_format_respects_max_chars(self) -> None: class TestSkillRegistry (line 490) | class TestSkillRegistry: method test_registry_loads_builtins (line 491) | def test_registry_loads_builtins(self) -> None: method test_builtin_skillmd_count (line 495) | def test_builtin_skillmd_count(self) -> None: method test_register_custom (line 500) | def test_register_custom(self, sample_skill: Skill) -> None: method test_get_skill (line 506) | def test_get_skill(self, sample_skill: Skill) -> None: method test_get_nonexistent (line 513) | def test_get_nonexistent(self) -> None: method test_unregister (line 517) | def test_unregister(self, sample_skill: Skill) -> None: method test_unregister_nonexistent (line 523) | def test_unregister_nonexistent(self) -> None: method test_list_by_category (line 527) | def test_list_by_category(self) -> None: method test_list_by_stage (line 533) | def test_list_by_stage(self) -> None: method test_match (line 538) | def test_match(self) -> None: method test_match_string_stage (line 543) | def test_match_string_stage(self) -> None: method test_export_for_prompt (line 551) | def test_export_for_prompt(self) -> None: method test_custom_dir_loading (line 557) | def test_custom_dir_loading(self, skill_yaml_dir: Path) -> None: method test_registry_external_dirs (line 562) | def test_registry_external_dirs(self, external_skillmd_dir: Path) -> N... method test_registry_external_match_fallback (line 569) | def test_registry_external_match_fallback( FILE: tests/test_ssh_and_colab_sandbox.py function _make_experiment_config (line 39) | def _make_experiment_config(**overrides) -> ExperimentConfig: class TestSshTarget (line 57) | class TestSshTarget: method test_with_user (line 58) | def test_with_user(self): method test_without_user (line 62) | def test_without_user(self): class TestBuildSshBase (line 67) | class TestBuildSshBase: method test_default_port (line 68) | def test_default_port(self): method test_custom_port (line 75) | def test_custom_port(self): method test_key_path (line 81) | def test_key_path(self): class TestSshRemoteSandboxCommands (line 87) | class TestSshRemoteSandboxCommands: method test_bare_exec_cmd (line 88) | def test_bare_exec_cmd(self, tmp_path: Path): method test_bare_exec_no_gpu (line 100) | def test_bare_exec_no_gpu(self, tmp_path: Path): method test_docker_exec_cmd (line 106) | def test_docker_exec_cmd(self, tmp_path: Path): method test_docker_exec_full_network (line 127) | def test_docker_exec_full_network(self, tmp_path: Path): class TestSshEntryPointValidation (line 140) | class TestSshEntryPointValidation: method test_run_project_rejects_path_traversal (line 141) | def test_run_project_rejects_path_traversal(self, tmp_path: Path): method test_run_project_rejects_absolute_path (line 161) | def test_run_project_rejects_absolute_path(self, tmp_path: Path): class TestSshConnectivityCheck (line 177) | class TestSshConnectivityCheck: method test_empty_host (line 178) | def test_empty_host(self): method test_unreachable_host (line 184) | def test_unreachable_host(self): class TestSshSandboxRun (line 190) | class TestSshSandboxRun: method test_run_success (line 193) | def test_run_success(self, tmp_path: Path): method test_run_upload_failure (line 226) | def test_run_upload_failure(self, tmp_path: Path): class TestColabDriveCheck (line 244) | class TestColabDriveCheck: method test_empty_root (line 245) | def test_empty_root(self): method test_nonexistent_root (line 251) | def test_nonexistent_root(self): method test_existing_root (line 257) | def test_existing_root(self, tmp_path: Path): class TestColabDriveSandbox (line 263) | class TestColabDriveSandbox: method test_submit_and_collect (line 264) | def test_submit_and_collect(self, tmp_path: Path): method test_timeout (line 307) | def test_timeout(self, tmp_path: Path): method test_setup_script_written (line 324) | def test_setup_script_written(self, tmp_path: Path): class TestColabWorkerTemplate (line 348) | class TestColabWorkerTemplate: method test_template_not_empty (line 349) | def test_template_not_empty(self): method test_template_has_key_elements (line 352) | def test_template_has_key_elements(self): class TestFactoryIntegration (line 363) | class TestFactoryIntegration: method test_ssh_remote_requires_host (line 364) | def test_ssh_remote_requires_host(self, tmp_path: Path): method test_ssh_remote_checks_connectivity (line 372) | def test_ssh_remote_checks_connectivity(self, tmp_path: Path): method test_colab_drive_requires_root (line 380) | def test_colab_drive_requires_root(self, tmp_path: Path): method test_colab_drive_checks_path (line 388) | def test_colab_drive_checks_path(self, tmp_path: Path): method test_colab_drive_creates_sandbox (line 396) | def test_colab_drive_creates_sandbox(self, tmp_path: Path): class TestAcpTimeoutFix (line 411) | class TestAcpTimeoutFix: method test_timeout_passed_from_config (line 412) | def test_timeout_passed_from_config(self): method test_timeout_default (line 426) | def test_timeout_default(self): class TestAcpSessionReconnect (line 444) | class TestAcpSessionReconnect: method test_reconnect_on_session_died (line 445) | def test_reconnect_on_session_died(self): method test_reconnect_exhausted_raises (line 470) | def test_reconnect_exhausted_raises(self): method test_non_reconnectable_error_raises_immediately (line 489) | def test_non_reconnectable_error_raises_immediately(self): FILE: tests/test_trends.py function _make_papers (line 30) | def _make_papers(n: int = 10) -> list[dict[str, Any]]: class MockLLM (line 52) | class MockLLM: method chat_async (line 53) | async def chat_async(self, prompt: str) -> str: class FailingLLM (line 62) | class FailingLLM: method chat_async (line 63) | async def chat_async(self, prompt: str) -> str: class TestFeedManager (line 72) | class TestFeedManager: method test_init_filters_supported_sources (line 73) | def test_init_filters_supported_sources(self): method test_supported_sources (line 77) | def test_supported_sources(self): method test_fetch_deduplicates_by_title (line 82) | def test_fetch_deduplicates_by_title(self): method test_fetch_respects_max_papers (line 94) | def test_fetch_respects_max_papers(self): method test_fetch_handles_source_failure (line 101) | def test_fetch_handles_source_failure(self): method test_fetch_empty_title_excluded (line 107) | def test_fetch_empty_title_excluded(self): class TestTrendAnalyzer (line 124) | class TestTrendAnalyzer: method test_analyze_empty (line 125) | def test_analyze_empty(self): method test_analyze_extracts_keywords (line 131) | def test_analyze_extracts_keywords(self): method test_keywords_exclude_stopwords (line 138) | def test_keywords_exclude_stopwords(self): method test_extract_authors_dict_format (line 146) | def test_extract_authors_dict_format(self): method test_extract_authors_string_format (line 154) | def test_extract_authors_string_format(self): method test_extract_datasets (line 160) | def test_extract_datasets(self): method test_extract_methods (line 171) | def test_extract_methods(self): method test_tokenize (line 181) | def test_tokenize(self): method test_source_distribution (line 188) | def test_source_distribution(self): method test_generate_trend_report (line 198) | def test_generate_trend_report(self): method test_min_keyword_length (line 205) | def test_min_keyword_length(self): class TestOpportunityFinder (line 221) | class TestOpportunityFinder: method test_heuristic_no_llm (line 222) | def test_heuristic_no_llm(self): method test_heuristic_empty_trends (line 240) | def test_heuristic_empty_trends(self): method test_llm_path (line 247) | def test_llm_path(self): method test_llm_fallback_on_failure (line 257) | def test_llm_fallback_on_failure(self): method test_parse_opportunities (line 266) | def test_parse_opportunities(self): method test_heuristic_max_five (line 277) | def test_heuristic_max_five(self): class TestDailyDigest (line 296) | class TestDailyDigest: method test_generate_basic_no_papers (line 297) | def test_generate_basic_no_papers(self): method test_generate_basic_with_papers (line 303) | def test_generate_basic_with_papers(self): method test_generate_basic_truncates_abstract (line 312) | def test_generate_basic_truncates_abstract(self): method test_parse_summary_valid (line 320) | def test_parse_summary_valid(self): method test_parse_summary_no_format (line 326) | def test_parse_summary_no_format(self): method test_parse_summary_clamped (line 332) | def test_parse_summary_clamped(self): method test_generate_and_save (line 337) | def test_generate_and_save(self, tmp_path: Path): method test_author_formatting_dict (line 346) | def test_author_formatting_dict(self): class TestAutoTopicGenerator (line 365) | class TestAutoTopicGenerator: method test_generate_candidates (line 366) | def test_generate_candidates(self): method test_generate_candidates_empty (line 377) | def test_generate_candidates_empty(self): method test_auto_select_default_fallback (line 385) | def test_auto_select_default_fallback(self): method test_score_candidate_feasibility (line 393) | def test_score_candidate_feasibility(self): method test_score_candidate_novelty_decay (line 403) | def test_score_candidate_novelty_decay(self): method test_score_candidate_weights (line 415) | def test_score_candidate_weights(self): method test_format_candidates_empty (line 423) | def test_format_candidates_empty(self): method test_format_candidates_with_data (line 429) | def test_format_candidates_with_data(self): class TestLiteratureTrendAnalyzer (line 453) | class TestLiteratureTrendAnalyzer: method test_no_client_returns_empty (line 454) | def test_no_client_returns_empty(self): method test_analyze_keyword_trends_no_client (line 458) | def test_analyze_keyword_trends_no_client(self): method test_find_emerging_topics_no_client (line 463) | def test_find_emerging_topics_no_client(self): method test_find_emerging_topics_filters_bigrams (line 467) | def test_find_emerging_topics_filters_bigrams(self): FILE: tests/test_universal_codegen_integration.py class TestCrossDomainDetection (line 43) | class TestCrossDomainDetection: method test_all_profiles_loadable (line 46) | def test_all_profiles_loadable(self): method test_ml_vision_full_pipeline (line 50) | def test_ml_vision_full_pipeline(self): method test_physics_pde_full_pipeline (line 61) | def test_physics_pde_full_pipeline(self): method test_economics_full_pipeline (line 76) | def test_economics_full_pipeline(self): method test_chemistry_full_pipeline (line 85) | def test_chemistry_full_pipeline(self): method test_biology_full_pipeline (line 94) | def test_biology_full_pipeline(self): method test_math_full_pipeline (line 103) | def test_math_full_pipeline(self): class TestExperimentSchemaIntegration (line 118) | class TestExperimentSchemaIntegration: method test_physics_convergence_plan (line 119) | def test_physics_convergence_plan(self): method test_economics_progressive_plan (line 162) | def test_economics_progressive_plan(self): class TestMetricConvergenceIntegration (line 195) | class TestMetricConvergenceIntegration: method test_json_convergence_end_to_end (line 196) | def test_json_convergence_end_to_end(self, tmp_path): method test_flat_metrics_backward_compatible (line 239) | def test_flat_metrics_backward_compatible(self, tmp_path): class TestCodeSearchIntegration (line 257) | class TestCodeSearchIntegration: method test_code_search_result_in_blueprint (line 258) | def test_code_search_result_in_blueprint(self): method test_domain_adapter_blueprint_context (line 276) | def test_domain_adapter_blueprint_context(self): class TestCodeAgentDomainInjection (line 296) | class TestCodeAgentDomainInjection: method test_code_agent_accepts_domain_profile (line 297) | def test_code_agent_accepts_domain_profile(self): method test_code_agent_ml_domain_no_extra_context (line 326) | def test_code_agent_ml_domain_no_extra_context(self): class TestDockerProfileMapping (line 358) | class TestDockerProfileMapping: method test_domain_to_docker_mapping (line 359) | def test_domain_to_docker_mapping(self): method test_all_loaded_domains_have_docker_mapping (line 379) | def test_all_loaded_domains_have_docker_mapping(self): FILE: tests/test_v6_improvements.py class TestIMP13_ExtractPaperTitle (line 21) | class TestIMP13_ExtractPaperTitle: method test_import_works (line 25) | def test_import_works(self): method test_extracts_h1_title (line 32) | def test_extracts_h1_title(self): method test_skips_abstract_heading (line 46) | def test_skips_abstract_heading(self): method test_title_after_abstract_not_found (line 62) | def test_title_after_abstract_not_found(self): method test_fallback_untitled (line 79) | def test_fallback_untitled(self): method test_bold_title (line 86) | def test_bold_title(self): class TestIMP14_StripOrphanedCites (line 104) | class TestIMP14_StripOrphanedCites: method _run_cite_stripping (line 109) | def _run_cite_stripping(tex_text: str, bib_text: str) -> str: method test_mixed_real_and_missing_keys (line 130) | def test_mixed_real_and_missing_keys(self): method test_all_keys_missing (line 145) | def test_all_keys_missing(self): method test_all_keys_valid (line 153) | def test_all_keys_valid(self): method test_multiple_cite_commands (line 173) | def test_multiple_cite_commands(self): method test_whitespace_cleanup (line 203) | def test_whitespace_cleanup(self): class TestIMP15_BibDedup (line 218) | class TestIMP15_BibDedup: method _run_dedup (line 222) | def _run_dedup(bib_text: str) -> str: method test_duplicate_entries_removed (line 239) | def test_duplicate_entries_removed(self): method test_no_duplicates_unchanged (line 269) | def test_no_duplicates_unchanged(self): method test_triple_duplicate (line 291) | def test_triple_duplicate(self): method test_empty_bib (line 320) | def test_empty_bib(self): class TestIMP16_BootstrapCIFallback (line 332) | class TestIMP16_BootstrapCIFallback: method _compute_ci_with_fallback (line 337) | def _compute_ci_with_fallback(vals: list[float]) -> tuple[float, float... method test_normal_case_no_fallback (line 363) | def test_normal_case_no_fallback(self): method test_fallback_triggers_for_pathological_data (line 373) | def test_fallback_triggers_for_pathological_data(self): method test_fallback_ci_always_contains_mean (line 399) | def test_fallback_ci_always_contains_mean(self): method test_condition_check_logic (line 417) | def test_condition_check_logic(self): method test_min_sample_size (line 433) | def test_min_sample_size(self): class TestIMP14_15_Integration (line 448) | class TestIMP14_15_Integration: method test_dedup_then_strip (line 451) | def test_dedup_then_strip(self): function run_all_tests (line 519) | def run_all_tests(): FILE: tests/test_verified_registry.py function _load_experiment_summary (line 24) | def _load_experiment_summary(run_id: str) -> dict: function _load_refinement_log (line 36) | def _load_refinement_log(run_id: str) -> dict | None: class TestConditionResult (line 52) | class TestConditionResult: method test_compute_stats_multiple_seeds (line 53) | def test_compute_stats_multiple_seeds(self): method test_compute_stats_single_seed (line 60) | def test_compute_stats_single_seed(self): method test_compute_stats_with_nan (line 67) | def test_compute_stats_with_nan(self): method test_compute_stats_empty (line 75) | def test_compute_stats_empty(self): class TestVerifiedRegistryCore (line 87) | class TestVerifiedRegistryCore: method test_add_value (line 88) | def test_add_value(self): method test_percentage_conversion (line 95) | def test_percentage_conversion(self): method test_reverse_percentage (line 102) | def test_reverse_percentage(self): method test_tolerance_matching (line 109) | def test_tolerance_matching(self): method test_zero_handling (line 118) | def test_zero_handling(self): method test_negative_values (line 125) | def test_negative_values(self): method test_nan_inf_rejected (line 131) | def test_nan_inf_rejected(self): method test_lookup (line 139) | def test_lookup(self): method test_verify_condition (line 145) | def test_verify_condition(self): class TestFromExperiment (line 157) | class TestFromExperiment: method _make_summary (line 158) | def _make_summary(self) -> dict: method test_conditions_extracted (line 187) | def test_conditions_extracted(self): method test_per_seed_values (line 193) | def test_per_seed_values(self): method test_condition_stats (line 198) | def test_condition_stats(self): method test_primary_metric (line 205) | def test_primary_metric(self): method test_all_values_registered (line 210) | def test_all_values_registered(self): method test_pairwise_differences (line 219) | def test_pairwise_differences(self): method test_fabricated_number_rejected (line 225) | def test_fabricated_number_rejected(self): method test_infra_keys_excluded (line 230) | def test_infra_keys_excluded(self): method test_with_refinement_log (line 236) | def test_with_refinement_log(self): class TestRealArtifacts (line 258) | class TestRealArtifacts: method test_run_e57360_rl_exploration (line 261) | def test_run_e57360_rl_exploration(self): method test_run_acbdfa_cnn_vs_ssm (line 286) | def test_run_acbdfa_cnn_vs_ssm(self): method test_run_85fefc_contrastive_kd (line 300) | def test_run_85fefc_contrastive_kd(self): method test_run_8b4a1b_gard_lora (line 312) | def test_run_8b4a1b_gard_lora(self): class TestFromRunDir (line 328) | class TestFromRunDir: method _write_summary (line 329) | def _write_summary(self, path: Path, data: dict) -> None: method test_from_run_dir_merges_multiple_stage14 (line 333) | def test_from_run_dir_merges_multiple_stage14(self, tmp_path: Path) ->... method test_from_run_dir_includes_best (line 361) | def test_from_run_dir_includes_best(self, tmp_path: Path) -> None: method test_from_run_dir_empty_dir (line 379) | def test_from_run_dir_empty_dir(self, tmp_path: Path) -> None: method test_best_only_uses_experiment_summary_best (line 391) | def test_best_only_uses_experiment_summary_best(self, tmp_path: Path) ... method test_best_only_excludes_refinement_log (line 422) | def test_best_only_excludes_refinement_log(self, tmp_path: Path) -> None: method test_best_only_falls_back_to_stage14 (line 448) | def test_best_only_falls_back_to_stage14(self, tmp_path: Path) -> None: method test_default_mode_still_merges_all (line 464) | def test_default_mode_still_merges_all(self, tmp_path: Path) -> None: FILE: tests/test_web_crawler.py class TestCrawlResult (line 19) | class TestCrawlResult: method test_has_content_true (line 20) | def test_has_content_true(self): method test_has_content_false_empty (line 24) | def test_has_content_false_empty(self): method test_has_content_false_short (line 28) | def test_has_content_false_short(self): class TestHtmlToMarkdown (line 38) | class TestHtmlToMarkdown: method test_strips_script_tags (line 39) | def test_strips_script_tags(self): method test_converts_headings (line 46) | def test_converts_headings(self): method test_converts_paragraphs (line 53) | def test_converts_paragraphs(self): method test_converts_links (line 59) | def test_converts_links(self): method test_converts_list_items (line 64) | def test_converts_list_items(self): method test_decodes_entities (line 70) | def test_decodes_entities(self): method test_collapses_whitespace (line 75) | def test_collapses_whitespace(self): class TestCrawlUrllibFallback (line 86) | class TestCrawlUrllibFallback: method test_crawl_urllib_success (line 88) | def test_crawl_urllib_success(self, mock_urlopen): method test_crawl_urllib_truncation (line 103) | def test_crawl_urllib_truncation(self, mock_urlopen): class TestCrawlSync (line 122) | class TestCrawlSync: method test_crawl_sync_falls_back_to_urllib (line 124) | def test_crawl_sync_falls_back_to_urllib(self, mock_urlopen): class TestCrawlAsync (line 143) | class TestCrawlAsync: method test_crawl_async_urllib_fallback (line 145) | def test_crawl_async_urllib_fallback(self, mock_urlopen): class TestCheckUrlSsrf (line 163) | class TestCheckUrlSsrf: method test_http_allowed (line 164) | def test_http_allowed(self): method test_https_allowed (line 167) | def test_https_allowed(self): method test_rejects_file_scheme (line 170) | def test_rejects_file_scheme(self): method test_rejects_ftp_scheme (line 175) | def test_rejects_ftp_scheme(self): method test_rejects_localhost (line 179) | def test_rejects_localhost(self): method test_rejects_127 (line 184) | def test_rejects_127(self): method test_rejects_10_range (line 188) | def test_rejects_10_range(self): method test_rejects_172_range (line 192) | def test_rejects_172_range(self): method test_rejects_192_range (line 196) | def test_rejects_192_range(self): method test_rejects_aws_metadata (line 200) | def test_rejects_aws_metadata(self): method test_rejects_empty_hostname (line 204) | def test_rejects_empty_hostname(self): class TestCrawlerSsrfIntegration (line 214) | class TestCrawlerSsrfIntegration: method test_crawl_sync_rejects_private_url (line 216) | def test_crawl_sync_rejects_private_url(self, mock_urlopen): method test_crawl_sync_rejects_file_scheme (line 224) | def test_crawl_sync_rejects_file_scheme(self, mock_urlopen): method test_crawl_async_rejects_private_url (line 232) | def test_crawl_async_rejects_private_url(self, mock_urlopen): FILE: tests/test_web_integration.py class TestWebSearchAgentResult (line 20) | class TestWebSearchAgentResult: method test_total_results (line 21) | def test_total_results(self): method test_to_context_string_empty (line 29) | def test_to_context_string_empty(self): method test_to_context_string_with_results (line 34) | def test_to_context_string_with_results(self): method test_to_context_string_truncation (line 62) | def test_to_context_string_truncation(self): method test_to_dict (line 73) | def test_to_dict(self): method test_to_context_with_crawled_pages (line 82) | def test_to_context_with_crawled_pages(self): class TestWebSearchAgent (line 104) | class TestWebSearchAgent: method test_generate_queries (line 105) | def test_generate_queries(self): method test_select_urls_to_crawl (line 112) | def test_select_urls_to_crawl(self): method test_select_urls_skips_pdf (line 125) | def test_select_urls_skips_pdf(self): method test_find_pdf_urls (line 138) | def test_find_pdf_urls(self): method test_search_and_extract_minimal (line 153) | def test_search_and_extract_minimal(self, mock_scholarly, mock_urlopen): method test_search_and_extract_with_crawling (line 177) | def test_search_and_extract_with_crawling(self, mock_crawl_urlopen, mo... class TestWebSearchConfig (line 212) | class TestWebSearchConfig: method test_default_config (line 213) | def test_default_config(self): method test_config_in_rcconfig (line 220) | def test_config_in_rcconfig(self): FILE: tests/test_web_pdf_extractor.py class TestPDFContent (line 19) | class TestPDFContent: method test_has_content_true (line 20) | def test_has_content_true(self): method test_has_content_false_empty (line 24) | def test_has_content_false_empty(self): method test_has_content_false_short (line 28) | def test_has_content_false_short(self): class TestPDFExtractor (line 38) | class TestPDFExtractor: method test_backend_detection (line 39) | def test_backend_detection(self): method test_extract_nonexistent_file (line 43) | def test_extract_nonexistent_file(self, tmp_path): method test_extract_abstract_pattern (line 48) | def test_extract_abstract_pattern(self): method test_extract_abstract_no_match (line 62) | def test_extract_abstract_no_match(self): method test_detect_sections (line 67) | def test_detect_sections(self): method test_detect_sections_empty (line 87) | def test_detect_sections_empty(self): method test_extract_from_url_failure (line 93) | def test_extract_from_url_failure(self, mock_urlopen): FILE: tests/test_web_platform.py class TestServerConfig (line 25) | class TestServerConfig: method test_server_config_defaults (line 28) | def test_server_config_defaults(self) -> None: method test_dashboard_config_defaults (line 39) | def test_dashboard_config_defaults(self) -> None: method test_parse_server_config (line 47) | def test_parse_server_config(self) -> None: method test_parse_server_config_empty (line 61) | def test_parse_server_config_empty(self) -> None: method test_parse_dashboard_config (line 68) | def test_parse_dashboard_config(self) -> None: method test_rcconfig_has_server_and_dashboard (line 78) | def test_rcconfig_has_server_and_dashboard(self) -> None: class TestCLI (line 109) | class TestCLI: method test_serve_subcommand_exists (line 112) | def test_serve_subcommand_exists(self) -> None: method test_dashboard_subcommand_exists (line 119) | def test_dashboard_subcommand_exists(self) -> None: method test_wizard_subcommand_exists (line 126) | def test_wizard_subcommand_exists(self) -> None: class TestIntents (line 139) | class TestIntents: method test_help_intent (line 142) | def test_help_intent(self) -> None: method test_status_intent (line 148) | def test_status_intent(self) -> None: method test_start_intent (line 154) | def test_start_intent(self) -> None: method test_topic_intent (line 160) | def test_topic_intent(self) -> None: method test_results_intent (line 166) | def test_results_intent(self) -> None: method test_config_intent (line 172) | def test_config_intent(self) -> None: method test_paper_intent (line 178) | def test_paper_intent(self) -> None: method test_general_intent (line 184) | def test_general_intent(self) -> None: method test_chinese_status (line 190) | def test_chinese_status(self) -> None: method test_chinese_start (line 196) | def test_chinese_start(self) -> None: method test_empty_message (line 202) | def test_empty_message(self) -> None: class TestSession (line 215) | class TestSession: method test_session_create (line 218) | def test_session_create(self) -> None: method test_session_add_message (line 226) | def test_session_add_message(self) -> None: method test_session_context (line 236) | def test_session_context(self) -> None: method test_session_max_history (line 246) | def test_session_max_history(self) -> None: method test_session_persistence (line 254) | def test_session_persistence(self) -> None: class TestDashboardCollector (line 276) | class TestDashboardCollector: method test_collect_empty_dir (line 279) | def test_collect_empty_dir(self) -> None: method test_collect_run_with_checkpoint (line 287) | def test_collect_run_with_checkpoint(self) -> None: method test_collect_run_active_heartbeat (line 302) | def test_collect_run_active_heartbeat(self) -> None: method test_collect_run_stale_heartbeat (line 316) | def test_collect_run_stale_heartbeat(self) -> None: method test_collect_stage_directories (line 329) | def test_collect_stage_directories(self) -> None: method test_collect_metrics (line 343) | def test_collect_metrics(self) -> None: method test_snapshot_to_dict (line 356) | def test_snapshot_to_dict(self) -> None: class TestMetrics (line 370) | class TestMetrics: method test_aggregate_empty (line 373) | def test_aggregate_empty(self) -> None: method test_aggregate_mixed (line 379) | def test_aggregate_mixed(self) -> None: method test_extract_training_curve (line 393) | def test_extract_training_curve(self) -> None: class TestVoiceCommands (line 412) | class TestVoiceCommands: method test_start_command (line 415) | def test_start_command(self) -> None: method test_stop_command (line 421) | def test_stop_command(self) -> None: method test_chinese_start (line 427) | def test_chinese_start(self) -> None: method test_chinese_pause (line 433) | def test_chinese_pause(self) -> None: method test_not_a_command (line 439) | def test_not_a_command(self) -> None: method test_status_command (line 445) | def test_status_command(self) -> None: class TestWizard (line 457) | class TestWizard: method test_list_templates (line 460) | def test_list_templates(self) -> None: method test_get_template (line 469) | def test_get_template(self) -> None: method test_get_template_missing (line 476) | def test_get_template_missing(self) -> None: method test_wizard_web_mode (line 481) | def test_wizard_web_mode(self) -> None: method test_environment_detection (line 493) | def test_environment_detection(self) -> None: class TestEvents (line 509) | class TestEvents: method test_event_serialization (line 512) | def test_event_serialization(self) -> None: method test_event_deserialization (line 521) | def test_event_deserialization(self) -> None: method test_event_types_enum (line 533) | def test_event_types_enum(self) -> None: class TestDialogRouter (line 546) | class TestDialogRouter: method test_route_help_message (line 550) | async def test_route_help_message(self) -> None: method test_route_json_message (line 557) | async def test_route_json_message(self) -> None: method test_route_status_message (line 566) | async def test_route_status_message(self) -> None: class TestFastAPIApp (line 578) | class TestFastAPIApp: method _skip_if_no_fastapi (line 582) | def _skip_if_no_fastapi(self) -> None: method app (line 590) | def app(self, _skip_if_no_fastapi: None) -> object: method test_health_endpoint (line 610) | async def test_health_endpoint(self, app: object) -> None: method test_config_endpoint (line 621) | async def test_config_endpoint(self, app: object) -> None: method test_pipeline_status_idle (line 632) | async def test_pipeline_status_idle(self, app: object) -> None: method test_pipeline_stages (line 642) | async def test_pipeline_stages(self, app: object) -> None: method test_runs_list (line 653) | async def test_runs_list(self, app: object) -> None: method test_projects_list (line 663) | async def test_projects_list(self, app: object) -> None: method test_stop_pipeline_404_when_idle (line 673) | async def test_stop_pipeline_404_when_idle(self, app: object) -> None: FILE: tests/test_web_scholar.py class TestScholarPaper (line 18) | class TestScholarPaper: method test_to_dict (line 19) | def test_to_dict(self): method test_to_literature_paper (line 31) | def test_to_literature_paper(self): class TestGoogleScholarClient (line 52) | class TestGoogleScholarClient: method test_available_always_true (line 54) | def test_available_always_true(self): method test_parse_pub_full (line 59) | def test_parse_pub_full(self): method test_parse_pub_string_authors (line 80) | def test_parse_pub_string_authors(self): method test_parse_pub_missing_fields (line 95) | def test_parse_pub_missing_fields(self): method test_rate_limiting (line 103) | def test_rate_limiting(self): method test_search_with_mocked_scholarly (line 113) | def test_search_with_mocked_scholarly(self, mock_scholarly): method test_search_error_graceful (line 133) | def test_search_error_graceful(self, mock_scholarly): FILE: tests/test_web_search.py class TestSearchResult (line 17) | class TestSearchResult: method test_to_dict (line 18) | def test_to_dict(self): class TestWebSearchResponse (line 33) | class TestWebSearchResponse: method test_has_results_true (line 34) | def test_has_results_true(self): method test_has_results_false (line 40) | def test_has_results_false(self): class TestDDGParsing (line 50) | class TestDDGParsing: method test_parse_ddg_html_basic (line 51) | def test_parse_ddg_html_basic(self): method test_parse_ddg_html_skips_ddg_links (line 68) | def test_parse_ddg_html_skips_ddg_links(self): method test_parse_ddg_html_respects_limit (line 77) | def test_parse_ddg_html_respects_limit(self): class TestWebSearchClient (line 90) | class TestWebSearchClient: method test_search_ddg_fallback_no_api_key (line 92) | def test_search_ddg_fallback_no_api_key(self, mock_urlopen): method test_search_ddg_error_graceful (line 106) | def test_search_ddg_error_graceful(self, mock_urlopen): method test_search_tavily_with_mock (line 114) | def test_search_tavily_with_mock(self): method test_search_multi_deduplication (line 142) | def test_search_multi_deduplication(self, mock_urlopen):