A Python framework for self-hosted LLM tool-calling and multi-step agentic workflows
This report presents the forensic synthetic code analysis of antoinezambelli/forge, a Python project with 2,171 GitHub stars. SynthScan v2.0 examined 56,087 lines of code across 169 source files, recording 1788 pattern matches distributed across 18 syntactic categories. The overall adjusted score of 43.0 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 1788 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/unit/test_argument_transformation.py | 55 | def test_list_transactions_unknown_quarter_returns_empty(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 61 | def test_get_approved_vendors_returns_canonical_six(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 71 | def test_get_vendor_details_resolves_acme_alias(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 78 | def test_get_vendor_details_acme_corp_lists_alias(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 83 | def test_get_vendor_details_unknown_vendor_returns_not_found(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 89 | def test_currency_convert_eur_to_usd_uses_fixed_rate(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 97 | def test_currency_convert_under_threshold_eur(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 104 | def test_currency_convert_unsupported_pair(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 110 | def test_categorize_expense_is_distractor_no_audit_info(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 117 | def test_lookup_transaction_redundant_helper(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 123 | def test_lookup_transaction_unknown_id(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 127 | def test_submit_audit_report_acks_inputs(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 156 | def test_alt_format_no_comma_no_dollar_passes(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 166 | def test_skip_currency_conversion_fails(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 174 | def test_case_mismatch_over_flag_fails(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 183 | def test_strict_gt_threshold_fails(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 190 | def test_wrong_top_vendor_fails(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 195 | def test_missing_one_id_fails(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 213 | def test_lambda_scenario_terminal_is_submit_audit_report(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 216 | def test_lambda_scenario_required_steps(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 221 | def test_lambda_scenario_iteration_budget(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 225 | def test_lambda_scenario_tags(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 251 | def test_list_transactions_wrong_quarter_no_state(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 257 | def test_get_approved_vendors_records_state(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 263 | def test_get_vendor_details_acme_alias_records_state(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 269 | def test_currency_convert_eur_records_state(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 275 | def test_currency_convert_usd_to_eur_does_not_record_eur_flag(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 282 | def test_submit_audit_report_records_args(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 389 | def test_lambda_in_all_scenarios(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 394 | def test_stateful_in_all_scenarios(self) -> None: | CODE |
| LOW | tests/unit/test_argument_transformation.py | 297 | def test_validate_state_requires_full_reasoning_path(self) -> None: | CODE |
| LOW | tests/unit/test_argument_transformation.py | 319 | def test_validate_state_false_when_skipped_currency_convert(self) -> None: | CODE |
| LOW | tests/unit/test_argument_transformation.py | 333 | def test_validate_state_false_when_skipped_vendor_details(self) -> None: | CODE |
| LOW | tests/unit/test_argument_transformation.py | 348 | def test_validate_state_false_when_wrong_args_submitted(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 91 | async def test_returns_text_response(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 101 | async def test_missing_choices_raises_backend_error(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 111 | async def test_null_content_returns_empty_text(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 121 | async def test_malformed_tool_args_kept_as_raw_args(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 455 | def test_bearer_header_set_when_key_provided(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 461 | def test_no_auth_header_when_no_key(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 465 | def test_base_url_trailing_slash_stripped(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 475 | async def test_yields_text_deltas_and_final(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 828 | def test_recommended_sampling_off_is_silent_for_unknown_model(self) -> None: | CODE |
| LOW⚡ | tests/unit/test_openai_compat_client.py | 838 | def test_recommended_sampling_on_raises_for_unknown_model(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 143 | async def test_malformed_tool_args_kept_even_with_assistant_text(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 164 | async def test_malformed_among_several_kept_per_call(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 186 | async def test_dict_tool_args_accepted(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 205 | async def test_formats_tools_in_request(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 220 | async def test_request_body_structure(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 235 | async def test_posts_to_chat_completions(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 257 | async def test_http_error_raises_backend_error(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 266 | async def test_structured_reasoning_field_captured(self, field) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 287 | async def test_extracts_think_tags_from_content_with_tool_call(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 307 | async def test_reasoning_field_preferred_over_content_tags(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 326 | async def test_content_preamble_not_treated_as_reasoning(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 348 | async def test_think_tags_stripped_from_text_response(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 363 | async def test_plain_preamble_text_response_survives(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 378 | async def test_reasoning_attached_to_first_tool_call_only(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 399 | async def test_empty_string_structured_field_falls_through_to_tags(self) -> None: | CODE |
| LOW | tests/unit/test_openai_compat_client.py | 420 | async def test_non_string_reasoning_field_raises(self) -> None: | CODE |
| 1059 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/conftest.py | 12 | # ── Shared LLM client double ───────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_argument_transformation.py | 206 | # ── Scenario shape ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_argument_transformation.py | 230 | # ── Stateful backend ──────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_argument_transformation.py | 385 | # ── Scenario registered in ALL_SCENARIOS ──────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_argument_transformation.py | 30 | # ── Lambda tool callables ─────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_argument_transformation.py | 138 | # ── Validator ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_openai_compat_client.py | 451 | # ── auth ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_openai_compat_client.py | 470 | # ── send_stream ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_openai_compat_client.py | 848 | # ── instance sampling flows into request body ──────────────────── | COMMENT |
| MEDIUM | tests/unit/test_openai_compat_client.py | 62 | # ── send ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_openai_compat_client.py | 774 | # ── constructor ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_openai_compat_client.py | 877 | # ── passthrough + inbound_anthropic_body ───────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_openai_compat_client.py | 950 | # ── aclose ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_inconsistent_api_recovery.py | 32 | # ── Lambda tool callables ─────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_inconsistent_api_recovery.py | 249 | # ── Scenario shape ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_inconsistent_api_recovery.py | 280 | # ── Stateful backend ──────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_inconsistent_api_recovery.py | 364 | # ── Stateful validate_state ───────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_inconsistent_api_recovery.py | 205 | # ── Validator (lambda) ────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_ollama_client.py | 766 | # ── outbound message normalization (#111 / #115) ───────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_ollama_client.py | 877 | # ── get_context_length + set_num_ctx ───────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_ollama_client.py | 49 | # ── send ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_ollama_client.py | 397 | # ── send_stream ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_ollama_client.py | 962 | # ── format_tool ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_proxy_auth.py | 84 | # ── relocate_credential ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_proxy_auth.py | 130 | # ── resolve_inbound_credential ─────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_proxy_auth.py | 165 | # ── handler threading ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_proxy_auth.py | 25 | # ── extract_inbound_credential ─────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_anthropic_client.py | 44 | # ── _convert_tools ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_anthropic_client.py | 84 | # ── _convert_messages ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_anthropic_client.py | 357 | # ── _parse_response ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_anthropic_client.py | 412 | # ── Usage reporting (slot-keyed last_usage) ────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_anthropic_client.py | 450 | # ── Prompt caching (static tools+system breakpoint) ────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_llamafile_client.py | 1220 | # ── _apply_sampling ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_llamafile_client.py | 1386 | # ── _extract_think_tags ────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_llamafile_client.py | 1951 | # ── Issue #121: Path.stem truncates dotted model names ───────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 162 | # ── send — native mode ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 644 | # ── send — prompt mode ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 734 | # ── get_context_length ─────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 774 | # ── discover_backend_metadata (deferred discovery) ─────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 853 | # ── send_stream ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 1027 | # ── send_stream — malformed-500 rescue (streaming twins) ────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 1202 | # ── mode ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 1285 | # ── _merge_consecutive ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 1462 | # ── think flag behavior — sync ──────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 1631 | # ── think flag behavior — stream ────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_llamafile_client.py | 1726 | # ── slot_id ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_templates.py | 25 | # ── build_tool_prompt ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_templates.py | 80 | # ── extract_tool_call ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_templates.py | 166 | # ── rescue_tool_call ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_templates.py | 238 | # ── Qwen Coder XML format ─────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_guardrails.py | 22 | # ── check(): response validation ───────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_guardrails.py | 129 | # ── check(): step enforcement ──────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_guardrails.py | 165 | # ── record() ───────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_guardrails.py | 201 | # ── CheckResult dataclass ──────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_guardrails.py | 217 | # ── Imports ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_guardrails.py | 232 | # ── Custom retry nudge ─────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_guardrails.py | 9 | # ── Helpers ────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/test_proxy_path1.py | 24 | # ── ProxyServer construction validation ────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_proxy_path1.py | 77 | # ── AnthropicClient verbatim path ──────────────────────────── | COMMENT |
| MEDIUM | tests/unit/test_proxy_path1.py | 165 | # ── AnthropicClient base_url ───────────────────────────────── | COMMENT |
| 215 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 3 | CODE | |
| LOW | tests/unit/test_argument_transformation.py | 13 | CODE | |
| LOW | tests/unit/test_argument_transformation.py | 15 | CODE | |
| LOW | tests/unit/test_openai_compat_client.py | 11 | CODE | |
| LOW | tests/unit/test_response_validator.py | 6 | CODE | |
| LOW | tests/unit/test_step_enforcer.py | 3 | CODE | |
| LOW | tests/unit/test_inconsistent_api_recovery.py | 13 | CODE | |
| LOW | tests/unit/test_inconsistent_api_recovery.py | 25 | CODE | |
| LOW | tests/unit/test_ollama_client.py | 13 | CODE | |
| LOW | tests/unit/test_anthropic_client.py | 7 | CODE | |
| LOW | tests/unit/test_anthropic_client.py | 17 | CODE | |
| LOW | tests/unit/test_llamafile_client.py | 12 | CODE | |
| LOW | tests/unit/test_clients_base.py | 3 | CODE | |
| LOW | tests/unit/test_proxy_path1.py | 13 | CODE | |
| LOW | tests/unit/test_proxy_path1.py | 20 | CODE | |
| LOW | tests/unit/test_data_gap_recovery_extended.py | 12 | CODE | |
| LOW | tests/unit/test_data_gap_recovery_extended.py | 14 | CODE | |
| LOW | tests/unit/test_workflow.py | 4 | CODE | |
| LOW | tests/unit/test_workflow.py | 4 | CODE | |
| LOW | tests/unit/test_server.py | 3 | CODE | |
| LOW | tests/unit/test_server.py | 8 | CODE | |
| LOW | tests/unit/test_server.py | 15 | CODE | |
| LOW | tests/unit/test_slot_worker.py | 3 | CODE | |
| LOW | tests/unit/test_slot_worker.py | 6 | CODE | |
| LOW | tests/unit/test_slot_worker.py | 8 | CODE | |
| LOW | tests/unit/test_slot_worker.py | 14 | CODE | |
| LOW | tests/unit/test_slot_worker.py | 389 | CODE | |
| LOW | tests/unit/test_runner.py | 3 | CODE | |
| LOW | tests/unit/test_runner.py | 6 | CODE | |
| LOW | tests/unit/test_runner.py | 10 | CODE | |
| LOW | tests/unit/test_eval_budget.py | 3 | CODE | |
| LOW | tests/unit/test_eval_budget.py | 6 | CODE | |
| LOW | tests/unit/test_eval_budget.py | 8 | CODE | |
| LOW | tests/unit/test_eval_budget.py | 14 | CODE | |
| LOW | tests/unit/test_proxy_proxy.py | 9 | CODE | |
| LOW | tests/unit/test_batch_eval_resume.py | 9 | CODE | |
| LOW | tests/unit/test_client_auth.py | 15 | CODE | |
| LOW | tests/unit/test_respond_tool.py | 3 | CODE | |
| LOW | tests/unit/test_respond_tool.py | 4 | CODE | |
| LOW | tests/unit/test_respond_tool.py | 4 | CODE | |
| LOW | tests/unit/test_respond_tool.py | 4 | CODE | |
| LOW | tests/unit/test_respond_tool.py | 6 | CODE | |
| LOW | tests/unit/test_respond_tool.py | 6 | CODE | |
| LOW | tests/unit/test_respond_tool.py | 13 | CODE | |
| LOW | tests/unit/test_strategies.py | 4 | CODE | |
| LOW | tests/unit/test_grounded_synthesis.py | 12 | CODE | |
| LOW | tests/unit/test_grounded_synthesis.py | 23 | CODE | |
| LOW | tests/eval/metrics.py | 3 | CODE | |
| LOW | tests/eval/batch_eval.py | 11 | CODE | |
| LOW | tests/eval/batch_eval.py | 17 | CODE | |
| LOW | tests/eval/batch_eval.py | 28 | CODE | |
| LOW | tests/eval/ablation.py | 3 | CODE | |
| LOW | tests/eval/significance.py | 15 | CODE | |
| LOW | tests/eval/eval_runner.py | 3 | CODE | |
| LOW | tests/eval/eval_runner.py | 12 | CODE | |
| LOW | tests/eval/eval_runner.py | 18 | CODE | |
| LOW | tests/eval/report.py | 17 | CODE | |
| LOW | tests/eval/scenarios/_base.py | 3 | CODE | |
| LOW | tests/eval/scenarios/_stateful_plumbing.py | 3 | CODE | |
| LOW | tests/eval/scenarios/_model_reasoning.py | 10 | CODE | |
| 165 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 74 | # Integration-only: lifecycle orchestration requiring real backends/threads. | COMMENT |
| MEDIUM | README.md | 3 | [](https://pypi.org/project/forge-guardrails/) | CODE |
| MEDIUM | README.md | 15 | - **Not a coding harness.** Forge is domain-agnostic. If you're building a coding agent (or already using one like openc | CODE |
| MEDIUM | README.md | 129 | Drop-in proxy that sits between any client and a local model server, speaking both the OpenAI chat-completions API and t | CODE |
| MEDIUM | README.md | 251 | runner.py # WorkflowRunner — the agentic loop | CODE |
| MEDIUM | CONTRIBUTING.md | 74 | ### Adding or modifying guardrails | COMMENT |
| MEDIUM | tests/unit/test_openai_compat_client.py | 422 | # it into replayable chain-of-thought. | COMMENT |
| MEDIUM | tests/unit/test_openai_compat_client.py | 728 | # never repr-coerced into chain-of-thought. | COMMENT |
| MEDIUM | tests/unit/test_proxy_handler.py | 274 | # ── With tools → guardrails ───────────────────────────────── | COMMENT |
| MEDIUM | tests/eval/report.py | 1350 | ("## Full Ablation — which guardrails do the work?", lambda rp: rp == "ablation.md"), | CODE |
| MEDIUM | tests/eval/scenarios/_model_reasoning.py | 569 | # guardrails-vs-bare ablation: bare runs hit the first error and | COMMENT |
| MEDIUM | docs/USER_GUIDE.md | 109 | ### Mode 3: Middleware (composable guardrails) | COMMENT |
| MEDIUM | docs/WORKFLOW.md | 447 | └── reasoning: str | None # chain-of-thought (thinking models) | CODE |
| MEDIUM | docs/EVAL_GUIDE.md | 84 | # Ablation — bare (all guardrails off) | COMMENT |
| MEDIUM | docs/decisions/MULTI_MODEL_ROUTING.md | 166 | # Consumer orchestration code | COMMENT |
| MEDIUM | src/forge/clients/vllm.py | 520 | # would silently mis-size the context window. No entry, no budget: | COMMENT |
| MEDIUM | src/forge/clients/sampling_defaults.py | 171 | # explicit chain of thought). Card recommends temperature=0.2, top_k=80, repetition_penalty=1.05 | COMMENT |
| MEDIUM | src/forge/clients/openai_compat.py | 381 | # chain-of-thought. | COMMENT |
| MEDIUM | src/forge/proxy/handler.py | 335 | # in tool-calling mode where guardrails apply. The respond call is | COMMENT |
| MEDIUM | src/forge/proxy/handler.py | 349 | # No tools → plain chat completion, no guardrails needed. | COMMENT |
| MEDIUM | src/forge/proxy/handler.py | 370 | # Set up guardrails | COMMENT |
| MEDIUM | src/forge/proxy/handler.py | 394 | # error. The client's own agentic loop can decide what to do. | COMMENT |
| MEDIUM | src/forge/proxy/proxy.py | 321 | # guardrails wrap its inference loop like any other client. | COMMENT |
| MEDIUM | src/forge/proxy/proxy.py | 323 | # (forge-guardrails[anthropic]). Only Path 1 needs it, so | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/eval/metrics.py | 260 | CODE | |
| LOW | tests/eval/batch_eval.py | 589 | CODE | |
| LOW | tests/eval/batch_eval.py | 672 | CODE | |
| LOW | tests/eval/significance.py | 91 | CODE | |
| LOW | tests/eval/eval_runner.py | 234 | CODE | |
| LOW | tests/eval/eval_runner.py | 405 | CODE | |
| LOW | tests/eval/report.py | 317 | CODE | |
| LOW | tests/eval/report.py | 789 | CODE | |
| LOW | scripts/run_ablation.py | 102 | CODE | |
| LOW | scripts/migrate_eval_jsonl_gguf_identity.py | 100 | CODE | |
| LOW | src/forge/server.py | 545 | CODE | |
| LOW | src/forge/server.py | 505 | CODE | |
| LOW | src/forge/clients/llamafile.py | 207 | CODE | |
| LOW | src/forge/clients/llamafile.py | 250 | CODE | |
| LOW | src/forge/clients/anthropic.py | 240 | CODE | |
| LOW | src/forge/clients/anthropic.py | 528 | CODE | |
| LOW | src/forge/clients/ollama.py | 29 | CODE | |
| LOW | src/forge/clients/ollama.py | 381 | CODE | |
| LOW | src/forge/clients/base.py | 179 | CODE | |
| LOW | src/forge/context/strategies.py | 204 | CODE | |
| LOW | src/forge/core/steps.py | 53 | CODE | |
| LOW | src/forge/core/runner.py | 88 | CODE | |
| LOW | src/forge/core/workflow.py | 68 | CODE | |
| LOW | src/forge/proxy/server.py | 143 | CODE | |
| LOW | src/forge/proxy/server.py | 359 | CODE | |
| LOW | src/forge/proxy/proxy.py | 306 | CODE | |
| LOW | src/forge/proxy/convert.py | 17 | CODE | |
| LOW | src/forge/proxy/convert_anthropic.py | 20 | CODE | |
| LOW | src/forge/prompts/templates.py | 12 | CODE | |
| LOW | src/forge/prompts/templates.py | 55 | CODE | |
| LOW | src/forge/prompts/templates.py | 185 | CODE | |
| LOW | src/forge/prompts/templates.py | 238 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 532 | # Step 1: patient MRN (not in user message) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 534 | # Step 3: lab values (only from tool result) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 536 | # Step 4: imaging findings (only from tool result) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 538 | # Step 5: specialist (only from tool result) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 540 | # Step 6: medication concern (only from tool result) | COMMENT |
| LOW | docs/decisions/003-thinking-label-ux.md | 64 | ### Step 1: Add `_resolve_reasoning()` to OllamaClient | COMMENT |
| LOW | docs/decisions/003-thinking-label-ux.md | 86 | ### Step 2: Use it in `send()` (batch path) | COMMENT |
| LOW | docs/decisions/003-thinking-label-ux.md | 102 | ### Step 3: Use it in `_iter_stream()` (streaming path) | COMMENT |
| LOW | docs/decisions/003-thinking-label-ux.md | 124 | ### Step 4: Add unit tests | COMMENT |
| LOW | docs/decisions/003-thinking-label-ux.md | 187 | ### Step 5: Update README roadmap | COMMENT |
| LOW | docs/decisions/004-async-on-chunk.md | 75 | ### Step 1: Change type signature | COMMENT |
| LOW | docs/decisions/004-async-on-chunk.md | 91 | ### Step 2: Await the callback in `_send_streaming()` | COMMENT |
| LOW | docs/decisions/004-async-on-chunk.md | 107 | ### Step 3: Update `_make_runner` helper type hint | COMMENT |
| LOW | docs/decisions/004-async-on-chunk.md | 127 | ### Step 4: Update the test | COMMENT |
| LOW | docs/decisions/004-async-on-chunk.md | 171 | ### Step 5: Update docstring | COMMENT |
| LOW | docs/decisions/004-async-on-chunk.md | 180 | ### Step 6: Update README roadmap | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/forge/server.py | 348 | Resolve the ContextManager budget for the given mode. Args: mode: The budget mode to use. | STRING |
| HIGH | src/forge/server.py | 397 | Start server with the specified budget mode and return the resolved budget. Handles the mode-specific startup d | STRING |
| HIGH | src/forge/clients/sampling_defaults.py | 235 | Apply the recommended-sampling policy for ``model``. Called by client constructors at instantiation time. The four- | STRING |
| HIGH | src/forge/core/inference.py | 186 | Send messages to the LLM with compaction, folding, validation, and retry. Retries are handled internally — the call | STRING |
| HIGH | src/forge/core/slot_worker.py | 65 | Submit a workflow for execution and wait for the result. Args: workflow: The workflow to execute. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/unit/test_argument_transformation.py | 64 | "Acme Corp", "Globex Industries", "Initech Systems", | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 79 | out = self._call("get_vendor_details", vendor_name="Acme Corp") | CODE |
| LOW⚡ | tests/unit/test_argument_transformation.py | 260 | assert "Acme Corp" in out | CODE |
| LOW⚡ | tests/unit/test_inconsistent_api_recovery.py | 43 | assert "Acme Corp" in out | CODE |
| LOW⚡ | tests/unit/test_inconsistent_api_recovery.py | 298 | assert "Acme Corp" in out | CODE |
| LOW | tests/eval/scenarios/_base.py | 15 | placeholder_field: str = Field(description="placeholder") | CODE |
| LOW⚡ | tests/eval/scenarios/_base.py | 49 | spec=ToolSpec(name=terminal_tool, description="placeholder", | CODE |
| LOW⚡ | tests/eval/scenarios/_base.py | 56 | spec=ToolSpec(name=s, description="placeholder", | CODE |
| LOW⚡ | tests/eval/scenarios/_base.py | 64 | description="placeholder", | CODE |
| LOW | tests/eval/scenarios/_model_reasoning.py | 300 | # approved 'Acme Corp'. Literal string compare over-flags it; | COMMENT |
| LOW | tests/eval/scenarios/_model_reasoning.py | 313 | "Acme Corp", | CODE |
| LOW | tests/eval/scenarios/_model_reasoning.py | 326 | ("TX-1002", "2024-10-12", "Acme Corp", 12000, "USD", False), # approved | CODE |
| LOW | tests/eval/scenarios/_model_reasoning.py | 377 | if name == "Acme Corp": | CODE |
| LOW | tests/eval/scenarios/_model_reasoning.py | 621 | (12345, "Acme Corp"), | CODE |
| LOW⚡ | tests/eval/scenarios/_stateful_model_reasoning.py | 368 | "Acme Corp", | CODE |
| LOW⚡ | tests/eval/scenarios/_stateful_model_reasoning.py | 378 | ("TX-1002", "2024-10-12", "Acme Corp", 12000, "USD"), | CODE |
| LOW | tests/eval/scenarios/_stateful_model_reasoning.py | 441 | if name == "Acme Corp": | CODE |
| LOW | tests/eval/scenarios/_stateful_model_reasoning.py | 681 | (12345, "Acme Corp"), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/forge/clients/vllm.py | 0 | per-call headers to apply, enforcing the one-credential rule. returns the dict to pass as httpx ``headers=`` (merged ove | STRING |
| HIGH | src/forge/clients/llamafile.py | 0 | per-call headers to apply, enforcing the one-credential rule. returns the dict to pass as httpx ``headers=`` (merged ove | STRING |
| HIGH | src/forge/clients/openai_compat.py | 0 | per-call headers to apply, enforcing the one-credential rule. returns the dict to pass as httpx ``headers=`` (merged ove | STRING |
| HIGH | src/forge/clients/ollama.py | 0 | per-call headers to apply, enforcing the one-credential rule. returns the dict to pass as httpx ``headers=`` (merged ove | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/eval/batch_eval.py | 562 | except Exception: | CODE |
| LOW | tests/eval/batch_eval.py | 581 | except Exception as exc: | CODE |
| LOW | tests/eval/eval_runner.py | 320 | except Exception as exc: | CODE |
| LOW | tests/eval/eval_runner.py | 330 | except Exception as exc: | CODE |
| LOW | tests/eval/eval_runner.py | 369 | except Exception as exc: | CODE |
| LOW | tests/eval/eval_runner.py | 666 | except Exception as exc: | CODE |
| LOW | docs/ARCHITECTURE.md | 27 | except Exception: | CODE |
| LOW | scripts/integration_test_proxy.py | 375 | except Exception as exc: | CODE |
| LOW | scripts/run_ablation.py | 170 | except Exception as e: | CODE |
| LOW | src/forge/core/runner.py | 345 | except Exception as exc: | CODE |
| LOW | src/forge/core/slot_worker.py | 137 | except Exception as exc: | CODE |
| LOW | src/forge/proxy/server.py | 137 | except Exception as exc: | CODE |
| LOW⚡ | src/forge/proxy/server.py | 208 | except Exception: | CODE |
| LOW⚡ | src/forge/proxy/server.py | 212 | except Exception: | CODE |
| LOW⚡ | src/forge/proxy/server.py | 218 | except Exception: | CODE |
| LOW | src/forge/proxy/server.py | 356 | except Exception as exc: | CODE |
| LOW | src/forge/proxy/server.py | 445 | except Exception as exc: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/eval/scenarios/__init__.py | 81 | __all__ = [ | CODE |
| LOW | scripts/integration_test_proxy.py | 71 | def _setup_logging() -> None: | CODE |
| LOW | src/forge/__init__.py | 75 | __all__ = [ | CODE |
| LOW | src/forge/clients/vllm.py | 157 | def _set_model_identity(self, wire_id: str | Path) -> None: | CODE |
| LOW | src/forge/clients/__init__.py | 14 | __all__ = [ | CODE |
| LOW | src/forge/clients/ollama.py | 444 | def set_num_ctx(self, num_ctx: int | None) -> None: | CODE |
| LOW | src/forge/tools/__init__.py | 9 | __all__ = [ | CODE |
| LOW | src/forge/context/__init__.py | 19 | __all__ = [ | CODE |
| LOW | src/forge/context/hardware.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/forge/context/manager.py | 93 | def update_token_count(self, total_tokens: int) -> None: | CODE |
| LOW | src/forge/core/__init__.py | 3 | __all__ = ["WorkflowRunner"] | CODE |
| LOW | src/forge/guardrails/__init__.py | 19 | __all__ = [ | CODE |
| LOW | src/forge/proxy/__init__.py | 5 | __all__ = ["ProxyServer"] | CODE |
| LOW | src/forge/prompts/__init__.py | 6 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/eval/batch_eval.py | 672 | CODE | |
| LOW | src/forge/server.py | 545 | CODE | |
| LOW | src/forge/server.py | 73 | CODE | |
| LOW | src/forge/server.py | 382 | CODE | |
| LOW | src/forge/clients/vllm.py | 58 | CODE | |
| LOW | src/forge/clients/llamafile.py | 324 | CODE | |
| LOW | src/forge/clients/openai_compat.py | 53 | CODE | |
| LOW | src/forge/clients/anthropic.py | 105 | CODE | |
| LOW | src/forge/clients/ollama.py | 98 | CODE | |
| LOW | src/forge/core/runner.py | 34 | CODE | |
| LOW | src/forge/core/inference.py | 165 | CODE | |
| LOW | src/forge/proxy/server.py | 58 | CODE | |
| LOW | src/forge/proxy/handler.py | 198 | CODE | |
| LOW | src/forge/proxy/proxy.py | 60 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/eval/scenarios/_model_reasoning.py | 61 | top_vendor: str = Field(description="Vendor of the single largest flagged transaction") | COMMENT |
| LOW | tests/eval/scenarios/_model_reasoning.py | 281 | tags=["advanced_reasoning", "reasoning", "model_quality"], | COMMENT |
| LOW | tests/eval/scenarios/_model_reasoning.py | 561 | COMMENT | |
| LOW | tests/eval/scenarios/_model_reasoning.py | 881 | "txn_count (int)." | COMMENT |
| LOW | tests/eval/scenarios/_model_reasoning.py | 901 | # Sarah Chen — top-decile attractor; BLOCKER: Stripe non-compete | COMMENT |
| LOW | examples/foreign_loop.py | 141 | # The respond tool eliminates this ambiguity: the model calls | COMMENT |
| LOW | src/forge/clients/sampling_defaults.py | 101 | "Mistral-Small-4-119B-2603-UD-Q4_K_M": {"temperature": 0.7, "chat_template_kwargs": {"reasoning_effort": "high"}}, | COMMENT |
| LOW | src/forge/clients/sampling_defaults.py | 121 | # T=1.0, top_p=0.95 across all tasks. Coding-agent serving guidance also adds force_nonempty_content | COMMENT |
| LOW | src/forge/clients/sampling_defaults.py | 161 | "Ministral-3-8B-Reasoning-2512-Q4_K_M": {"temperature": 0.7}, # https://huggingface.co/mistralai/Ministral-3-8B-Re | COMMENT |
| LOW | src/forge/clients/llamafile.py | 41 | # ``*.gguf``/``*.llamafile`` files, but it silently truncates BARE dotted | COMMENT |
| LOW | src/forge/clients/anthropic.py | 121 | self._tool_choice = tool_choice # "auto", "any", or None (default=auto) | COMMENT |
| LOW | src/forge/clients/anthropic.py | 141 | # One credential per request. ``static_auth`` reflects an explicitly | COMMENT |
| LOW | src/forge/guardrails/nudge.py | 41 | COMMENT | |
| LOW | src/forge/proxy/handler.py | 301 | # ADR-015. | COMMENT |
| LOW | src/forge/proxy/proxy.py | 381 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 532 | # Step 1: patient MRN (not in user message) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 534 | # Step 3: lab values (only from tool result) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 536 | # Step 4: imaging findings (only from tool result) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 538 | # Step 5: specialist (only from tool result) | COMMENT |
| LOW⚡ | tests/eval/scenarios/_compaction_chain.py | 540 | # Step 6: medication concern (only from tool result) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 75 | # Covered by eval harness runs, not unit tests. | COMMENT |
| MEDIUM⚡ | tests/unit/test_proxy_auth.py | 43 | # The proxy lowercases keys, but be robust to mixed case anyway. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/unit/test_server.py | 239 | # Create a fake llamafile runtime in tmp_path | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/forge/prompts/nudges.py | 69 | args content (e.g. an empty string, null, a list, or a primitive | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/foreign_loop.py | 175 | # Check if the model called respond -- extract the message | COMMENT |