attocode-code-intel 0.1.4__tar.gz → 0.1.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/.gitignore +3 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/PKG-INFO +19 -2
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/README.md +18 -1
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/README.md +80 -0
- attocode_code_intel-0.1.5/evals/codex_repair_study.py +415 -0
- attocode_code_intel-0.1.5/evals/designs/2026-10-13-codex-repair-diagnostic.md +49 -0
- attocode_code_intel-0.1.5/evals/designs/2026-10-13-r7-task-completion-pilot.md +253 -0
- attocode_code_intel-0.1.5/evals/designs/2026-10-14-workflow-pilot.md +63 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/external_benchmarks.py +2 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/localize_study.py +132 -45
- attocode_code_intel-0.1.5/evals/repair_grading.py +142 -0
- attocode_code_intel-0.1.5/evals/repair_study.py +513 -0
- attocode_code_intel-0.1.5/evals/repair_worker.py +442 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-11-agent-r4-stage0.md +8 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-12-r4-stage1-review-agents.md +184 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-12-r5-test-suggestions.md +178 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-13-codex-repair-diagnostic.md +96 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-13-r6-review-test-note.md +170 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-13-r7-preparation.md +90 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-13-r7-wiring.md +54 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/broad-report.json +170 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/lifecycle.json +190 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/manifest.json +16 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/quick-report.json +83 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/ranking.json +9 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/ranking.log +39 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/scale.json +134 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/storage.json +40 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality/workflows.json +7884 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-bounded-quality.md +79 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-r7-completion-pilot.md +138 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-evidence-audit/fixture-replay.json +429 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-evidence-audit/ledger.json +14332 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-evidence-audit/report.md +48 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-evidence.md +92 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/README.md +92 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/artifact-hashes.json +8 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/chunk-analysis.json +1037 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/chunk-audit-script.txt +75 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/chunk-pools.json +7745 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/mcp-smoke-script.txt +54 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/mcp-smoke.json +590 -0
- attocode_code_intel-0.1.5/evals/results/2026-10-14-search-followup/metadata-source-probe.json +103 -0
- attocode_code_intel-0.1.5/evals/search_evidence_audit.py +297 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/study.py +13 -8
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/study_clients.py +6 -3
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/study_events.py +25 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/pyproject.toml +1 -1
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/__init__.py +1 -1
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/codebase_context.py +17 -2
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/semantic_search.py +97 -29
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/catalog.py +27 -3
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/entrypoint.py +6 -3
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/gateway.py +34 -10
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/onboarding.py +11 -5
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/output.py +21 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/query_ranking.py +2 -1
- attocode_code_intel-0.1.5/src/attocode_intel/search_evidence.py +132 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/symbol_links.py +14 -4
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/composite_tools.py +15 -4
- attocode_code_intel-0.1.5/tests/test_codex_repair_study.py +94 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_doctor.py +1 -1
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_focused_inspection.py +21 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_language_capabilities.py +5 -0
- attocode_code_intel-0.1.5/tests/test_lean_profile.py +72 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_localize_study.py +79 -7
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_navigation_evidence.py +4 -0
- attocode_code_intel-0.1.5/tests/test_quality_cloud.py +178 -0
- attocode_code_intel-0.1.5/tests/test_quality_lifecycle.py +205 -0
- attocode_code_intel-0.1.5/tests/test_quality_runner.py +83 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_ranking_intent.py +4 -2
- attocode_code_intel-0.1.5/tests/test_repair_study.py +266 -0
- attocode_code_intel-0.1.5/tests/test_search_evidence.py +229 -0
- attocode_code_intel-0.1.5/tests/test_search_evidence_audit.py +127 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_study.py +16 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/LICENSE +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/broad_candidate_audit.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/broad_query_cases.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/broad_query_external_cases.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/broad_query_final_holdout.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/client_comparison.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/client_responses.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/daily.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/external_study.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/graded_blind_pack.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/locbench_title_pack.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/onboarding_study.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/pilot.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/quality_scoring.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/quality_tasks.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/release_gate.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/responses.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-09-05-macos.json +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-04-broad-query-ranking.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-04-decision-reranker-trial.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-04-systemone-http-local-trial.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-05-broad-candidate-audit.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-05-source-view-transfer.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-08-blind-graded-rerank.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-08-locbench-560.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-09-locbench-560-first-stage.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-10-agent-pilot.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-10-agent-r3.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/2026-10-10-matrix-r1.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/results/README.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/source_view_transfer.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/study_tasks.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/token_overhead.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/understanding_scoring.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/understanding_study.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/warm_cache.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/evals/workflows.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/GUIDELINES.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/errors/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/architecture_drift.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/ast_chunker.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/ast_service.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/blob_oid.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/cache_manifest.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/cas.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/code_analyzer.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/codebase_ast.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/cross_mode.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/cross_references.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/embedding_rotation.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/embeddings.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/frecency.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/fuzzy.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/hierarchical_explorer.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/hydration.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/index_repair.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/index_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/memory_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/module_resolution.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/query_constraints.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/query_history.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/reranker.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/syntax_evidence.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/systemone_ranker.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/temporal_coupling.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/trigram_index.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/trigram_regex.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/ts_parser.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/context/vector_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/feature_flags/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/lsp/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/lsp/client.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/mcp/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/mcp/client.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/security/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/security/custom_rules.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/security/dataflow.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/security/dependency_audit.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/security/matcher.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/security/patterns.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/security/scanner.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/utilities/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/utilities/ignore.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/integrations/utilities/token_estimate.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/tricks/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/tricks/recursive_context.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/types/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/types/events.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_internal/types/severity.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/_shared.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/analysis_coverage.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/access.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/app.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/auth/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/auth/api_keys.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/auth/context.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/auth/jwt.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/auth/oauth.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/auth/passwords.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/deps.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/knowledge_bridge.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/mcp_transport.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/middleware.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/models.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/providers/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/providers/db_provider.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/providers/local_provider.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/providers/remote_provider.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/repository_source.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/_pin_helper.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/activity.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/adr.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/analysis.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/api_keys.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/auth.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/branches.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/cross_repo_search.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/embeddings.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/files.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/files_v2.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/gc.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/git_v2.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/graph.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/graph_viz.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/health.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/history.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/jobs.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/learning.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/lsp.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/notify.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/operations.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/orgs.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/preferences.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/presence.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/projects.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/repos.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/search.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/snapshots.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/webhooks.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/routes/websocket.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/static/graph.html +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/api/utils.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/artifacts/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/artifacts/hashing.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/artifacts/provenance.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/artifacts/retrieval_pin.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/audit.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/bug_finder.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/bundle.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/change_review.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/cli.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/community.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/confidence/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/confidence/jev.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/confidence/llm.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/confidence/redact.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/confidence/settings.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/config.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/crypto.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/db/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/db/base.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/db/engine.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/db/models.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/focused_evidence.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/freshness.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/git/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/git/credentials.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/git/manager.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/git/models.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/git/storage.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/graph_query_parser.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/helpers.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/indexing/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/indexing/debouncer.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/indexing/delta_indexer.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/indexing/full_indexer.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/indexing/incremental.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/indexing/parser.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/indexing/summarizer.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/installer.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/knowledge.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/local_knowledge.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/alembic.ini +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/env.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/script.py.mako +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/001_initial_schema.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/002_branch_version_and_embeddings.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/003_embedding_uniqueness_and_cascade.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/004_audit_events.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/005_user_preferences.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/006_google_oauth.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/007_pgvector_embeddings.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/008_symbol_references.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/009_webhook_secret_encryption.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/010_add_commits_table.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/011_commit_changed_files.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/012_branch_merged_at.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/013_revoked_tokens.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/014_blame_hunks.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/015_commit_file_stats.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/016_embedding_provenance_columns.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/017_provenance_table.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/018_repo_snapshots.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/019_symref_caller.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/migrations/versions/020_shared_knowledge.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/precision.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/presence.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/probe.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/project_dir.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/pubsub.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/readiness.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/redis.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/reference_pages.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/remote.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/repo_ranker.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/request_context.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/ci.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/combinators.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/enricher.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/evolution.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/executor.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/filters/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/filters/pipeline.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/formatter.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/hygiene.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/importers/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/importers/semgrep.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/loader.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/marketplace.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/metavar.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/model.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/_license_templates/Apache-2.0.txt +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/_license_templates/MIT.txt +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/LICENSE +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/NOTICE +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/PORTING.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B105-hardcoded-password.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B303-weak-md5.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B304-weak-des.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B307-use-of-eval.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B324-weak-sha1.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B501-no-cert-validation.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B602-shell-true.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/bandit-python/rules/B608-sqli.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/LICENSE +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/NOTICE +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/PORTING.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/eqeqeq.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-eval.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-implied-eval.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-new-func.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-throw-literal.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-var.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/eslint-typescript/rules/no-with.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/LICENSE +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/NOTICE +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/PORTING.md +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G101-hardcoded-credentials.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G102-bind-all-interfaces.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G103-unsafe-block.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G201-sql-format.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G304-file-inclusion.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G401-weak-cipher.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G402-tls-min-version.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/community/gosec-go/rules/G501-md5-import.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/cpp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/cpp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/cpp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/csharp/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/csharp/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/csharp/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/go/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/go/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/go/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/go/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/go/taint/sanitizers.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/go/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/go/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/java/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/java/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/java/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/java/taint/sinks.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/java/taint/sources.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/kotlin/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/kotlin/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/kotlin/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/php/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/php/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/php/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/python/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/python/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/python/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/ruby/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/ruby/rules/security.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/ruby/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/rust/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/rust/rules/correctness.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/rust/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/typescript/manifest.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/typescript/rules/performance.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/examples/typescript/rules/structural.yaml +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/packs/pack_loader.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/plugins/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/plugins/plugin_loader.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/profiling.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/registry.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/sarif.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/synthesis.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/rules/testing.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/server.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/service.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/sharing.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/branch_overlay.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/content_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/dependency_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/diff_engine.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/embedding_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/provenance_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/security_scanner_db.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/storage/symbol_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/structural_evidence.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/symbol_inspection.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/telemetry.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/test_ranking.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/testing/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/testing/fixtures.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/testing/helpers.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/testing/mocks.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/adr_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/analysis_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/cross_mode_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/dead_code_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/distill_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/frecency_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/fuzzy_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/history_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/learning_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/lsp_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/maintenance_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/navigation_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/overlay_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/pin_store.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/pin_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/query_constraints_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/query_history_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/readiness_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/rule_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/search_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/tools/snapshot_tools.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/workers/__init__.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/workers/job_utils.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/workers/jobs.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/workers/run.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/src/attocode_intel/workers/settings.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_cold_discovery.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_compact_inspection.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_daily_workflows.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_edit_restart.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_external_study.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_index_reuse.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_local_reranker.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_onboarding_study.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_pilot.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_precision_protocol.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_product.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_quality_evaluation.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_query_ranking.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_remote.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_structural_evidence.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_systemone_ranker.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_token_overhead.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_understanding_evaluation.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_walk_order.py +0 -0
- {attocode_code_intel-0.1.4 → attocode_code_intel-0.1.5}/tests/test_warm_cache.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: attocode-code-intel
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.5
|
|
4
4
|
Summary: Local code search and navigation for coding agents and people
|
|
5
5
|
Project-URL: Homepage, https://github.com/eren23/attocode
|
|
6
6
|
Project-URL: Repository, https://github.com/eren23/attocode
|
|
@@ -152,6 +152,15 @@ The agent sees 16 tools (the `daily` profile):
|
|
|
152
152
|
|
|
153
153
|
For all tools (about 140: rules, security scans, history, snapshots and more), add `--profile full` to `init`. The [tool catalog](https://github.com/eren23/attocode/blob/main/docs/intelligence-tools.md) lists them. The [search details](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md) page describes ranking, the response format and the experimental rerankers.
|
|
154
154
|
|
|
155
|
+
For an experimental local seven-tool surface (0.1.5 or later), use
|
|
156
|
+
`init --profile lean` and restart your client. It advertises `bootstrap`,
|
|
157
|
+
`search_symbols`, `inspect_symbol`, `semantic_search`, `impact_analysis`,
|
|
158
|
+
`suggest_tests` and `capabilities`, with conditional routing instructions
|
|
159
|
+
and 2,000-token responses. Without file watching, `notify_file_changed`
|
|
160
|
+
is an eighth tool. Advanced tools require a full-profile session.
|
|
161
|
+
This opt-in profile has no demonstrated completion benefit; see the
|
|
162
|
+
[completed pilot](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-14-r7-completion-pilot.md).
|
|
163
|
+
|
|
155
164
|
## Commands for people
|
|
156
165
|
|
|
157
166
|
Run these in your project:
|
|
@@ -172,7 +181,9 @@ Search matches the words of the code and its paths. It does not use embeddings u
|
|
|
172
181
|
- **Search.** We ran the 560 issues of Loc-Bench V1, with the full issue as the query. For 53.2% of them, the first five files held all files of the fix (file Acc@5 0.532). On a mix of 10 public benchmarks, file Acc@5 was 0.425. See the [first-stage results](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-09-locbench-560-first-stage.md) and the [matrix results](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-10-matrix-r1.md).
|
|
173
182
|
- **Agents.** In four studies, Claude Code (Sonnet 5.5) named the files to edit for an issue. The server did not raise file Acc@5. Each run with the server cost 1.4 to 2.1 times as much. When the agent could choose, it seldom called the server. See the [agent pilot](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-10-agent-pilot.md) and [study R3](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-10-agent-r3.md).
|
|
174
183
|
|
|
175
|
-
|
|
184
|
+
The [R6 review study](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-13-r6-review-test-note.md)
|
|
185
|
+
found no demonstrated review benefit. The [completed R7 repair pilot](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-14-r7-completion-pilot.md)
|
|
186
|
+
also found no demonstrated benefit; its reviewed decision is to stop expansion.
|
|
176
187
|
|
|
177
188
|
## Limits and troubleshooting
|
|
178
189
|
|
|
@@ -216,6 +227,12 @@ uv run pytest -c packages/code-intel/pyproject.toml --confcutdir=packages/code-i
|
|
|
216
227
|
uv build --package attocode-code-intel
|
|
217
228
|
```
|
|
218
229
|
|
|
230
|
+
For routine work, use `.venv/bin/python -m eval.quality quick` (two minutes)
|
|
231
|
+
or `local` (ten minutes). They isolate scratch and caches in a monitored 5 GiB
|
|
232
|
+
workspace and report incomplete runs separately from passes. The
|
|
233
|
+
[quality guide](https://github.com/eren23/attocode/blob/main/docs/intelligence-quality.md) covers pinned multi-language
|
|
234
|
+
workflow checks, storage inventory, cleanup and optional CPU cloud batches.
|
|
235
|
+
|
|
219
236
|
Releases use `intel-v*` tags ([release guide](https://github.com/eren23/attocode/blob/main/docs/intelligence-release.md)).
|
|
220
237
|
|
|
221
238
|
[Product and operations guide](https://github.com/eren23/attocode/blob/main/docs/intelligence.md) · [Tool catalog](https://github.com/eren23/attocode/blob/main/docs/intelligence-tools.md) · [Search details](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md) · [Changelog](https://github.com/eren23/attocode/blob/main/CHANGELOG.md) · [MIT license](https://github.com/eren23/attocode/blob/main/packages/code-intel/LICENSE)
|
|
@@ -40,6 +40,15 @@ The agent sees 16 tools (the `daily` profile):
|
|
|
40
40
|
|
|
41
41
|
For all tools (about 140: rules, security scans, history, snapshots and more), add `--profile full` to `init`. The [tool catalog](https://github.com/eren23/attocode/blob/main/docs/intelligence-tools.md) lists them. The [search details](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md) page describes ranking, the response format and the experimental rerankers.
|
|
42
42
|
|
|
43
|
+
For an experimental local seven-tool surface (0.1.5 or later), use
|
|
44
|
+
`init --profile lean` and restart your client. It advertises `bootstrap`,
|
|
45
|
+
`search_symbols`, `inspect_symbol`, `semantic_search`, `impact_analysis`,
|
|
46
|
+
`suggest_tests` and `capabilities`, with conditional routing instructions
|
|
47
|
+
and 2,000-token responses. Without file watching, `notify_file_changed`
|
|
48
|
+
is an eighth tool. Advanced tools require a full-profile session.
|
|
49
|
+
This opt-in profile has no demonstrated completion benefit; see the
|
|
50
|
+
[completed pilot](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-14-r7-completion-pilot.md).
|
|
51
|
+
|
|
43
52
|
## Commands for people
|
|
44
53
|
|
|
45
54
|
Run these in your project:
|
|
@@ -60,7 +69,9 @@ Search matches the words of the code and its paths. It does not use embeddings u
|
|
|
60
69
|
- **Search.** We ran the 560 issues of Loc-Bench V1, with the full issue as the query. For 53.2% of them, the first five files held all files of the fix (file Acc@5 0.532). On a mix of 10 public benchmarks, file Acc@5 was 0.425. See the [first-stage results](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-09-locbench-560-first-stage.md) and the [matrix results](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-10-matrix-r1.md).
|
|
61
70
|
- **Agents.** In four studies, Claude Code (Sonnet 5.5) named the files to edit for an issue. The server did not raise file Acc@5. Each run with the server cost 1.4 to 2.1 times as much. When the agent could choose, it seldom called the server. See the [agent pilot](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-10-agent-pilot.md) and [study R3](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-10-agent-r3.md).
|
|
62
71
|
|
|
63
|
-
|
|
72
|
+
The [R6 review study](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-13-r6-review-test-note.md)
|
|
73
|
+
found no demonstrated review benefit. The [completed R7 repair pilot](https://github.com/eren23/attocode/blob/main/packages/code-intel/evals/results/2026-10-14-r7-completion-pilot.md)
|
|
74
|
+
also found no demonstrated benefit; its reviewed decision is to stop expansion.
|
|
64
75
|
|
|
65
76
|
## Limits and troubleshooting
|
|
66
77
|
|
|
@@ -104,6 +115,12 @@ uv run pytest -c packages/code-intel/pyproject.toml --confcutdir=packages/code-i
|
|
|
104
115
|
uv build --package attocode-code-intel
|
|
105
116
|
```
|
|
106
117
|
|
|
118
|
+
For routine work, use `.venv/bin/python -m eval.quality quick` (two minutes)
|
|
119
|
+
or `local` (ten minutes). They isolate scratch and caches in a monitored 5 GiB
|
|
120
|
+
workspace and report incomplete runs separately from passes. The
|
|
121
|
+
[quality guide](https://github.com/eren23/attocode/blob/main/docs/intelligence-quality.md) covers pinned multi-language
|
|
122
|
+
workflow checks, storage inventory, cleanup and optional CPU cloud batches.
|
|
123
|
+
|
|
107
124
|
Releases use `intel-v*` tags ([release guide](https://github.com/eren23/attocode/blob/main/docs/intelligence-release.md)).
|
|
108
125
|
|
|
109
126
|
[Product and operations guide](https://github.com/eren23/attocode/blob/main/docs/intelligence.md) · [Tool catalog](https://github.com/eren23/attocode/blob/main/docs/intelligence-tools.md) · [Search details](https://github.com/eren23/attocode/blob/main/docs/intelligence-search.md) · [Changelog](https://github.com/eren23/attocode/blob/main/CHANGELOG.md) · [MIT license](https://github.com/eren23/attocode/blob/main/packages/code-intel/LICENSE)
|
|
@@ -204,6 +204,14 @@ The primary comparisons are ΔAcc@5 and the geometric mean cost ratio. The repor
|
|
|
204
204
|
|
|
205
205
|
With `--matrix OUT`, the report reads the rows of one offline cell (`--offline-cell`, default `product`) at variant `full` in `OUT/results.jsonl`. For each setup, it correlates the offline reciprocal rank of the first gold file with the agent Acc@5 (Spearman). It also gives a 2×2 table of offline hit@5 and agent hit. An agent hit is a task mean Acc@5 of 0.5 or more. The report counts the tasks without an offline row and does not score them.
|
|
206
206
|
|
|
207
|
+
## Agent review study
|
|
208
|
+
|
|
209
|
+
`study.py freeze --mode review` freezes a change-review study (R4 Stage 1). It uses the harness and the commands of the localization study. Each line of `--instances` has `id` (`dataset/native`), `repo`, `base_commit`, `patch` and `gold`. The gold files are the existing test files that the fix changed. `prepare` applies the patch to the one-commit snapshot without a commit. New files are intent-to-add, so `git diff` shows them. A review study has no `issue_only` setup.
|
|
210
|
+
|
|
211
|
+
The frozen prompt `REVIEW_PROMPT_V2` asks for the existing test files that check the change. The answer is `{"tests": [...]}`: at most 10 paths, best first. All setups get `Read`, `Grep`, `Glob` and `Bash` (`Bash(git diff:*)` with `--permission-mode dontAsk`). Claude Code runs read-only commands, such as `git diff` and `ls`, without a rule. It denies other commands, for example a test run or a file write. A denied call does not fail the run, and `summary` counts the denied calls. `intel_first` asks the agent to run `git diff --name-only` and then to call `suggest_tests` once with those files. The wiring check also proves that `git diff` runs and that `touch` is denied.
|
|
212
|
+
|
|
213
|
+
`summary` scores test Recall@5 and Hit@5. For each run, `gold_shown_not_named` lists the gold tests that an MCP result named. The answer did not name them.
|
|
214
|
+
|
|
207
215
|
## Ranking gate
|
|
208
216
|
|
|
209
217
|
`python -m eval.matrix.run ci` is a regression gate for search ranking. The Ranking gate workflow runs it when a pull request changes `packages/code-intel/src/`, `eval/matrix/` or `uv.lock`. The engine hash of the matrix covers all of `packages/code-intel/src/`, so a change in any of these files can move the ranking.
|
|
@@ -295,3 +303,75 @@ The table gives the core mix on the full query. The metric is Acc@5, but gNDCG@5
|
|
|
295
303
|
No difference on the core mix passes the Holm test. The datasets are small.
|
|
296
304
|
|
|
297
305
|
The earlier result (v1, also on 2026-10-09) ranked all stored files. It embedded at most 40 windows (1,600 lines) of a file and cut the query at 512 tokens. Markdown, reStructuredText, YAML and text files were about a fifth of the first ten files of `dense`. On the full issue of Loc-Bench 560, `dense` gave Acc@5 0.541 and `rrf(product+dense)` 0.664, against 0.532 for `product`. With only the Python files, `dense` gave 0.609. That pod embedded 1.99 million windows for about $1.7.
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
## Repair completion pilot
|
|
309
|
+
|
|
310
|
+
R7 compares optional local lean MCP with native tools on eight public
|
|
311
|
+
SWE-bench Lite tasks from eight repositories, two trials per arm. The
|
|
312
|
+
[protocol](designs/2026-10-13-r7-task-completion-pilot.md) fixes the outcome-first
|
|
313
|
+
continuation gate. Adoption is descriptive. Host reads and edits use trace
|
|
314
|
+
audit; Docker execution and independent grading have no network. This is
|
|
315
|
+
not an OS sandbox for the host client.
|
|
316
|
+
|
|
317
|
+
Use a separate Python 3.12 environment with PyArrow and SWE-bench pinned to
|
|
318
|
+
`726c5461e2ef52d83cf1ea2107870a8bb3328d57`. The worker checks its installed
|
|
319
|
+
commit and records dependency versions. Keep every pack/study outside this
|
|
320
|
+
repository. A pack contains private reference patches, official tests and
|
|
321
|
+
complete test lists; never mount it into an agent workspace.
|
|
322
|
+
|
|
323
|
+
```sh
|
|
324
|
+
# Preparation only: no Claude requests or quota check.
|
|
325
|
+
EVALUATOR=/path/to/isolated-evaluator/bin/python
|
|
326
|
+
PACK=/path/to/new-private-pack
|
|
327
|
+
STUDY=/path/to/new-study
|
|
328
|
+
DATASET=/path/to/lite@97f9af8814fe7eb15dcd9b2abaa9010e1eadda63/data/test-00000-of-00001.parquet
|
|
329
|
+
"$EVALUATOR" packages/code-intel/evals/repair_worker.py prepare-pack --dataset "$DATASET" --pack "$PACK"
|
|
330
|
+
.venv/bin/python packages/code-intel/evals/study.py freeze --mode repair --model claude-sonnet-5-5 --trials 2 --benchmark-pack "$PACK" --evaluator-python "$EVALUATOR" --study "$STUDY"
|
|
331
|
+
PYTHONPATH="$STUDY/engine" .venv/bin/python "$STUDY/harness/study.py" prepare --study "$STUDY"
|
|
332
|
+
PYTHONPATH="$STUDY/engine" .venv/bin/python "$STUDY/harness/study.py" wiring --offline --study "$STUDY"
|
|
333
|
+
PYTHONPATH="$STUDY/engine" .venv/bin/python "$STUDY/harness/study.py" summary --study "$STUDY"
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Preparation downloads task images and build wheels before offline tests,
|
|
337
|
+
uses deterministic SHA-256 repository/task order, preserves exclusions,
|
|
338
|
+
and requires image-only and mounted-source base/gold controls plus rejection
|
|
339
|
+
of a synthetic regression. The strict grader requires every F2P and P2P
|
|
340
|
+
ID to be observed PASSED and an actual zero test-command exit status.
|
|
341
|
+
Missing, skipped, timed-out and unexecuted tests cannot pass. No regression
|
|
342
|
+
cap is applied. Candidate changes to official test paths are restored
|
|
343
|
+
before the immutable official patch. Submitted patches and logs remain
|
|
344
|
+
available; stale cached verdicts are rejected.
|
|
345
|
+
|
|
346
|
+
`prepare` validates the controls with the frozen harness. Exact-input
|
|
347
|
+
cache reuse requires matching task, image, patch, source, evaluator and
|
|
348
|
+
worker/grader hashes; drift is rejected. `wiring --offline`
|
|
349
|
+
checks Docker command execution, the actual seven MCP tools and visibility
|
|
350
|
+
of a container edit through inspection. It records `model_wiring: pending`.
|
|
351
|
+
Scored `run` refuses to call a model until two separate excluded model
|
|
352
|
+
wiring attempts pass. Those checks and the 32 scored runs are **not part of
|
|
353
|
+
the build-and-prepare authorization**. Future execution requires fresh
|
|
354
|
+
subscription-only quota observations, disabled paid usage, at most two
|
|
355
|
+
workers, 50-minute sessions and a $20 cumulative client-estimate soft cap.
|
|
356
|
+
Preserve failed/interrupted attempts; never change frozen inputs to resume.
|
|
357
|
+
|
|
358
|
+
## Bounded Codex repair diagnostic
|
|
359
|
+
|
|
360
|
+
`codex_repair_study.py` is a separate, explicitly authorized six-request
|
|
361
|
+
diagnostic: two excluded wiring checks, then four repairs on the first two
|
|
362
|
+
prepared R7 tasks with native/optional lean arms. It leaves Claude R7 frozen.
|
|
363
|
+
Read the [design](designs/2026-10-13-codex-repair-diagnostic.md) before use.
|
|
364
|
+
Freeze to a new external directory, then run the frozen harness's `prepare`,
|
|
365
|
+
`wiring --index 0/1` and `repair --index 0/1/2/3` actions individually.
|
|
366
|
+
Both wiring traces require a clear operator `review.json` before repairs.
|
|
367
|
+
Preserve all attempts; no retries or replacement tasks.
|
|
368
|
+
|
|
369
|
+
It reuses ChatGPT login in a private disposable client home, suppresses
|
|
370
|
+
personal guidance/features per invocation, verifies instruction sources
|
|
371
|
+
without a model turn, and pins `gpt-6.1-sol` at high reasoning. It checks fresh
|
|
372
|
+
included quota before every request and stops if the observed credit balance
|
|
373
|
+
decreases. This is an observational spending guard, not a provider-enforced
|
|
374
|
+
credit prohibition. Strict independent grading is shared with R7; all shell
|
|
375
|
+
commands and file edits still require review. Token usage is reported without
|
|
376
|
+
an invented USD estimate. Four development repairs cannot establish an
|
|
377
|
+
intelligence benefit or support a comparison between models.
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
"""Six-request subscription diagnostic, separate from the frozen Claude R7 study.
|
|
2
|
+
|
|
3
|
+
Two excluded wiring requests precede four exploratory repairs. No quality gate or
|
|
4
|
+
cross-model comparison. Global guidance is suppressed per invocation, never edited.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import argparse
|
|
9
|
+
import asyncio
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import selectors
|
|
13
|
+
import shutil
|
|
14
|
+
import subprocess
|
|
15
|
+
import sys
|
|
16
|
+
import time
|
|
17
|
+
import uuid
|
|
18
|
+
from decimal import Decimal
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from external_benchmarks import (
|
|
22
|
+
copy_source,
|
|
23
|
+
initialize_git,
|
|
24
|
+
shell,
|
|
25
|
+
start_runtime,
|
|
26
|
+
stop_runtime,
|
|
27
|
+
submitted_patch,
|
|
28
|
+
)
|
|
29
|
+
from repair_grading import digest, file_hash, source_digest, write_json
|
|
30
|
+
from repair_study import PROMPT, SERVER_ENV, grade_task
|
|
31
|
+
from study import harness_hash, source_hash, tree_hash
|
|
32
|
+
from study_clients import command, subscription_env, toml_literal
|
|
33
|
+
from study_events import capture, parse_events
|
|
34
|
+
|
|
35
|
+
HERE = Path(__file__).resolve().parent
|
|
36
|
+
MODEL = "gpt-6.1-sol"
|
|
37
|
+
LANES = ("native", "lean_optional")
|
|
38
|
+
FEATURES = ("hooks", "memories", "apps", "plugins", "goals", "multi_agent")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def client_env(home=None):
|
|
42
|
+
env = subscription_env()
|
|
43
|
+
if home is not None:
|
|
44
|
+
env["CODEX_HOME"] = str(home)
|
|
45
|
+
return env
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def settings(guidance="", skills=()):
|
|
49
|
+
return {"project_doc_max_bytes": 0, "model_reasoning_effort": "high",
|
|
50
|
+
"forced_login_method": "chatgpt", "approval_policy": "never", "web_search": "disabled",
|
|
51
|
+
"developer_instructions": guidance, "mcp_servers": {},
|
|
52
|
+
**{"features." + feature: False for feature in FEATURES},
|
|
53
|
+
"skills.config": [{"path": p, "enabled": False} for p in skills]}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class Rpc:
|
|
57
|
+
"""Model-free account and instruction-source checks, using the installed API."""
|
|
58
|
+
|
|
59
|
+
def __init__(self, config, home=None):
|
|
60
|
+
argv = ["codex", "app-server", "--stdio"]
|
|
61
|
+
for key, value in config.items():
|
|
62
|
+
argv += ["-c", key + "=" + toml_literal(value)]
|
|
63
|
+
self.process = subprocess.Popen(argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
|
64
|
+
stderr=subprocess.DEVNULL, env=client_env(home))
|
|
65
|
+
self.selector = selectors.DefaultSelector()
|
|
66
|
+
self.selector.register(self.process.stdout, selectors.EVENT_READ)
|
|
67
|
+
self.pending, self.identity = b"", 0
|
|
68
|
+
|
|
69
|
+
def request(self, method, params=None):
|
|
70
|
+
self.identity += 1
|
|
71
|
+
row = {"id": self.identity, "method": method}
|
|
72
|
+
if params is not None:
|
|
73
|
+
row["params"] = params
|
|
74
|
+
self.process.stdin.write((json.dumps(row) + "\n").encode())
|
|
75
|
+
self.process.stdin.flush()
|
|
76
|
+
end = time.monotonic() + 45
|
|
77
|
+
while time.monotonic() < end:
|
|
78
|
+
while b"\n" in self.pending:
|
|
79
|
+
line, self.pending = self.pending.split(b"\n", 1)
|
|
80
|
+
response = json.loads(line)
|
|
81
|
+
if response.get("id") == self.identity:
|
|
82
|
+
if "error" in response:
|
|
83
|
+
raise ValueError(response["error"])
|
|
84
|
+
return response["result"]
|
|
85
|
+
if not self.selector.select(max(0, end - time.monotonic())):
|
|
86
|
+
break
|
|
87
|
+
chunk = os.read(self.process.stdout.fileno(), 65536)
|
|
88
|
+
if not chunk:
|
|
89
|
+
raise RuntimeError("Account/instruction reader exited")
|
|
90
|
+
self.pending += chunk
|
|
91
|
+
raise TimeoutError("Account/instruction read timed out")
|
|
92
|
+
|
|
93
|
+
def __enter__(self):
|
|
94
|
+
self.request("initialize", {"clientInfo": {"name": "attocode_codex_diagnostic", "version": "0.1.0"},
|
|
95
|
+
"capabilities": {"experimentalApi": True}})
|
|
96
|
+
self.process.stdin.write(b'{"method":"initialized","params":{}}\n')
|
|
97
|
+
self.process.stdin.flush()
|
|
98
|
+
return self
|
|
99
|
+
|
|
100
|
+
def __exit__(self, *_):
|
|
101
|
+
self.selector.close()
|
|
102
|
+
self.process.terminate()
|
|
103
|
+
try:
|
|
104
|
+
self.process.wait(timeout=5)
|
|
105
|
+
except subprocess.TimeoutExpired:
|
|
106
|
+
self.process.kill()
|
|
107
|
+
self.process.wait()
|
|
108
|
+
self.process.stdin.close()
|
|
109
|
+
self.process.stdout.close()
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def quota_check(previous=None, home=None):
|
|
113
|
+
with Rpc(settings(), home) as rpc:
|
|
114
|
+
account = rpc.request("account/read", {"refreshToken": False}).get("account") or {}
|
|
115
|
+
limits = rpc.request("account/rateLimits/read")
|
|
116
|
+
limits.pop("accountId", None)
|
|
117
|
+
record = {"checked_at": time.time(), "account": {k: account.get(k) for k in ("type", "planType")},
|
|
118
|
+
"limits": limits, "model_requests": 0}
|
|
119
|
+
validate_quota(record, previous)
|
|
120
|
+
return record
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def validate_quota(record, previous=None):
|
|
124
|
+
limits = record["limits"]
|
|
125
|
+
current = limits.get("rateLimits") or {}
|
|
126
|
+
windows = [current.get(k) for k in ("primary", "secondary") if current.get(k) is not None]
|
|
127
|
+
if (record["account"].get("type") != "chatgpt" or limits.get("ordinaryUsageAllowed") is not True
|
|
128
|
+
or current.get("spendControlReached") or not windows
|
|
129
|
+
or not 0 <= time.time() - record["checked_at"] <= 60
|
|
130
|
+
or any(not isinstance(w.get("usedPercent"), (int, float)) or not 0 <= w["usedPercent"] < 20
|
|
131
|
+
for w in windows)):
|
|
132
|
+
raise ValueError("Fresh included quota below the conservative 20% usage ceiling required")
|
|
133
|
+
balance = (current.get("credits") or {}).get("balance")
|
|
134
|
+
if previous is not None:
|
|
135
|
+
before = ((previous["limits"].get("rateLimits") or {}).get("credits") or {}).get("balance")
|
|
136
|
+
if balance is None or before is None or Decimal(balance) < Decimal(before):
|
|
137
|
+
raise ValueError("Credit balance decreased or unavailable; stop further model requests")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def isolation(root, config, home=None):
|
|
141
|
+
with Rpc(config, home) as rpc:
|
|
142
|
+
result = rpc.request("thread/start", {"cwd": str(root), "model": MODEL, "ephemeral": True,
|
|
143
|
+
"sandbox": "workspace-write", "config": config})
|
|
144
|
+
if result.get("instructionSources") != [] or result.get("model") != MODEL:
|
|
145
|
+
raise ValueError("Inherited instructions or wrong model in model-free thread check")
|
|
146
|
+
return {k: result.get(k) for k in ("instructionSources", "model", "reasoningEffort", "serviceTier")}
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def freeze(study, parent):
|
|
150
|
+
if study.exists():
|
|
151
|
+
raise ValueError("Never overwrite a diagnostic")
|
|
152
|
+
old = json.loads((parent / "manifest.json").read_text())
|
|
153
|
+
original = dict(old)
|
|
154
|
+
if digest({k: v for k, v in old.items() if k != "study_id"}) != old["study_id"]:
|
|
155
|
+
raise ValueError("Parent manifest drift")
|
|
156
|
+
if not json.loads((parent / "preparation.json").read_text()).get("passed"):
|
|
157
|
+
raise ValueError("Parent controls must pass")
|
|
158
|
+
tasks = old["tasks"][:2]
|
|
159
|
+
study.mkdir(parents=True, mode=0o700)
|
|
160
|
+
home = study / "client-home"
|
|
161
|
+
home.mkdir(mode=0o700)
|
|
162
|
+
# Link only the existing login in private harness state. Never copy secrets or
|
|
163
|
+
# replace the real home. No private harness directory is mounted in Docker.
|
|
164
|
+
(home / "auth.json").symlink_to(Path.home() / ".codex/auth.json")
|
|
165
|
+
shutil.copytree(parent / "engine", study / "engine")
|
|
166
|
+
shutil.copytree(HERE, study / "harness", ignore=shutil.ignore_patterns("__pycache__", "*.pyc"))
|
|
167
|
+
for task in tasks:
|
|
168
|
+
if source_digest(parent / "sources" / task["id"]) != old["source_hashes"][task["id"]]:
|
|
169
|
+
raise ValueError("Prepared source changed")
|
|
170
|
+
copy_source(parent / "sources" / task["id"], study / "sources" / task["id"])
|
|
171
|
+
initialize_git(study / "sources" / task["id"])
|
|
172
|
+
source = parent / "private" / task["task_file"]
|
|
173
|
+
if file_hash(source) != task["task_sha256"]:
|
|
174
|
+
raise ValueError("Private task changed")
|
|
175
|
+
target = study / "private" / task["task_file"]
|
|
176
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
177
|
+
shutil.copyfile(source, target)
|
|
178
|
+
shutil.copytree(parent / "controls" / task["id"], study / "controls" / task["id"])
|
|
179
|
+
skills = sorted({str(p.parent) for folder in (Path.home() / ".codex/skills", Path.home() / ".agents/skills")
|
|
180
|
+
for p in folder.rglob("SKILL.md")})
|
|
181
|
+
from attocode_intel.catalog import profile_instructions
|
|
182
|
+
socket = shell(["docker", "context", "inspect", "--format", "{{.Endpoints.docker.Host}}"])
|
|
183
|
+
if not socket.strip().startswith("unix://"):
|
|
184
|
+
raise ValueError("Local Unix Docker socket required")
|
|
185
|
+
manifest = {"kind": "codex-repair-diagnostic", "model": MODEL, "reasoning": "high", "tasks": tasks,
|
|
186
|
+
"python": old["python"], "evaluator_python": old["evaluator_python"], "evaluator": old["evaluator"],
|
|
187
|
+
"parent_study_id": old["study_id"], "client_version": shell(["codex", "--version"]).strip(),
|
|
188
|
+
"engine_sha256": source_hash(study / "engine"), "harness_sha256": harness_hash(study / "harness"),
|
|
189
|
+
"pack_sha256": tree_hash(study / "private"), "server_env": SERVER_ENV, "prompt": PROMPT,
|
|
190
|
+
"source_hashes": {t["id"]: source_digest(study / "sources" / t["id"]) for t in tasks},
|
|
191
|
+
"runtime_socket": socket.strip()[7:], "skills": skills, "guidance": profile_instructions("lean"),
|
|
192
|
+
"schedule": [{"id": t["id"] + "-" + lane, "task": t["id"], "lane": lane}
|
|
193
|
+
for i, t in enumerate(tasks) for lane in (LANES if i == 0 else LANES[::-1])],
|
|
194
|
+
"limits": {"model_requests": 6, "timeout": 600, "session_minutes": 50,
|
|
195
|
+
"included_usage_ceiling_percent": 20},
|
|
196
|
+
"scope": "Two development tasks, four repairs, exploratory only. Host trace audit; no OS private-input isolation.",
|
|
197
|
+
"adaptation": "Private disposable CODEX_HOME links existing login only; no inherited AGENTS or personal skills. Optional lean routing via explicit developer instructions."}
|
|
198
|
+
manifest["study_id"] = digest(manifest)
|
|
199
|
+
write_json(study / "manifest.json", manifest)
|
|
200
|
+
if original != json.loads((parent / "manifest.json").read_text()):
|
|
201
|
+
raise ValueError("Parent changed during freeze")
|
|
202
|
+
print(json.dumps({"study_id": manifest["study_id"], "scheduled": 4, "wiring": 2}), flush=True)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def load(study):
|
|
206
|
+
manifest = json.loads((study / "manifest.json").read_text())
|
|
207
|
+
if digest({k: v for k, v in manifest.items() if k != "study_id"}) != manifest["study_id"]:
|
|
208
|
+
raise ValueError("Diagnostic manifest drift")
|
|
209
|
+
checks = [(harness_hash(HERE), manifest["harness_sha256"]),
|
|
210
|
+
(source_hash(study / "engine"), manifest["engine_sha256"]),
|
|
211
|
+
(tree_hash(study / "private"), manifest["pack_sha256"]),
|
|
212
|
+
(shell(["codex", "--version"]).strip(), manifest["client_version"])]
|
|
213
|
+
checks += [(source_digest(study / "sources" / t["id"]), manifest["source_hashes"][t["id"]])
|
|
214
|
+
for t in manifest["tasks"]]
|
|
215
|
+
if any(a != b for a, b in checks):
|
|
216
|
+
raise ValueError("Frozen diagnostic inputs changed")
|
|
217
|
+
return manifest
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def prepare(study):
|
|
221
|
+
manifest = load(study)
|
|
222
|
+
from repair_study import worker
|
|
223
|
+
from repair_worker import preparation_control
|
|
224
|
+
if worker(manifest["evaluator_python"], "identity", capture=True) != manifest["evaluator"]:
|
|
225
|
+
raise ValueError("Evaluator environment drift")
|
|
226
|
+
for task in manifest["tasks"]:
|
|
227
|
+
raw = json.loads((study / "private" / task["task_file"]).read_text())
|
|
228
|
+
for prefix, source in (("", None), ("mounted-", study / "sources" / task["id"])):
|
|
229
|
+
records = [grade_task(study, manifest, task, patch,
|
|
230
|
+
study / "controls" / task["id"] / (prefix + label), source=source)
|
|
231
|
+
for label, patch in (("base", ""), ("gold", raw["patch"]))]
|
|
232
|
+
if not preparation_control(*records, raw):
|
|
233
|
+
raise ValueError("Base/gold controls failed")
|
|
234
|
+
print(json.dumps({"control": task["id"], "passed": True}), flush=True)
|
|
235
|
+
write_json(study / "preparation.json", {"study_id": manifest["study_id"], "passed": True})
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def servers_for(study, manifest, root, stage, lane):
|
|
239
|
+
if lane == "native":
|
|
240
|
+
return {}
|
|
241
|
+
return {"attocode-code-intel": {"command": manifest["python"],
|
|
242
|
+
"args": ["-m", "attocode_intel.entrypoint", "--project", str(root), "--profile", "lean"],
|
|
243
|
+
"env": {**manifest["server_env"], "PYTHONPATH": str(study / "engine"),
|
|
244
|
+
"ATTOCODE_INTEL_TRACE": str(stage / "engine.jsonl")}}}
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
async def transport(servers):
|
|
248
|
+
from mcp import ClientSession, StdioServerParameters
|
|
249
|
+
from mcp.client.stdio import stdio_client
|
|
250
|
+
async with (stdio_client(StdioServerParameters(**servers["attocode-code-intel"])) as (read, write),
|
|
251
|
+
ClientSession(read, write) as session):
|
|
252
|
+
await session.initialize()
|
|
253
|
+
names = sorted(t.name for t in (await session.list_tools()).tools)
|
|
254
|
+
if set(names) != {"bootstrap", "search_symbols", "inspect_symbol", "semantic_search",
|
|
255
|
+
"impact_analysis", "suggest_tests", "capabilities"}:
|
|
256
|
+
raise ValueError("Wrong treatment tool list")
|
|
257
|
+
result = await session.call_tool("inspect_symbol", {"symbol_name": "repair_fixture"})
|
|
258
|
+
if result.isError or "return 1" not in result.content[0].text:
|
|
259
|
+
raise ValueError("Treatment inspection unavailable")
|
|
260
|
+
return {"tools": names, "answered_inspection": True, "model_requests": 0}
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def audit(root, parsed, helper_hash):
|
|
264
|
+
violations = []
|
|
265
|
+
if file_hash(root / ".benchmark/run.py") != helper_hash:
|
|
266
|
+
violations.append("Runtime helper changed")
|
|
267
|
+
for call in parsed["tool_calls"]:
|
|
268
|
+
for key in ("workspace", "path", "file_path", "files", "changed_files"):
|
|
269
|
+
value = (call.get("arguments") or {}).get(key)
|
|
270
|
+
for item in value if isinstance(value, list) else [value]:
|
|
271
|
+
if isinstance(item, str) and not (root / item).resolve().is_relative_to(root.resolve()):
|
|
272
|
+
violations.append("Tool path outside public workspace: " + item)
|
|
273
|
+
# All shell commands and file_change events require an operator read before acceptance.
|
|
274
|
+
return {"status": "violation" if violations else "needs_review", "violations": violations,
|
|
275
|
+
"shell_commands": [c for c in parsed["tool_calls"] if c["name"] == "shell"],
|
|
276
|
+
"os_private_input_isolation": False}
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def argv_for(manifest, root, stage, servers, prompt, lane):
|
|
280
|
+
argv = command("codex", MODEL, root, stage, servers, prompt, plain_text=True,
|
|
281
|
+
runtime_socket=manifest["runtime_socket"])
|
|
282
|
+
config = settings(manifest["guidance"] if lane != "native" else "", manifest["skills"])
|
|
283
|
+
config.pop("mcp_servers")
|
|
284
|
+
for key, value in config.items():
|
|
285
|
+
argv[-1:-1] = ["-c", key + "=" + toml_literal(value)]
|
|
286
|
+
return argv, config
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def trial(study, manifest, task, row, *, wiring=False):
|
|
290
|
+
directory = study / ("wiring" if wiring else "runs") / row["id"]
|
|
291
|
+
directory.mkdir(parents=True, exist_ok=False)
|
|
292
|
+
root, stage = directory / "repository", directory / "stage-0"
|
|
293
|
+
stage.mkdir()
|
|
294
|
+
if wiring:
|
|
295
|
+
root.mkdir()
|
|
296
|
+
(root / "fixture.py").write_text("def repair_fixture(): return 1\n")
|
|
297
|
+
(root / "wiring_value.py").write_text("VALUE = 1\n")
|
|
298
|
+
else:
|
|
299
|
+
copy_source(study / "sources" / task["id"], root)
|
|
300
|
+
initialize_git(root)
|
|
301
|
+
name = "attocode-codex-diagnostic-" + uuid.uuid4().hex[:10]
|
|
302
|
+
result = {**row, "study_id": manifest["study_id"], "excluded": wiring, "status": "infrastructure_error"}
|
|
303
|
+
started = time.monotonic()
|
|
304
|
+
try:
|
|
305
|
+
start_runtime(task, root, name)
|
|
306
|
+
helper_hash = file_hash(root / ".benchmark/run.py")
|
|
307
|
+
environment = ("Run repository programs and tests with `python3 .benchmark/run.py -- <command> <args...>`. "
|
|
308
|
+
"Read and edit the current workspace. Do not inspect other host directories, Docker resources, "
|
|
309
|
+
"benchmark inputs or online solutions. Do not delegate or edit .benchmark infrastructure.\n\n")
|
|
310
|
+
prompt = environment + manifest["prompt"].format(problem_statement=task["prompt"])
|
|
311
|
+
servers = servers_for(study, manifest, root, stage, row["lane"])
|
|
312
|
+
if wiring:
|
|
313
|
+
if servers:
|
|
314
|
+
result["transport"] = asyncio.run(transport(servers))
|
|
315
|
+
prompt = (environment + "Excluded wiring check. Change wiring_value.py to VALUE = 2. "
|
|
316
|
+
"Run `python3 .benchmark/run.py -- python -c 'from wiring_value import VALUE; assert VALUE == 2'`. "
|
|
317
|
+
+ ("Call inspect_symbol on repair_fixture too. " if servers else "") + "Report the result.")
|
|
318
|
+
elif servers:
|
|
319
|
+
from localize_study import warm
|
|
320
|
+
result["warm"] = warm(study, root, directory / "warm", manifest)
|
|
321
|
+
if not result["warm"]["ready"]:
|
|
322
|
+
raise ValueError("Treatment warm-up failed")
|
|
323
|
+
argv, config = argv_for(manifest, root, stage, servers, prompt, row["lane"])
|
|
324
|
+
# No servers in the model-free isolation probe; the exec argv contains only frozen treatment servers.
|
|
325
|
+
home = study / "client-home"
|
|
326
|
+
result["instruction_check"] = isolation(root, {**config, "mcp_servers": {}}, home)
|
|
327
|
+
previous_path = study / "last-quota.json"
|
|
328
|
+
previous = json.loads(previous_path.read_text()) if previous_path.exists() else None
|
|
329
|
+
before = quota_check(previous, home)
|
|
330
|
+
write_json(directory / "quota-before.json", before)
|
|
331
|
+
write_json(previous_path, before)
|
|
332
|
+
result["setup_seconds"] = time.monotonic() - started
|
|
333
|
+
write_json(directory / "started.json", {"time": time.time(), "study_id": manifest["study_id"]})
|
|
334
|
+
execution = capture(argv, root, stage, 600, client_env(home))
|
|
335
|
+
parsed = parse_events("codex", (stage / "events.jsonl").read_text())
|
|
336
|
+
result.update(execution=execution, usage=parsed["usage"], tool_calls=parsed["tool_calls"],
|
|
337
|
+
protocol=audit(root, parsed, helper_hash), cost_usd=None)
|
|
338
|
+
result["substantive_adoption"] = any(
|
|
339
|
+
c["name"].startswith("mcp__") and not c["name"].endswith("__capabilities")
|
|
340
|
+
and any(o["id"] == c["id"] and not o["is_error"] for o in parsed["tool_results"])
|
|
341
|
+
for c in parsed["tool_calls"])
|
|
342
|
+
result["status"] = ("failed" if any(execution.get(k) for k in ("exit_code", "timed_out", "quota_exhausted"))
|
|
343
|
+
or parsed["terminal_error"] else "completed")
|
|
344
|
+
patch, changed = submitted_patch(root)
|
|
345
|
+
(directory / "submission.patch").write_text(patch)
|
|
346
|
+
result.update(changed_files=changed, patch_sha256=digest(patch))
|
|
347
|
+
if wiring:
|
|
348
|
+
check = shell([sys.executable, ".benchmark/run.py", "--", "python", "-c",
|
|
349
|
+
"from wiring_value import VALUE; assert VALUE == 2; print('ok')"], cwd=root)
|
|
350
|
+
result["runtime_assertion"] = check.strip().endswith("ok")
|
|
351
|
+
result["passed_pending_review"] = (result["runtime_assertion"] and result["status"] == "completed"
|
|
352
|
+
and (not servers or result["substantive_adoption"]))
|
|
353
|
+
else:
|
|
354
|
+
result["grade"] = grade_task(study, manifest, task, patch, directory / "grade")
|
|
355
|
+
after = quota_check(before, home)
|
|
356
|
+
write_json(directory / "quota-after.json", after)
|
|
357
|
+
write_json(previous_path, after)
|
|
358
|
+
except Exception as exc:
|
|
359
|
+
result["error"] = f"{type(exc).__name__}: {exc}"
|
|
360
|
+
finally:
|
|
361
|
+
stop_runtime(name)
|
|
362
|
+
result["end_to_end_seconds"] = time.monotonic() - started
|
|
363
|
+
write_json(directory / "result.json", result)
|
|
364
|
+
print(json.dumps({k: result.get(k) for k in ("id", "status", "error", "usage", "substantive_adoption",
|
|
365
|
+
"runtime_assertion", "end_to_end_seconds")}), flush=True)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def run_one(study, kind, index):
|
|
369
|
+
manifest = load(study)
|
|
370
|
+
prep_path = study / "preparation.json"
|
|
371
|
+
prep = json.loads(prep_path.read_text()) if prep_path.exists() else {}
|
|
372
|
+
if not prep.get("passed") or prep.get("study_id") != manifest["study_id"]:
|
|
373
|
+
raise ValueError("Validated independent base/gold controls required")
|
|
374
|
+
if kind == "wiring":
|
|
375
|
+
if index not in (0, 1):
|
|
376
|
+
raise ValueError("Exactly two excluded wiring slots")
|
|
377
|
+
row = {"id": "excluded-" + LANES[index], "lane": LANES[index]}
|
|
378
|
+
else:
|
|
379
|
+
if index not in range(4):
|
|
380
|
+
raise ValueError("Exactly four repair slots")
|
|
381
|
+
for lane in LANES:
|
|
382
|
+
path = study / "wiring" / ("excluded-" + lane) / "review.json"
|
|
383
|
+
review = json.loads(path.read_text()) if path.exists() else {}
|
|
384
|
+
result_path = path.parent / "result.json"
|
|
385
|
+
result = json.loads(result_path.read_text()) if result_path.exists() else {}
|
|
386
|
+
if (review.get("study_id") != manifest["study_id"] or review.get("status") != "clear"
|
|
387
|
+
or not result.get("passed_pending_review") or result.get("error")):
|
|
388
|
+
raise ValueError("Both wiring attempts must pass and receive trace review before repairs")
|
|
389
|
+
row = manifest["schedule"][index]
|
|
390
|
+
paths = list(study.glob("wiring/*/started.json")) + list(study.glob("runs/*/started.json"))
|
|
391
|
+
if len(paths) >= 6:
|
|
392
|
+
raise ValueError("Six-request ceiling reached")
|
|
393
|
+
trial(study, manifest, next((t for t in manifest["tasks"] if t["id"] == row.get("task")),
|
|
394
|
+
manifest["tasks"][0]), row, wiring=kind == "wiring")
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
def main():
|
|
398
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
399
|
+
parser.add_argument("action", choices=("freeze", "prepare", "wiring", "repair", "quota"))
|
|
400
|
+
parser.add_argument("--study", type=Path)
|
|
401
|
+
parser.add_argument("--parent", type=Path)
|
|
402
|
+
parser.add_argument("--index", type=int, default=0)
|
|
403
|
+
args = parser.parse_args()
|
|
404
|
+
if args.action == "freeze":
|
|
405
|
+
freeze(args.study, args.parent)
|
|
406
|
+
elif args.action == "quota":
|
|
407
|
+
print(json.dumps(quota_check()))
|
|
408
|
+
elif args.action == "prepare":
|
|
409
|
+
prepare(args.study)
|
|
410
|
+
else:
|
|
411
|
+
run_one(args.study, args.action, args.index)
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
if __name__ == "__main__":
|
|
415
|
+
main()
|