sourcecode 5.8.12__tar.gz → 5.8.13__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.
Potentially problematic release.
This version of sourcecode might be problematic. Click here for more details.
- {sourcecode-5.8.12 → sourcecode-5.8.13}/CHANGELOG.md +15 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/PKG-INFO +9 -11
- {sourcecode-5.8.12 → sourcecode-5.8.13}/README.md +8 -10
- {sourcecode-5.8.12 → sourcecode-5.8.13}/SECURITY.md +3 -1
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/DEFECT-LEDGER.md +3 -2
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/DEVELOPMENT-ROADMAP.md +8 -3
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/EXECUTIVE-ROADMAP.md +10 -2
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/MANUAL-USUARIO.md +6 -3
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/USER_GUIDE.md +3 -3
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/privacy.md +19 -16
- {sourcecode-5.8.12 → sourcecode-5.8.13}/pyproject.toml +1 -1
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/__init__.py +1 -1
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/cli.py +59 -56
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/runner.py +6 -1
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/server.py +3 -4
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/release_info.py +1 -1
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/telemetry/__init__.py +5 -4
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/telemetry/config.py +14 -19
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/telemetry/consent.py +11 -15
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/telemetry/events.py +3 -1
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/telemetry/filters.py +10 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/supabase/functions/README.md +4 -2
- sourcecode-5.8.13/supabase/functions/telemetry/index.ts +127 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/supabase/sql/telemetry_events.sql +36 -1
- sourcecode-5.8.12/supabase/functions/telemetry/index.ts +0 -72
- {sourcecode-5.8.12 → sourcecode-5.8.13}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/.gitignore +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/.ruff.toml +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/CLAUDE.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/CONTRIBUTING.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/LICENSE +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/NOTICE +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/CACHE.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/COMMERCIAL-OFFER.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/EXECUTION-PLAN-12MO.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/PRODUCT_TIERS.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/overview.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/contracts.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/licensing-schema.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/migrate-check.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/README.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/REGRESSION-GATE.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/posture.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/schema.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/scripts/perf_gate.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/scripts/perf_harness.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/answer_bounds.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/audit_clusters.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/audit_recipe.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/audit_since.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/breaking_changes.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/build_modules.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/empty_reach.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/endpoint_disposition.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/envelope.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/explain_endpoint.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/field_deprecations.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/functional_routes.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/license.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/manifest_cache.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/output_bounds.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/output_ceiling.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/output_sink.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/perf.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/product_info.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/readonly.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/regress.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/remediation_diff.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/risk.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/risk_model.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schema_producers.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schema_registry.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/selftest.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/timeline_cache.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.8.12 → sourcecode-5.8.13}/supabase/sql/licensing_schema.sql +0 -0
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.8.13] — 2026-08-20
|
|
4
|
+
|
|
5
|
+
*MCP reliability release after deep multi-repository stress testing.*
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- Concurrent MCP tool calls can no longer leak one invocation's CLI JSON to the
|
|
9
|
+
MCP host process. The in-process `CliRunner` invocation is serialized because
|
|
10
|
+
its stdout/stderr capture is process-global; each caller now receives only its
|
|
11
|
+
own response envelope.
|
|
12
|
+
|
|
13
|
+
### Verified
|
|
14
|
+
- The MCP regression suite passes, including a concurrent-runner regression and
|
|
15
|
+
live concurrent calls to `endpoints`, `validation` and `version` against the
|
|
16
|
+
testing corpus.
|
|
17
|
+
|
|
3
18
|
## [5.8.12] — 2026-08-19
|
|
4
19
|
|
|
5
20
|
*Performance-mitigation and release-hygiene update. The external cross-version
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.8.
|
|
3
|
+
Version: 5.8.13
|
|
4
4
|
Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/HarounDominique/sourcecode
|
|
6
6
|
Project-URL: Repository, https://github.com/HarounDominique/sourcecode
|
|
@@ -49,7 +49,7 @@ Description-Content-Type: text/markdown
|
|
|
49
49
|
|
|
50
50
|
**Context · Impact · Migration · Architecture · Review — everything from one structural model.**
|
|
51
51
|
|
|
52
|
-

|
|
53
53
|

|
|
54
54
|
|
|
55
55
|
Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
|
|
@@ -151,7 +151,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
151
151
|
# pip / pipx
|
|
152
152
|
pipx install sourcecode # or: pip install sourcecode
|
|
153
153
|
|
|
154
|
-
ask version # ask 5.8.
|
|
154
|
+
ask version # ask 5.8.13 — and, on a build that has aged,
|
|
155
155
|
# how many releases have probably shipped since
|
|
156
156
|
```
|
|
157
157
|
|
|
@@ -580,18 +580,16 @@ ask config # version, config file path, telemetry status
|
|
|
580
580
|
ask config /repo # + the repository's own sourcecode.config.json:
|
|
581
581
|
# data labels, custom security annotations,
|
|
582
582
|
# and any declaration that could not be used
|
|
583
|
-
ask telemetry enable # anonymous telemetry is
|
|
583
|
+
ask telemetry enable # ensure anonymous telemetry is enabled
|
|
584
584
|
```
|
|
585
585
|
|
|
586
|
-
**
|
|
587
|
-
|
|
588
|
-
range, and errors: **no source code, paths, secrets, or output**. Turn it off again with
|
|
586
|
+
**Anonymous telemetry is ON by default**. It collects version, OS, commands, flags, duration,
|
|
587
|
+
repo-size range, and errors: **no source code, paths, secrets, or output**. Turn it off with
|
|
589
588
|
`ask telemetry disable`, `export SOURCECODE_TELEMETRY=0`, or `DO_NOT_TRACK=1`.
|
|
590
589
|
|
|
591
|
-
> **Auditing someone else's code — regulated, client-owned or public-sector?**
|
|
592
|
-
>
|
|
593
|
-
>
|
|
594
|
-
> choice you made before is unchanged.
|
|
590
|
+
> **Auditing someone else's code — regulated, client-owned or public-sector?** Set
|
|
591
|
+
> `SOURCECODE_TELEMETRY=0` before the run. The setting is explicit, local and honored before
|
|
592
|
+
> any event is sent.
|
|
595
593
|
|
|
596
594
|
**A question is not a write — `--no-write` / `ASK_READONLY=1`.** One contract over
|
|
597
595
|
every command: nothing is created inside the analysed repository, and a command
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Context · Impact · Migration · Architecture · Review — everything from one structural model.**
|
|
6
6
|
|
|
7
|
-

|
|
8
8
|

|
|
9
9
|
|
|
10
10
|
Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
|
|
@@ -106,7 +106,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
106
106
|
# pip / pipx
|
|
107
107
|
pipx install sourcecode # or: pip install sourcecode
|
|
108
108
|
|
|
109
|
-
ask version # ask 5.8.
|
|
109
|
+
ask version # ask 5.8.13 — and, on a build that has aged,
|
|
110
110
|
# how many releases have probably shipped since
|
|
111
111
|
```
|
|
112
112
|
|
|
@@ -535,18 +535,16 @@ ask config # version, config file path, telemetry status
|
|
|
535
535
|
ask config /repo # + the repository's own sourcecode.config.json:
|
|
536
536
|
# data labels, custom security annotations,
|
|
537
537
|
# and any declaration that could not be used
|
|
538
|
-
ask telemetry enable # anonymous telemetry is
|
|
538
|
+
ask telemetry enable # ensure anonymous telemetry is enabled
|
|
539
539
|
```
|
|
540
540
|
|
|
541
|
-
**
|
|
542
|
-
|
|
543
|
-
range, and errors: **no source code, paths, secrets, or output**. Turn it off again with
|
|
541
|
+
**Anonymous telemetry is ON by default**. It collects version, OS, commands, flags, duration,
|
|
542
|
+
repo-size range, and errors: **no source code, paths, secrets, or output**. Turn it off with
|
|
544
543
|
`ask telemetry disable`, `export SOURCECODE_TELEMETRY=0`, or `DO_NOT_TRACK=1`.
|
|
545
544
|
|
|
546
|
-
> **Auditing someone else's code — regulated, client-owned or public-sector?**
|
|
547
|
-
>
|
|
548
|
-
>
|
|
549
|
-
> choice you made before is unchanged.
|
|
545
|
+
> **Auditing someone else's code — regulated, client-owned or public-sector?** Set
|
|
546
|
+
> `SOURCECODE_TELEMETRY=0` before the run. The setting is explicit, local and honored before
|
|
547
|
+
> any event is sent.
|
|
550
548
|
|
|
551
549
|
**A question is not a write — `--no-write` / `ASK_READONLY=1`.** One contract over
|
|
552
550
|
every command: nothing is created inside the analysed repository, and a command
|
|
@@ -91,4 +91,6 @@ Third-party dependencies (`typer`, `ruamel.yaml`, etc.) could contain vulnerabil
|
|
|
91
91
|
|
|
92
92
|
## Telemetry and privacy
|
|
93
93
|
|
|
94
|
-
Telemetry is **
|
|
94
|
+
Telemetry is **enabled by default** and can be disabled with `ask telemetry disable`,
|
|
95
|
+
`SOURCECODE_TELEMETRY=0`, or `DO_NOT_TRACK=1`. Only bounded anonymous usage metadata is
|
|
96
|
+
collected — never code, paths, or content. See [docs/privacy.md](docs/privacy.md).
|
|
@@ -16,7 +16,7 @@ The facts these rows are keyed to are published: `ask schema facts-v1` prints th
|
|
|
16
16
|
|
|
17
17
|
## Current Synchronization
|
|
18
18
|
|
|
19
|
-
**As of 2026-08-
|
|
19
|
+
**As of 2026-08-20, release `5.8.13` and the external `5.8.11` re-audit:** this is the current status of
|
|
20
20
|
the 5.8.8/5.8.9 audit queue. The subject remained `saint-server` at `3dde0376`, with a
|
|
21
21
|
byte-identical CIR and the same 53/61 invocables exercised. The score is **78/100**
|
|
22
22
|
(75 in 5.8.8, 80 in 5.8.9). The observations below remain historical evidence; only
|
|
@@ -30,6 +30,7 @@ this table declares present state.
|
|
|
30
30
|
| `AUD-588-B05` | **closed** | `c15f5b6`; changed container-wired components block a false `unaffected` disposition. |
|
|
31
31
|
| `AUD-511-R03` / `AUD-588-B07` | **implemented in 5.8.12** | `47aee1e` gives the published `OUTPUT_TOO_LARGE` envelope precedence over an inconsistent process status and preserves the excerpt in every branch. |
|
|
32
32
|
| `AUD-588-B08` | **closed** | `c084555`; `impact` publishes its independent stdout-byte budget. |
|
|
33
|
+
| `MCP-001` | **closed 5.8.13** | Deep corpus testing reproduced concurrent `CliRunner` stream capture leaking a tool response to the host stdout. `b2c9660` serializes the narrow process-global capture seam; concurrent real MCP calls and a regression test verify response isolation. |
|
|
33
34
|
| `AUD-588-B11` (container/units subset) | **partially implemented in 5.8.12** | `d745d31` discovers nested Maven modules; `273ae8e` suppresses unsupported `pr-impact.unaffected_basis`. `impact` naming, source population units, risk tiers and plan narrative remain open. |
|
|
34
35
|
| `AUD-511-R02` / `AUD-589-B02` | **partially mitigated in 5.8.12, still under investigation** | `b93f230` reuses one `SpringSemanticModel` across every declared `data-exposure` seed; `473f47a` routes `validation` through the shared CIR cache, and `91bd0c0` retains subcommand `--no-cache` compatibility. On the local BroadleafCommerce corpus at the final analyzer fingerprint, a first shared-CIR fill took 10.46 s and its warm `validation --compact` hit took 4.01 s with byte-identical output. This is a same-host cache-state observation, not the 5.8.9/5.8.11 external A/B: the six-run C3-120 comparison and the configured `saint-server` reproduction remain required. |
|
|
35
36
|
| `AUD-588-B02`, `B06`, B11 residuals, `B12` | **partially open in 5.8.12** | `3869c87` excludes explicit EclipseLink from Hibernate applicability and effort; `037223e` publishes provider non-coverage. B11 parity and controlled cost calibration remain required. |
|
|
@@ -594,7 +595,7 @@ class's subject, not its provenance.
|
|
|
594
595
|
|
|
595
596
|
| ID | Item | Found | Severity | Status |
|
|
596
597
|
|---|---|---|---|---|
|
|
597
|
-
| P-1 | Telemetry
|
|
598
|
+
| P-1 | Telemetry default and procurement disclosure | 3.2.0 | **High (procurement)** | **reopened and corrected 5.8.12** — telemetry is on by default by explicit product decision, with `ask telemetry disable`, `SOURCECODE_TELEMETRY=0` and `DO_NOT_TRACK=1` honored before any event is sent. The first-run notice discloses the fields and the disable path. `telemetry status` distinguishes the default from an explicit disabled choice; the privacy policy documents the endpoint, 90-day retention and bounded anonymous fields. This supersedes the historical 3.3.0 opt-in closure for the current release |
|
|
598
599
|
| P-2 | Licence state is ambiguous: `auth status` → `{"status":"unauthenticated","pro":true,"pro_reason":"early-adoption unlock"}`. The buyer cannot tell what it will cost or what they lose when the door closes | 3.2.0 | Medium | **closed 3.4.0** — one authority, `license.entitlement()`: `entitlement` (what runs), `source` (why: `license_key` / `early_adoption_unlock` / `free_tier`), `authenticated` (a separate fact — today one can be entitled without a credential), `paywall_active`, and `when_it_changes`, which states what the user loses when that source stops applying, in the terms the gate uses and **never as a price**. `is_pro` — what every gate reads — is now derived from it rather than computed beside it, which is how the status page came to contradict the commands. The legacy keys stay for consumers, are derived from the authority, and are listed in `deprecated_fields` |
|
|
599
600
|
|
|
600
601
|
| P-3 | **The price is not published.** With P-2 closed the entitlement is unambiguous, but a buyer still cannot see what Pro costs or what a team of 25 pays. Eval #5 lists *"precio Pro público"* among the conditions for the top of its price band, beside the robustness fixes | 3.2.1 (eval #5) | Medium (procurement) | open — packaging question, not a page: the field's own reading is that **the value is frontal** (a first audit replaces 5–15 person-days) **and the recurring half is the CI gate**, so a full seat subscription on a product whose value peaks on run one *"genera churn en el mes 4"*. Model to test: one-off assessment **3–5 k€ per repo** + **8–12 €/dev/month** for the gate. Depends on C3-22: without the gate there is nothing recurring to sell |
|
|
@@ -3,13 +3,17 @@
|
|
|
3
3
|
*Chief-engineer development record. This is the internal, dev-facing counterpart to the
|
|
4
4
|
customer-facing `docs/EXECUTIVE-ROADMAP.md`.*
|
|
5
5
|
|
|
6
|
-
> **CURRENT STATE — 2026-08-
|
|
6
|
+
> **CURRENT STATE — 2026-08-20 — 5.8.13 release**
|
|
7
7
|
>
|
|
8
8
|
> The external 5.8.11 re-audit scores **78/100** over the same byte-identical
|
|
9
9
|
> `saint-server` CIR and 53/61 invocables. It refutes two closures, exposes one new
|
|
10
10
|
> security regression and measures a cross-command performance regression. The release
|
|
11
|
-
> fixes remain valuable where verified: B05, B08 and the container/units B11 subset hold
|
|
12
|
-
>
|
|
11
|
+
> fixes remain valuable where verified: B05, B08 and the container/units B11 subset hold.
|
|
12
|
+
> The deep `testing` corpus battery also closed an in-process MCP concurrency defect:
|
|
13
|
+
> `CliRunner`'s global stream capture allowed one response to escape to the host stdout.
|
|
14
|
+
> `b2c9660` serializes that seam and proves response isolation under concurrent calls.
|
|
15
|
+
> The audit queue remains unchanged; this was additional hardening found during verification.
|
|
16
|
+
> The B04 `data-exposure` premise is retracted by the auditor after configuration-based
|
|
13
17
|
> verification. Historical tables below are superseded by this block where statuses differ.
|
|
14
18
|
>
|
|
15
19
|
> | Priority | Work | Acceptance direction |
|
|
@@ -19,6 +23,7 @@ customer-facing `docs/EXECUTIVE-ROADMAP.md`.*
|
|
|
19
23
|
> | P1 | `AUD-511-R02`: 1.4-2.4x performance slowdown. | **Partially mitigated in 5.8.12:** `b93f230` shares the `data-exposure` semantic model across label seeds; `473f47a` gives `validation` the shared CIR cache; `91bd0c0` preserves the published `--no-cache` no-op. Local Broadleaf warm validation is lower, but controlled 5.8.9/5.8.11 remeasurement remains the acceptance gate. |
|
|
20
24
|
> | P1 | `AUD-511-R03`: ASK-09 false `not_applicable`. | **Implemented in 5.8.12:** `47aee1e` uses the emitted envelope as authority and retains evidence for every result. |
|
|
21
25
|
> | P1 | `AUD-588-B02/B06`: EclipseLink is billed a Hibernate migration. | **Implemented in 5.8.12:** `3869c87` excludes the axis; `037223e` publishes the unsupported-provider gap. |
|
|
26
|
+
> | P1 | `MCP-001`: concurrent MCP calls can leak a CLI response to host stdout. | **Closed in 5.8.13:** `b2c9660` serializes the process-global `CliRunner` capture seam and regresses overlapping calls. |
|
|
22
27
|
> | P2 | `AUD-588-B11` residuals and `B12`. | `d745d31` and `273ae8e` close nested-build discovery and false exclusion prose. Finish naming/population/tier/plan parity, then recalibrate cost advice under controlled evidence. |
|
|
23
28
|
>
|
|
24
29
|
> **Feature decisions:** `F01` (EclipseLink migration automation) remains deferred, but
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*A software-knowledge platform for large codebases. Written for an engineering
|
|
4
4
|
director; no internal implementation knowledge assumed.*
|
|
5
5
|
|
|
6
|
-
> **DOCUMENT STATUS — 2026-08-
|
|
6
|
+
> **DOCUMENT STATUS — 2026-08-20**
|
|
7
7
|
>
|
|
8
|
-
> The current release is **5.8.
|
|
8
|
+
> The current release is **5.8.13**. Its external re-audit scores **78/100** on the
|
|
9
9
|
> same repository and protocol as the two prior rounds (75, then 80). The repository
|
|
10
10
|
> model is byte-identical, so the reported changes are execution, rule or presentation
|
|
11
11
|
> behavior. This block supersedes earlier release claims where they conflict.
|
|
@@ -19,6 +19,14 @@ director; no internal implementation knowledge assumed.*
|
|
|
19
19
|
> profiling, compatibility-window or host-specific CI work, not an unresolved bug from that
|
|
20
20
|
> audit. Historical scores and release claims below remain historical; this block is current.
|
|
21
21
|
|
|
22
|
+
> **MCP HARDENING — released in 5.8.13**
|
|
23
|
+
>
|
|
24
|
+
> Deep multi-repository stress testing found that concurrent MCP calls could race the
|
|
25
|
+
> process-global stdout/stderr capture used by the in-process CLI adapter. `b2c9660`
|
|
26
|
+
> serializes that narrow capture seam, preventing one tool response from reaching the MCP
|
|
27
|
+
> host or another tool call. This does not change analysis contracts or reopen the external
|
|
28
|
+
> audit queue; it makes the agent integration reliable under concurrent dispatch.
|
|
29
|
+
|
|
22
30
|
> **5.8.11 RE-AUDIT CORRECTION**
|
|
23
31
|
>
|
|
24
32
|
> The re-audit confirms the container-reach correction (`pr-impact`, `plan`, `compare`),
|
|
@@ -954,10 +954,13 @@ mantiene el alias breve de versión para compatibilidad.
|
|
|
954
954
|
|
|
955
955
|
```bash
|
|
956
956
|
ask telemetry status # ver el ajuste actual (y si llegaste a elegir)
|
|
957
|
-
ask telemetry enable # activar
|
|
958
|
-
ask telemetry disable #
|
|
957
|
+
ask telemetry enable # activar
|
|
958
|
+
ask telemetry disable # desactivar
|
|
959
959
|
```
|
|
960
|
-
La telemetría anónima está **
|
|
960
|
+
La telemetría anónima está **activada por defecto**. Recoge sólo versión, sistema, comandos,
|
|
961
|
+
flags, duración aproximada, tamaño agrupado del repositorio y tipo de error. Nunca incluye tu
|
|
962
|
+
código, rutas ni secretos. Desactívala con `ask telemetry disable`, `SOURCECODE_TELEMETRY=0`
|
|
963
|
+
o `DO_NOT_TRACK=1`.
|
|
961
964
|
|
|
962
965
|
---
|
|
963
966
|
|
|
@@ -138,7 +138,7 @@ pipx install sourcecode # isolated install, no venv needed
|
|
|
138
138
|
|
|
139
139
|
# Verify
|
|
140
140
|
ask version
|
|
141
|
-
# ask 5.8.
|
|
141
|
+
# ask 5.8.13
|
|
142
142
|
```
|
|
143
143
|
|
|
144
144
|
Requires Python 3.9+.
|
|
@@ -1199,7 +1199,7 @@ explaining. The rest do one thing; `ask <command> --help` is the whole story.
|
|
|
1199
1199
|
| `ask retrieve` | parked | Typed knowledge queries over the model — kept working, no longer developed |
|
|
1200
1200
|
| `ask baseline capture\|diff\|trend` | supported | Versioned architectural metrics over time; see [`ask trend`](#ask-trend-dir--how-the-architecture-moved) |
|
|
1201
1201
|
| `ask cache status\|warm\|model\|clear\|freshness` | supported | Cache inspection; `ask cache model` states what a warm buys each command |
|
|
1202
|
-
| `ask config` · `ask version` · `ask activate` · `ask auth` · `ask telemetry` · `ask mcp` | supported | Configuration, version, licence, authentication, telemetry (
|
|
1202
|
+
| `ask config` · `ask version` · `ask activate` · `ask auth` · `ask telemetry` · `ask mcp` | supported | Configuration, version, licence, authentication, telemetry (on by default), MCP integration |
|
|
1203
1203
|
|
|
1204
1204
|
## Typical workflows
|
|
1205
1205
|
|
|
@@ -1287,7 +1287,7 @@ ask mcp serve
|
|
|
1287
1287
|
ask mcp remove
|
|
1288
1288
|
```
|
|
1289
1289
|
|
|
1290
|
-
The MCP server exposes structural analysis tools to AI agents without requiring the agent to call the CLI directly. Claude Desktop and Cursor can query impact, endpoints, and context through the MCP protocol.
|
|
1290
|
+
The MCP server exposes structural analysis tools to AI agents without requiring the agent to call the CLI directly. Claude Desktop and Cursor can query impact, endpoints, and context through the MCP protocol. Concurrent requests are accepted safely: ASK serializes only the in-process CLI capture seam, because its stdout/stderr redirection is process-global, so one tool response cannot contaminate another.
|
|
1291
1291
|
|
|
1292
1292
|
---
|
|
1293
1293
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Privacy & Telemetry
|
|
2
2
|
|
|
3
|
-
`ask` includes an anonymous telemetry system that is **
|
|
3
|
+
`ask` includes an anonymous telemetry system that is **on by default**. It collects only bounded usage metadata: no source code, paths, secrets, or repository content are ever collected. Disable it with `ask telemetry disable`, `SOURCECODE_TELEMETRY=0`, or `DO_NOT_TRACK=1`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Telemetry is enabled by default because ASK's product operation depends on command and performance coverage. The disable controls are honored before any event is sent, including in CI.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
ask telemetry status # check current setting, and whether you ever chose
|
|
13
|
-
ask telemetry enable #
|
|
14
|
-
ask telemetry disable #
|
|
13
|
+
ask telemetry enable # enable (remembered)
|
|
14
|
+
ask telemetry disable # disable (remembered)
|
|
15
15
|
|
|
16
16
|
export SOURCECODE_TELEMETRY=0 # disable via environment variable
|
|
17
17
|
export SOURCECODE_TELEMETRY=1 # force enable via environment variable
|
|
@@ -23,13 +23,13 @@ Precedence, highest first:
|
|
|
23
23
|
1. `SOURCECODE_TELEMETRY` environment variable (`0` = off, `1` = on)
|
|
24
24
|
2. `DO_NOT_TRACK` environment variable (any value other than empty/`0` disables)
|
|
25
25
|
3. Your saved choice in the config file (`telemetry enable` / `disable`)
|
|
26
|
-
4. Default: **
|
|
26
|
+
4. Default: **on** — no choice on record enables bounded anonymous events
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
30
|
## Why telemetry exists
|
|
31
31
|
|
|
32
|
-
ASK Engine is a local analysis tool with
|
|
32
|
+
ASK Engine is a local analysis tool with bounded anonymous usage visibility by default.
|
|
33
33
|
Anonymous telemetry helps answer questions like:
|
|
34
34
|
|
|
35
35
|
- Which commands do developers actually use?
|
|
@@ -54,7 +54,8 @@ When telemetry is enabled, these fields are sent per command invocation:
|
|
|
54
54
|
| `py` | `3.11` | Python major.minor only |
|
|
55
55
|
| `os` | `macos` | OS family: linux / macos / windows / other |
|
|
56
56
|
| `arch` | `x64` | CPU family: x64 / arm64 / other |
|
|
57
|
-
| `cmd` | `analyze` | Command
|
|
57
|
+
| `cmd` | `analyze` | Command family: analyze / prepare-context / telemetry / mcp |
|
|
58
|
+
| `command` | `spring-audit` | Closed ASK command identifier; no arguments or paths |
|
|
58
59
|
| `flags` | `["--agent"]` | Flag names only (allowlist), no values |
|
|
59
60
|
| `output_fmt` | `json` | Output format: json or yaml |
|
|
60
61
|
| `repo_size` | `small` | File count range bucket (see below) |
|
|
@@ -74,8 +75,8 @@ which capabilities agents actually use.
|
|
|
74
75
|
The tool **arguments are never sent** — they carry repository paths. Neither is any part
|
|
75
76
|
of the result. The name is a fixed identifier from ASK Engine's own tool registry, not
|
|
76
77
|
user input, and it is still shape-validated by the sanitization layer before transmission.
|
|
77
|
-
These events follow the same
|
|
78
|
-
is
|
|
78
|
+
These events follow the same setting as everything else: they are recorded only while
|
|
79
|
+
telemetry is enabled.
|
|
79
80
|
|
|
80
81
|
### Repo size buckets
|
|
81
82
|
|
|
@@ -135,11 +136,13 @@ This filter is tested in `tests/test_telemetry.py`. Tests explicitly verify that
|
|
|
135
136
|
|
|
136
137
|
## Data transmission
|
|
137
138
|
|
|
138
|
-
- Events are sent to `https://
|
|
139
|
+
- Events are sent to `https://qkndlmyekvujjdgthtmz.supabase.co/functions/v1/telemetry` (configurable via `SOURCECODE_TELEMETRY_ENDPOINT`)
|
|
139
140
|
- Transmission happens in a background daemon thread — it never blocks the CLI
|
|
140
141
|
- Timeout is 3 seconds — if the request fails or times out, it is silently dropped
|
|
141
142
|
- No retries — a missed event is acceptable
|
|
142
143
|
- No queuing or batching to disk
|
|
144
|
+
- The server rejects payloads over 16 KiB and applies an in-memory rate limit of 120 requests per minute per forwarding address
|
|
145
|
+
- Events are retained for 90 days; the `purge_telemetry_events()` function is scheduled in the Supabase deployment
|
|
143
146
|
|
|
144
147
|
---
|
|
145
148
|
|
|
@@ -161,16 +164,16 @@ The file looks like:
|
|
|
161
164
|
}
|
|
162
165
|
```
|
|
163
166
|
|
|
164
|
-
If you run `ask telemetry enable` or `disable`, `enabled` is set accordingly and that choice is remembered. If you have never made an explicit choice, the `enabled` key is absent and telemetry
|
|
167
|
+
If you run `ask telemetry enable` or `disable`, `enabled` is set accordingly and that choice is remembered. If you have never made an explicit choice, the `enabled` key is absent and telemetry follows the **on** default. `ask telemetry status` tells you whether the default applies or you explicitly disabled it. You can edit or delete this file directly at any time.
|
|
165
168
|
|
|
166
169
|
---
|
|
167
170
|
|
|
168
171
|
## First-run notice
|
|
169
172
|
|
|
170
|
-
The first time you run `ask` interactively (not in CI, not piped), you are shown a brief, one-time notice explaining that telemetry is **
|
|
173
|
+
The first time you run `ask` interactively (not in CI, not piped), you are shown a brief, one-time notice explaining that telemetry is **on**, what is collected, and how to disable it.
|
|
171
174
|
|
|
172
|
-
- It is
|
|
173
|
-
-
|
|
175
|
+
- It is a disclosure, not a prompt — no answer is required and your input is never read
|
|
176
|
+
- Printing it changes no setting
|
|
174
177
|
- It is shown **once only**
|
|
175
178
|
- In CI environments (GitHub Actions, CircleCI, etc.) the notice is skipped
|
|
176
179
|
- When piped or run non-interactively, the notice is skipped
|
|
@@ -179,7 +182,7 @@ The first time you run `ask` interactively (not in CI, not piped), you are shown
|
|
|
179
182
|
|
|
180
183
|
## CI environments
|
|
181
184
|
|
|
182
|
-
|
|
185
|
+
Telemetry remains on in CI unless `SOURCECODE_TELEMETRY=0` or `DO_NOT_TRACK=1` is set. CI is detected only to skip the first-run notice, which has no terminal to appear on:
|
|
183
186
|
|
|
184
187
|
`CI`, `CONTINUOUS_INTEGRATION`, `GITHUB_ACTIONS`, `CIRCLECI`, `TRAVIS`, `JENKINS_URL`, `BUILDKITE`, `GITLAB_CI`, `TF_BUILD`, `TEAMCITY_VERSION`, `DRONE`, `SEMAPHORE`
|
|
185
188
|
|
|
@@ -191,7 +194,7 @@ The entire telemetry implementation is in `src/sourcecode/telemetry/`. You can r
|
|
|
191
194
|
|
|
192
195
|
Key files:
|
|
193
196
|
- `config.py` — configuration read/write
|
|
194
|
-
- `consent.py` — first-run
|
|
197
|
+
- `consent.py` — first-run disclosure notice
|
|
195
198
|
- `events.py` — event schema
|
|
196
199
|
- `filters.py` — privacy sanitization (the critical safety layer)
|
|
197
200
|
- `transport.py` — HTTP transmission
|
|
@@ -3033,13 +3033,59 @@ def _get_command_with_preprocessing(typer_instance: Any) -> Any:
|
|
|
3033
3033
|
|
|
3034
3034
|
_orig_cmd_main = cmd.main
|
|
3035
3035
|
|
|
3036
|
+
_TELEMETRY_COMMANDS = frozenset({
|
|
3037
|
+
"repo-ir", "impact", "endpoints", "export", "validation", "delta", "contract-diff",
|
|
3038
|
+
"plan", "compare", "trend", "timeline", "spring-audit", "verify-edit", "verify", "risk",
|
|
3039
|
+
"enrich", "audit-report", "migrate-recipe", "data-exposure", "posture", "migrate-check",
|
|
3040
|
+
"impact-chain", "pr-impact", "explain", "onboard", "review-pr", "fix-bug", "modernize",
|
|
3041
|
+
"rename-class", "chunk-file", "activate", "selftest", "explain-endpoint", "regress", "version",
|
|
3042
|
+
"schema", "config", "archetype", "cold-start", "telemetry", "mcp", "cache", "baseline",
|
|
3043
|
+
"auth", "retrieve", "prepare-context",
|
|
3044
|
+
})
|
|
3045
|
+
|
|
3046
|
+
def _telemetry_command(args_for_command: Optional[list[str]]) -> str:
|
|
3047
|
+
"""Extract only a registered CLI command, never a path or option value."""
|
|
3048
|
+
tokens = list(args_for_command) if args_for_command is not None else sys.argv[1:]
|
|
3049
|
+
for token in tokens:
|
|
3050
|
+
if token in _TELEMETRY_COMMANDS:
|
|
3051
|
+
return token
|
|
3052
|
+
return "analyze"
|
|
3053
|
+
|
|
3054
|
+
def _telemetry_flags(args_for_command: Optional[list[str]]) -> list[str]:
|
|
3055
|
+
tokens = list(args_for_command) if args_for_command is not None else sys.argv[1:]
|
|
3056
|
+
try:
|
|
3057
|
+
from sourcecode.telemetry.filters import _SAFE_FLAGS
|
|
3058
|
+
return sorted({token for token in tokens if token in _SAFE_FLAGS})
|
|
3059
|
+
except Exception:
|
|
3060
|
+
return []
|
|
3061
|
+
|
|
3036
3062
|
def _cmd_main(args: Optional[list[str]] = None, **kwargs: Any) -> Any:
|
|
3037
3063
|
if args is not None:
|
|
3038
3064
|
# CliRunner / programmatic call: preprocess the explicit args list.
|
|
3039
3065
|
_set_detected_path(".")
|
|
3040
3066
|
args = _preprocess_args(list(args))
|
|
3041
3067
|
# args=None → Click reads sys.argv; _preprocess_argv() in main_entry handled it.
|
|
3042
|
-
|
|
3068
|
+
started = time.monotonic()
|
|
3069
|
+
command = _telemetry_command(args)
|
|
3070
|
+
success = True
|
|
3071
|
+
try:
|
|
3072
|
+
return _orig_cmd_main(args=args, **kwargs)
|
|
3073
|
+
except BaseException:
|
|
3074
|
+
success = False
|
|
3075
|
+
raise
|
|
3076
|
+
finally:
|
|
3077
|
+
try:
|
|
3078
|
+
from sourcecode import telemetry as _tel
|
|
3079
|
+
_tel.record(
|
|
3080
|
+
"execution_completed",
|
|
3081
|
+
cmd=("mcp" if command == "mcp" else "telemetry" if command == "telemetry" else "analyze"),
|
|
3082
|
+
command=command,
|
|
3083
|
+
flags=_telemetry_flags(args),
|
|
3084
|
+
duration_s=time.monotonic() - started,
|
|
3085
|
+
success=success,
|
|
3086
|
+
)
|
|
3087
|
+
except Exception:
|
|
3088
|
+
pass
|
|
3043
3089
|
|
|
3044
3090
|
cmd.main = _cmd_main
|
|
3045
3091
|
return cmd
|
|
@@ -3055,7 +3101,7 @@ try:
|
|
|
3055
3101
|
except Exception:
|
|
3056
3102
|
pass
|
|
3057
3103
|
|
|
3058
|
-
telemetry_app = typer.Typer(help="Manage anonymous telemetry (
|
|
3104
|
+
telemetry_app = typer.Typer(help="Manage anonymous telemetry (on by default; disable any time).", rich_markup_mode="rich")
|
|
3059
3105
|
app.add_typer(telemetry_app, name="telemetry")
|
|
3060
3106
|
|
|
3061
3107
|
mcp_app = typer.Typer(help="MCP integration: setup, status, serve, remove.", rich_markup_mode="rich")
|
|
@@ -3083,9 +3129,8 @@ app.add_typer(retrieve_app, name="retrieve")
|
|
|
3083
3129
|
def _maybe_show_telemetry_notice() -> None:
|
|
3084
3130
|
"""Show first-run telemetry notice once, on interactive TTYs only.
|
|
3085
3131
|
|
|
3086
|
-
Telemetry is
|
|
3087
|
-
|
|
3088
|
-
appears only once.
|
|
3132
|
+
Telemetry is on by default. The notice is a one-time disclosure of what is
|
|
3133
|
+
collected and how to disable it.
|
|
3089
3134
|
"""
|
|
3090
3135
|
try:
|
|
3091
3136
|
from sourcecode.telemetry.config import has_been_asked, mark_asked
|
|
@@ -5314,26 +5359,7 @@ def main(
|
|
|
5314
5359
|
perf.stop("serialize", _perf_serialize)
|
|
5315
5360
|
perf.flush_recorder()
|
|
5316
5361
|
|
|
5317
|
-
# 5.
|
|
5318
|
-
try:
|
|
5319
|
-
from sourcecode import telemetry as _tel
|
|
5320
|
-
_tel.record(
|
|
5321
|
-
"execution_completed",
|
|
5322
|
-
cmd="analyze",
|
|
5323
|
-
flags=_active_flags(
|
|
5324
|
-
dependencies, graph_modules, docs, full_metrics,
|
|
5325
|
-
semantics, architecture, git_context, env_map,
|
|
5326
|
-
code_notes, agent, compact, tree, no_redact, format,
|
|
5327
|
-
),
|
|
5328
|
-
output_fmt=format,
|
|
5329
|
-
file_count=len(sm.file_paths),
|
|
5330
|
-
duration_s=time.monotonic() - _t0,
|
|
5331
|
-
success=True,
|
|
5332
|
-
)
|
|
5333
|
-
except Exception:
|
|
5334
|
-
pass
|
|
5335
|
-
|
|
5336
|
-
# 6. Write output (CLI-04)
|
|
5362
|
+
# 5. Write output (CLI-04)
|
|
5337
5363
|
_progress.finish()
|
|
5338
5364
|
if format == "json":
|
|
5339
5365
|
_uncommitted_fresh, _uncommitted_fresh_basis = _uncommitted_fact(
|
|
@@ -5926,17 +5952,6 @@ def prepare_context_cmd(
|
|
|
5926
5952
|
except Exception:
|
|
5927
5953
|
pass # not JSON (or unreadable) → serve exactly what was stored
|
|
5928
5954
|
_emit_command_output(_cached_pctx, output_path, copy)
|
|
5929
|
-
try:
|
|
5930
|
-
from sourcecode import telemetry as _tel
|
|
5931
|
-
_tel.record(
|
|
5932
|
-
"execution_completed",
|
|
5933
|
-
cmd="prepare-context",
|
|
5934
|
-
feature=task,
|
|
5935
|
-
output_fmt=format,
|
|
5936
|
-
duration_s=0.0,
|
|
5937
|
-
)
|
|
5938
|
-
except Exception:
|
|
5939
|
-
pass
|
|
5940
5955
|
return
|
|
5941
5956
|
|
|
5942
5957
|
_scope_files = None
|
|
@@ -6463,18 +6478,6 @@ def prepare_context_cmd(
|
|
|
6463
6478
|
fmt=("yaml" if format == "yaml" else "json")
|
|
6464
6479
|
)
|
|
6465
6480
|
|
|
6466
|
-
try:
|
|
6467
|
-
from sourcecode import telemetry as _tel
|
|
6468
|
-
_tel.record(
|
|
6469
|
-
"execution_completed",
|
|
6470
|
-
cmd="prepare-context",
|
|
6471
|
-
feature=task,
|
|
6472
|
-
output_fmt=format,
|
|
6473
|
-
duration_s=_time.perf_counter() - _t0,
|
|
6474
|
-
)
|
|
6475
|
-
except Exception:
|
|
6476
|
-
pass
|
|
6477
|
-
|
|
6478
6481
|
from sourcecode.mcp_nudge import nudge_mcp_if_needed as _nudge
|
|
6479
6482
|
_nudge()
|
|
6480
6483
|
|
|
@@ -6491,11 +6494,11 @@ def telemetry_status(
|
|
|
6491
6494
|
enabled = is_enabled()
|
|
6492
6495
|
choice = stored_choice()
|
|
6493
6496
|
status = "enabled" if enabled else "disabled"
|
|
6494
|
-
lines = [f"Telemetry: {status} (
|
|
6495
|
-
#
|
|
6496
|
-
#
|
|
6497
|
+
lines = [f"Telemetry: {status} (on by default; disable with `ask telemetry disable`)"]
|
|
6498
|
+
# The default and an explicit disabled choice are different answers, and a
|
|
6499
|
+
# buyer auditing this needs to be told which one they have.
|
|
6497
6500
|
if choice is None:
|
|
6498
|
-
lines.append(" No choice recorded —
|
|
6501
|
+
lines.append(" No choice recorded — the on-by-default setting applies.")
|
|
6499
6502
|
else:
|
|
6500
6503
|
lines.append(f" Your recorded choice: {'enabled' if choice else 'disabled'}.")
|
|
6501
6504
|
lines.append(f" Config: {config_file_path()}")
|
|
@@ -6508,7 +6511,7 @@ def telemetry_status(
|
|
|
6508
6511
|
|
|
6509
6512
|
@telemetry_app.command("enable")
|
|
6510
6513
|
def telemetry_enable() -> None:
|
|
6511
|
-
"""
|
|
6514
|
+
"""Enable anonymous telemetry and remember the choice."""
|
|
6512
6515
|
from sourcecode.telemetry.config import set_enabled
|
|
6513
6516
|
from sourcecode import telemetry as _tel
|
|
6514
6517
|
set_enabled(True)
|
|
@@ -6521,11 +6524,11 @@ def telemetry_enable() -> None:
|
|
|
6521
6524
|
|
|
6522
6525
|
@telemetry_app.command("disable")
|
|
6523
6526
|
def telemetry_disable() -> None:
|
|
6524
|
-
"""
|
|
6527
|
+
"""Disable anonymous telemetry and remember the choice."""
|
|
6525
6528
|
from sourcecode.telemetry.config import set_enabled
|
|
6526
6529
|
set_enabled(False)
|
|
6527
6530
|
typer.echo("Telemetry disabled. No data will be collected or sent.")
|
|
6528
|
-
typer.echo("Telemetry is
|
|
6531
|
+
typer.echo("Telemetry is enabled by default; this choice is recorded so the notice stops appearing.")
|
|
6529
6532
|
typer.echo("Re-enable at any time: ask telemetry enable")
|
|
6530
6533
|
|
|
6531
6534
|
|
|
@@ -14190,7 +14193,7 @@ def config_cmd(
|
|
|
14190
14193
|
_answer = _TextAnswer(output_path)
|
|
14191
14194
|
_answer.say(f"ask {__version__}")
|
|
14192
14195
|
_answer.say(f"Config: {config_file_path()}")
|
|
14193
|
-
_answer.say(f"Telemetry: {'enabled' if is_enabled() else 'disabled'} (
|
|
14196
|
+
_answer.say(f"Telemetry: {'enabled' if is_enabled() else 'disabled'} (on by default; disable with `ask telemetry disable`)")
|
|
14194
14197
|
_answer.say("")
|
|
14195
14198
|
|
|
14196
14199
|
# F-AX: the declaration may sit outside the analysed tree, and *which* file
|
|
@@ -7,11 +7,15 @@ lookup, no process fork, no stdout encoding issues.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
|
+
import threading
|
|
10
11
|
from typing import Any
|
|
11
12
|
|
|
12
13
|
from typer.testing import CliRunner
|
|
13
14
|
|
|
14
15
|
_runner = CliRunner()
|
|
16
|
+
# CliRunner temporarily replaces process-global stdout/stderr. MCP dispatches
|
|
17
|
+
# tools concurrently, so every in-process invocation must share this lock.
|
|
18
|
+
_runner_lock = threading.RLock()
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
class CommandError(RuntimeError):
|
|
@@ -44,7 +48,8 @@ def run_command(args: list[str]) -> Any:
|
|
|
44
48
|
# Pass raw args to invoke — the _cmd_main hook inside cli.py handles path
|
|
45
49
|
# extraction via _preprocess_args. Pre-processing here would strip the path
|
|
46
50
|
# from args, then _cmd_main would re-process the stripped list and lose it.
|
|
47
|
-
|
|
51
|
+
with _runner_lock:
|
|
52
|
+
result = _runner.invoke(app, list(args))
|
|
48
53
|
|
|
49
54
|
if result.exit_code != 0:
|
|
50
55
|
stdout_raw = getattr(result, "output", "")
|