diff --git a/docs/self-scoping/README.md b/docs/self-scoping/README.md index 5767984..c42f449 100644 --- a/docs/self-scoping/README.md +++ b/docs/self-scoping/README.md @@ -11,6 +11,12 @@ instead of relying on memory or screenshots. - `assessments/repo-scoping-known-bad-2026-05-15-run-39.json` captures the known-bad self-analysis that promoted LLM-provider vocabulary into native repo-scoping capability truth. +- `assessments/repo-scoping-post-wp0015-clean-2026-05-15.json` captures the + first clean, release-bound deterministic challenger after acceptance-boundary + and input-hygiene work. It remains a rejected regression because candidate + generation still collapses repo-scoping's native surfaces under the forbidden + provider-routing capability, but its source set no longer includes + `var/checkouts/` contamination. - `workflow.md` explains how to run challenger assessments, interpret outcomes, and decide whether to update the golden profile or fix the engine. - `outcomes/` stores append-only reviewer decisions created from side-by-side diff --git a/docs/self-scoping/assessments/repo-scoping-post-wp0015-clean-2026-05-15.json b/docs/self-scoping/assessments/repo-scoping-post-wp0015-clean-2026-05-15.json new file mode 100644 index 0000000..8bf1e7c --- /dev/null +++ b/docs/self-scoping/assessments/repo-scoping-post-wp0015-clean-2026-05-15.json @@ -0,0 +1,2775 @@ +{ + "approved_map": { + "abilities": [], + "scope": { + "confidence": 1.0, + "confidence_label": "high", + "description": "Self-scoping assessment target.", + "id": 1, + "name": "repo-scoping" + } + }, + "artifact_id": "repo-scoping-challenger-run-1", + "artifact_type": "assessment_run", + "assessment": { + "comparison_eligibility": "eligible", + "outcome": "challenger", + "rationale": [ + "RREG-SELF-REG-001: Generated tree contains Route LLM Requests Across Providers as a repo-scoping capability.", + "RREG-SELF-REG-002: API or CLI surface features are nested below provider routing." + ], + "reviewer": "self-assess", + "role": "challenger", + "summary": "Generated self-scoping assessment repeats known regression patterns." + }, + "content_chunk_summary": { + "counts_by_kind": { + "config": 1, + "credential_config": 47, + "documentation": 91, + "fallback_policy": 125, + "intent": 5, + "interface": 255, + "llm_provider": 295, + "manifest": 1, + "provider_registry": 208, + "scope": 5, + "test": 245 + }, + "counts_by_source_role": { + "dependency_declaration": 2, + "derived_scope": 5, + "implementation_source": 255, + "intent_summary": 5, + "product_documentation": 170, + "test_evidence": 841 + }, + "paths": [ + "INTENT.md", + "README.md", + "SCOPE.md", + "docs/abstraction-strategy.md", + "docs/acceptance-policy.md", + "docs/adr-dependency-graph-visualization-framework.md", + "docs/adr-ep-cap-003-vocabulary-ref-guard.md", + "docs/api-contract.md", + "docs/characteristic-evidence-model.md", + "docs/classification-strategy.md", + "docs/dependency-aware-scope-propagation.md", + "docs/dependency-visualization-exploration.md", + "docs/migrations/trusted-auto-approval.md", + "docs/operations.md", + "docs/quality-criteria/README.md", + "docs/quality-criteria/acceptance-quality-criteria.v1.json", + "docs/schemas/quality-criteria-registry.schema.json", + "docs/schemas/repo-scope-context-response.json", + "docs/schemas/self-scoping-assessment.schema.json", + "docs/scope-md-spec.md", + "docs/self-scoping/README.md", + "docs/self-scoping/assessments/repo-scoping-known-bad-2026-05-15-run-39.json", + "docs/self-scoping/golden/repo-scoping-golden-profile.v1.json", + "docs/self-scoping/outcomes/README.md", + "docs/self-scoping/workflow.md", + "docs/semantic-retrieval.md", + "docs/terminology.md", + "pyproject.toml", + "src/repo_registry/candidate_graph/normalization.py", + "src/repo_registry/cli.py", + "src/repo_registry/repo_scanning/scanner.py", + "src/repo_registry/web_api/__init__.py", + "src/repo_registry/web_api/app.py", + "src/repo_registry/web_api/schemas.py", + "tests/__init__.py", + "tests/expectations/llm_connect_provider_expectations.json", + "tests/fixtures.py", + "tests/test_acceptance_boundary.py", + "tests/test_acceptance_policy_docs.py", + "tests/test_agentic_review.py", + "tests/test_candidate_graph.py", + "tests/test_candidate_normalization.py", + "tests/test_cli.py", + "tests/test_content_indexing.py", + "tests/test_git_ingestion.py", + "tests/test_intent_bootstrap.py", + "tests/test_llm_extraction.py", + "tests/test_llm_extraction_mapper.py", + "tests/test_quality_criteria.py", + "tests/test_quality_gates.py", + "tests/test_registry_service.py", + "tests/test_repository_metadata.py", + "tests/test_repository_scanner.py", + "tests/test_scanner_coevolution.py", + "tests/test_scope_context_api.py", + "tests/test_scope_generator.py", + "tests/test_self_scoping_artifacts.py", + "tests/test_self_scoping_assessment_export.py", + "tests/test_self_scoping_comparison.py", + "tests/test_self_scoping_review_store.py", + "tests/test_self_scoping_web_ui.py", + "tests/test_storage_migrations.py", + "tests/test_trusted_auto_approval_migration.py", + "tests/test_web_api.py", + "wiki/AbilityExtractionHeuristics.md", + "workplans/RREG-WP-0003-automatic-repository-exploration.md", + "workplans/RREG-WP-0004-characteristic-classification-navigation.md", + "workplans/RREG-WP-0012-activity-core-context-api.md" + ], + "total": 1278 + }, + "created_at": "2026-05-15T15:10:24Z", + "engine_identity": { + "candidate_generator_version": "unversioned", + "engine_commit": "abcb2cebbcaa448eb960c276c98a0b769fc493a2", + "engine_dirty_state": "clean", + "engine_release": null, + "prompt_version": null, + "quality_criteria_version": "repo-scoping-quality-criteria/v1", + "release_binding_note": "Engine commit was captured from git.", + "release_binding_status": "complete", + "repo_scoping_version": "0.1.0", + "scanner_version": "deterministic-v0.1" + }, + "execution": { + "acceptance_mode": "pending_review", + "analysis_run_id": 1, + "candidate_source": "deterministic", + "completed_at": "2026-05-15T15:10:24Z", + "mode": "deterministic-only", + "started_at": "2026-05-15T15:10:20Z" + }, + "fact_summary": { + "contamination_sources": [ + { + "path": "src/repo_registry/candidate_graph/normalization.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "src/repo_registry/repo_scanning/scanner.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "src/repo_registry/web_api/schemas.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/expectations/llm_connect_provider_expectations.json", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/fixtures.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_acceptance_boundary.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_candidate_graph.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_candidate_normalization.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_cli.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_content_indexing.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_llm_extraction.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_quality_gates.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_registry_service.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_repository_scanner.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_scanner_coevolution.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_self_scoping_assessment_export.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "tests/test_web_api.py", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "workplans/RREG-WP-0003-automatic-repository-exploration.md", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + }, + { + "path": "workplans/RREG-WP-0004-characteristic-classification-navigation.md", + "reason": "Provider-related fact came from scanner rules, tests, fixtures, schemas, or workplan context and needs native-utility review." + } + ], + "counts_by_kind": { + "config": 1, + "credential_config": 13, + "documentation": 25, + "fallback_policy": 11, + "framework": 2, + "intent": 1, + "interface": 136, + "language": 1, + "llm_provider": 50, + "manifest": 1, + "provider_registry": 13, + "scope": 1, + "test": 30 + } + }, + "generated_tree": { + "abilities": [ + { + "capabilities": [ + { + "evidence": [ + { + "reference": "tests/__init__.py", + "source_refs": [ + { + "fact_id": 256, + "kind": "test", + "line": null, + "name": "__init__.py", + "path": "tests/__init__.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/expectations/llm_connect_provider_expectations.json", + "source_refs": [ + { + "fact_id": 257, + "kind": "test", + "line": null, + "name": "llm_connect_provider_expectations.json", + "path": "tests/expectations/llm_connect_provider_expectations.json" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/fixtures.py", + "source_refs": [ + { + "fact_id": 258, + "kind": "test", + "line": null, + "name": "fixtures.py", + "path": "tests/fixtures.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_acceptance_boundary.py", + "source_refs": [ + { + "fact_id": 259, + "kind": "test", + "line": null, + "name": "test_acceptance_boundary.py", + "path": "tests/test_acceptance_boundary.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_acceptance_policy_docs.py", + "source_refs": [ + { + "fact_id": 260, + "kind": "test", + "line": null, + "name": "test_acceptance_policy_docs.py", + "path": "tests/test_acceptance_policy_docs.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_agentic_review.py", + "source_refs": [ + { + "fact_id": 261, + "kind": "test", + "line": null, + "name": "test_agentic_review.py", + "path": "tests/test_agentic_review.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_candidate_graph.py", + "source_refs": [ + { + "fact_id": 262, + "kind": "test", + "line": null, + "name": "test_candidate_graph.py", + "path": "tests/test_candidate_graph.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_candidate_normalization.py", + "source_refs": [ + { + "fact_id": 263, + "kind": "test", + "line": null, + "name": "test_candidate_normalization.py", + "path": "tests/test_candidate_normalization.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_cli.py", + "source_refs": [ + { + "fact_id": 264, + "kind": "test", + "line": null, + "name": "test_cli.py", + "path": "tests/test_cli.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_content_indexing.py", + "source_refs": [ + { + "fact_id": 265, + "kind": "test", + "line": null, + "name": "test_content_indexing.py", + "path": "tests/test_content_indexing.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_git_ingestion.py", + "source_refs": [ + { + "fact_id": 266, + "kind": "test", + "line": null, + "name": "test_git_ingestion.py", + "path": "tests/test_git_ingestion.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_intent_bootstrap.py", + "source_refs": [ + { + "fact_id": 267, + "kind": "test", + "line": null, + "name": "test_intent_bootstrap.py", + "path": "tests/test_intent_bootstrap.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_llm_extraction.py", + "source_refs": [ + { + "fact_id": 268, + "kind": "test", + "line": null, + "name": "test_llm_extraction.py", + "path": "tests/test_llm_extraction.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_llm_extraction_mapper.py", + "source_refs": [ + { + "fact_id": 269, + "kind": "test", + "line": null, + "name": "test_llm_extraction_mapper.py", + "path": "tests/test_llm_extraction_mapper.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_quality_criteria.py", + "source_refs": [ + { + "fact_id": 270, + "kind": "test", + "line": null, + "name": "test_quality_criteria.py", + "path": "tests/test_quality_criteria.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_quality_gates.py", + "source_refs": [ + { + "fact_id": 271, + "kind": "test", + "line": null, + "name": "test_quality_gates.py", + "path": "tests/test_quality_gates.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_registry_service.py", + "source_refs": [ + { + "fact_id": 272, + "kind": "test", + "line": null, + "name": "test_registry_service.py", + "path": "tests/test_registry_service.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_repository_metadata.py", + "source_refs": [ + { + "fact_id": 273, + "kind": "test", + "line": null, + "name": "test_repository_metadata.py", + "path": "tests/test_repository_metadata.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_repository_scanner.py", + "source_refs": [ + { + "fact_id": 274, + "kind": "test", + "line": null, + "name": "test_repository_scanner.py", + "path": "tests/test_repository_scanner.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_scanner_coevolution.py", + "source_refs": [ + { + "fact_id": 275, + "kind": "test", + "line": null, + "name": "test_scanner_coevolution.py", + "path": "tests/test_scanner_coevolution.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_scope_context_api.py", + "source_refs": [ + { + "fact_id": 276, + "kind": "test", + "line": null, + "name": "test_scope_context_api.py", + "path": "tests/test_scope_context_api.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_scope_generator.py", + "source_refs": [ + { + "fact_id": 277, + "kind": "test", + "line": null, + "name": "test_scope_generator.py", + "path": "tests/test_scope_generator.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_self_scoping_artifacts.py", + "source_refs": [ + { + "fact_id": 278, + "kind": "test", + "line": null, + "name": "test_self_scoping_artifacts.py", + "path": "tests/test_self_scoping_artifacts.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_self_scoping_assessment_export.py", + "source_refs": [ + { + "fact_id": 279, + "kind": "test", + "line": null, + "name": "test_self_scoping_assessment_export.py", + "path": "tests/test_self_scoping_assessment_export.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_self_scoping_comparison.py", + "source_refs": [ + { + "fact_id": 280, + "kind": "test", + "line": null, + "name": "test_self_scoping_comparison.py", + "path": "tests/test_self_scoping_comparison.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_self_scoping_review_store.py", + "source_refs": [ + { + "fact_id": 281, + "kind": "test", + "line": null, + "name": "test_self_scoping_review_store.py", + "path": "tests/test_self_scoping_review_store.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_self_scoping_web_ui.py", + "source_refs": [ + { + "fact_id": 282, + "kind": "test", + "line": null, + "name": "test_self_scoping_web_ui.py", + "path": "tests/test_self_scoping_web_ui.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_storage_migrations.py", + "source_refs": [ + { + "fact_id": 283, + "kind": "test", + "line": null, + "name": "test_storage_migrations.py", + "path": "tests/test_storage_migrations.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_trusted_auto_approval_migration.py", + "source_refs": [ + { + "fact_id": 284, + "kind": "test", + "line": null, + "name": "test_trusted_auto_approval_migration.py", + "path": "tests/test_trusted_auto_approval_migration.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "tests/test_web_api.py", + "source_refs": [ + { + "fact_id": 285, + "kind": "test", + "line": null, + "name": "test_web_api.py", + "path": "tests/test_web_api.py" + } + ], + "status": "candidate", + "strength": "strong", + "type": "test" + }, + { + "reference": "INTENT.md", + "source_refs": [ + { + "fact_id": 53, + "kind": "intent", + "line": null, + "name": "INTENT", + "path": "INTENT.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "README.md", + "source_refs": [ + { + "fact_id": 15, + "kind": "documentation", + "line": null, + "name": "README", + "path": "README.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/abstraction-strategy.md", + "source_refs": [ + { + "fact_id": 16, + "kind": "documentation", + "line": null, + "name": "abstraction-strategy.md", + "path": "docs/abstraction-strategy.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/acceptance-policy.md", + "source_refs": [ + { + "fact_id": 17, + "kind": "documentation", + "line": null, + "name": "acceptance-policy.md", + "path": "docs/acceptance-policy.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/adr-dependency-graph-visualization-framework.md", + "source_refs": [ + { + "fact_id": 18, + "kind": "documentation", + "line": null, + "name": "adr-dependency-graph-visualization-framework.md", + "path": "docs/adr-dependency-graph-visualization-framework.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/adr-ep-cap-003-vocabulary-ref-guard.md", + "source_refs": [ + { + "fact_id": 19, + "kind": "documentation", + "line": null, + "name": "adr-ep-cap-003-vocabulary-ref-guard.md", + "path": "docs/adr-ep-cap-003-vocabulary-ref-guard.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/api-contract.md", + "source_refs": [ + { + "fact_id": 20, + "kind": "documentation", + "line": null, + "name": "api-contract.md", + "path": "docs/api-contract.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/characteristic-evidence-model.md", + "source_refs": [ + { + "fact_id": 21, + "kind": "documentation", + "line": null, + "name": "characteristic-evidence-model.md", + "path": "docs/characteristic-evidence-model.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/classification-strategy.md", + "source_refs": [ + { + "fact_id": 22, + "kind": "documentation", + "line": null, + "name": "classification-strategy.md", + "path": "docs/classification-strategy.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/dependency-aware-scope-propagation.md", + "source_refs": [ + { + "fact_id": 23, + "kind": "documentation", + "line": null, + "name": "dependency-aware-scope-propagation.md", + "path": "docs/dependency-aware-scope-propagation.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/dependency-visualization-exploration.md", + "source_refs": [ + { + "fact_id": 24, + "kind": "documentation", + "line": null, + "name": "dependency-visualization-exploration.md", + "path": "docs/dependency-visualization-exploration.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/migrations/trusted-auto-approval.md", + "source_refs": [ + { + "fact_id": 25, + "kind": "documentation", + "line": null, + "name": "trusted-auto-approval.md", + "path": "docs/migrations/trusted-auto-approval.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/operations.md", + "source_refs": [ + { + "fact_id": 26, + "kind": "documentation", + "line": null, + "name": "operations.md", + "path": "docs/operations.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/quality-criteria/README.md", + "source_refs": [ + { + "fact_id": 27, + "kind": "documentation", + "line": null, + "name": "README", + "path": "docs/quality-criteria/README.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/quality-criteria/acceptance-quality-criteria.v1.json", + "source_refs": [ + { + "fact_id": 28, + "kind": "documentation", + "line": null, + "name": "acceptance-quality-criteria.v1.json", + "path": "docs/quality-criteria/acceptance-quality-criteria.v1.json" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/schemas/quality-criteria-registry.schema.json", + "source_refs": [ + { + "fact_id": 29, + "kind": "documentation", + "line": null, + "name": "quality-criteria-registry.schema.json", + "path": "docs/schemas/quality-criteria-registry.schema.json" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/schemas/repo-scope-context-response.json", + "source_refs": [ + { + "fact_id": 30, + "kind": "documentation", + "line": null, + "name": "repo-scope-context-response.json", + "path": "docs/schemas/repo-scope-context-response.json" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/schemas/self-scoping-assessment.schema.json", + "source_refs": [ + { + "fact_id": 31, + "kind": "documentation", + "line": null, + "name": "self-scoping-assessment.schema.json", + "path": "docs/schemas/self-scoping-assessment.schema.json" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/scope-md-spec.md", + "source_refs": [ + { + "fact_id": 32, + "kind": "documentation", + "line": null, + "name": "scope-md-spec.md", + "path": "docs/scope-md-spec.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/self-scoping/README.md", + "source_refs": [ + { + "fact_id": 33, + "kind": "documentation", + "line": null, + "name": "README", + "path": "docs/self-scoping/README.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/self-scoping/assessments/repo-scoping-known-bad-2026-05-15-run-39.json", + "source_refs": [ + { + "fact_id": 34, + "kind": "documentation", + "line": null, + "name": "repo-scoping-known-bad-2026-05-15-run-39.json", + "path": "docs/self-scoping/assessments/repo-scoping-known-bad-2026-05-15-run-39.json" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/self-scoping/golden/repo-scoping-golden-profile.v1.json", + "source_refs": [ + { + "fact_id": 35, + "kind": "documentation", + "line": null, + "name": "repo-scoping-golden-profile.v1.json", + "path": "docs/self-scoping/golden/repo-scoping-golden-profile.v1.json" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/self-scoping/outcomes/README.md", + "source_refs": [ + { + "fact_id": 36, + "kind": "documentation", + "line": null, + "name": "README", + "path": "docs/self-scoping/outcomes/README.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/self-scoping/workflow.md", + "source_refs": [ + { + "fact_id": 37, + "kind": "documentation", + "line": null, + "name": "workflow.md", + "path": "docs/self-scoping/workflow.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/semantic-retrieval.md", + "source_refs": [ + { + "fact_id": 38, + "kind": "documentation", + "line": null, + "name": "semantic-retrieval.md", + "path": "docs/semantic-retrieval.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + }, + { + "reference": "docs/terminology.md", + "source_refs": [ + { + "fact_id": 39, + "kind": "documentation", + "line": null, + "name": "terminology.md", + "path": "docs/terminology.md" + } + ], + "status": "candidate", + "strength": "medium", + "type": "documentation" + } + ], + "features": [ + { + "location": "multiple files", + "name": "Use Anthropic Models", + "primary_class": "integration", + "source_refs": [ + { + "fact_id": 197, + "kind": "llm_provider", + "line": null, + "name": "Anthropic", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 202, + "kind": "llm_provider", + "line": null, + "name": "Anthropic", + "path": "src/repo_registry/repo_scanning/scanner.py" + } + ], + "status": "candidate", + "type": "integration" + }, + { + "location": "multiple files", + "name": "Use Claude Models", + "primary_class": "integration", + "source_refs": [ + { + "fact_id": 198, + "kind": "llm_provider", + "line": null, + "name": "Claude", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 203, + "kind": "llm_provider", + "line": null, + "name": "Claude", + "path": "src/repo_registry/repo_scanning/scanner.py" + } + ], + "status": "candidate", + "type": "integration" + }, + { + "location": "multiple files", + "name": "Use Gemini Models", + "primary_class": "integration", + "source_refs": [ + { + "fact_id": 199, + "kind": "llm_provider", + "line": null, + "name": "Gemini", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 204, + "kind": "llm_provider", + "line": null, + "name": "Gemini", + "path": "src/repo_registry/repo_scanning/scanner.py" + } + ], + "status": "candidate", + "type": "integration" + }, + { + "location": "multiple files", + "name": "Use OpenAI Models", + "primary_class": "integration", + "source_refs": [ + { + "fact_id": 200, + "kind": "llm_provider", + "line": null, + "name": "OpenAI", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 205, + "kind": "llm_provider", + "line": null, + "name": "OpenAI", + "path": "src/repo_registry/repo_scanning/scanner.py" + } + ], + "status": "candidate", + "type": "integration" + }, + { + "location": "multiple files", + "name": "Use OpenRouter Models", + "primary_class": "integration", + "source_refs": [ + { + "fact_id": 201, + "kind": "llm_provider", + "line": null, + "name": "OpenRouter", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 206, + "kind": "llm_provider", + "line": null, + "name": "OpenRouter", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 207, + "kind": "llm_provider", + "line": null, + "name": "OpenRouter", + "path": "src/repo_registry/web_api/schemas.py" + } + ], + "status": "candidate", + "type": "integration" + }, + { + "location": "multiple files", + "name": "Configure LLM Provider Credentials", + "primary_class": "configuration", + "source_refs": [ + { + "fact_id": 2, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 3, + "kind": "credential_config", + "line": null, + "name": "Gemini API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 4, + "kind": "credential_config", + "line": null, + "name": "Google API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 5, + "kind": "credential_config", + "line": null, + "name": "OpenAI API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 6, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 7, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "tests/fixtures.py" + }, + { + "fact_id": 8, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/fixtures.py" + }, + { + "fact_id": 9, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_candidate_graph.py" + }, + { + "fact_id": 10, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_content_indexing.py" + }, + { + "fact_id": 11, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "tests/test_repository_scanner.py" + }, + { + "fact_id": 12, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_repository_scanner.py" + }, + { + "fact_id": 13, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "tests/test_scanner_coevolution.py" + }, + { + "fact_id": 14, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_scanner_coevolution.py" + } + ], + "status": "candidate", + "type": "configuration" + }, + { + "location": "src/repo_registry/repo_scanning/scanner.py", + "name": "Maintain LLM Provider Registry", + "primary_class": "backend", + "source_refs": [ + { + "fact_id": 243, + "kind": "provider_registry", + "line": null, + "name": "LLM provider registry", + "path": "src/repo_registry/repo_scanning/scanner.py" + } + ], + "status": "candidate", + "type": "backend" + }, + { + "location": "src/repo_registry/repo_scanning/scanner.py", + "name": "Apply LLM Provider Fallback Policy", + "primary_class": "backend", + "source_refs": [ + { + "fact_id": 42, + "kind": "fallback_policy", + "line": null, + "name": "LLM provider fallback policy", + "path": "src/repo_registry/repo_scanning/scanner.py" + } + ], + "status": "candidate", + "type": "backend" + }, + { + "location": "multiple files", + "name": "HTTP API surface: possible API surface, GET /health, @app.get(, +49 more", + "primary_class": "API", + "source_refs": [ + { + "fact_id": 54, + "kind": "interface", + "line": null, + "name": "possible API surface", + "path": "docs/api-contract.md" + }, + { + "fact_id": 56, + "kind": "interface", + "line": null, + "name": "possible API surface", + "path": "src/repo_registry/web_api/__init__.py" + }, + { + "fact_id": 57, + "kind": "interface", + "line": null, + "name": "possible API surface", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 58, + "kind": "interface", + "line": 173, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 59, + "kind": "interface", + "line": 203, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 60, + "kind": "interface", + "line": 212, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 61, + "kind": "interface", + "line": 226, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 62, + "kind": "interface", + "line": 243, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 63, + "kind": "interface", + "line": 250, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 64, + "kind": "interface", + "line": 265, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 65, + "kind": "interface", + "line": 286, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 66, + "kind": "interface", + "line": 297, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 67, + "kind": "interface", + "line": 324, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 68, + "kind": "interface", + "line": 351, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 69, + "kind": "interface", + "line": 366, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 70, + "kind": "interface", + "line": 382, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 71, + "kind": "interface", + "line": 401, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 72, + "kind": "interface", + "line": 427, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 73, + "kind": "interface", + "line": 450, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 74, + "kind": "interface", + "line": 468, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 75, + "kind": "interface", + "line": 490, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 76, + "kind": "interface", + "line": 513, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 77, + "kind": "interface", + "line": 532, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 78, + "kind": "interface", + "line": 551, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 79, + "kind": "interface", + "line": 570, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 80, + "kind": "interface", + "line": 588, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 81, + "kind": "interface", + "line": 611, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 82, + "kind": "interface", + "line": 634, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 83, + "kind": "interface", + "line": 660, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 84, + "kind": "interface", + "line": 686, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 85, + "kind": "interface", + "line": 712, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 86, + "kind": "interface", + "line": 738, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 87, + "kind": "interface", + "line": 764, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 88, + "kind": "interface", + "line": 790, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 89, + "kind": "interface", + "line": 816, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 90, + "kind": "interface", + "line": 842, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 91, + "kind": "interface", + "line": 868, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 92, + "kind": "interface", + "line": 894, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 93, + "kind": "interface", + "line": 920, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 94, + "kind": "interface", + "line": 946, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 95, + "kind": "interface", + "line": 972, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 96, + "kind": "interface", + "line": 990, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 97, + "kind": "interface", + "line": 1013, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 98, + "kind": "interface", + "line": 1029, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 99, + "kind": "interface", + "line": 1047, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 100, + "kind": "interface", + "line": 1070, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 101, + "kind": "interface", + "line": 1086, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 102, + "kind": "interface", + "line": 1104, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 103, + "kind": "interface", + "line": 1127, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 104, + "kind": "interface", + "line": 1143, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 105, + "kind": "interface", + "line": 1161, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 106, + "kind": "interface", + "line": 1184, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 107, + "kind": "interface", + "line": 1200, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 108, + "kind": "interface", + "line": 1215, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 109, + "kind": "interface", + "line": 1241, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 110, + "kind": "interface", + "line": 1269, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 111, + "kind": "interface", + "line": 1287, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 112, + "kind": "interface", + "line": 1311, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 113, + "kind": "interface", + "line": 1327, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 114, + "kind": "interface", + "line": 1352, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 115, + "kind": "interface", + "line": 1378, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 116, + "kind": "interface", + "line": 1394, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 117, + "kind": "interface", + "line": 1416, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 118, + "kind": "interface", + "line": 1455, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 119, + "kind": "interface", + "line": 1478, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 120, + "kind": "interface", + "line": 1501, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 121, + "kind": "interface", + "line": 1684, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 122, + "kind": "interface", + "line": 1703, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 123, + "kind": "interface", + "line": 1718, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 124, + "kind": "interface", + "line": 1760, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 125, + "kind": "interface", + "line": 1767, + "name": "python route decorator", + "path": "src/repo_registry/web_api/app.py" + }, + { + "fact_id": 126, + "kind": "interface", + "line": null, + "name": "possible API surface", + "path": "src/repo_registry/web_api/schemas.py" + }, + { + "fact_id": 127, + "kind": "interface", + "line": 437, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 128, + "kind": "interface", + "line": 442, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 129, + "kind": "interface", + "line": 537, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 130, + "kind": "interface", + "line": 542, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 131, + "kind": "interface", + "line": 621, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 132, + "kind": "interface", + "line": 652, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 133, + "kind": "interface", + "line": 731, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 134, + "kind": "interface", + "line": 1069, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 135, + "kind": "interface", + "line": 1107, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 136, + "kind": "interface", + "line": 1139, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 137, + "kind": "interface", + "line": 1182, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 138, + "kind": "interface", + "line": 1366, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 139, + "kind": "interface", + "line": 1439, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 140, + "kind": "interface", + "line": 1478, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 141, + "kind": "interface", + "line": 1664, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 142, + "kind": "interface", + "line": 1676, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 143, + "kind": "interface", + "line": 1693, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 144, + "kind": "interface", + "line": 1710, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 145, + "kind": "interface", + "line": 1723, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 146, + "kind": "interface", + "line": 1744, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 147, + "kind": "interface", + "line": 1771, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 148, + "kind": "interface", + "line": 1796, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 149, + "kind": "interface", + "line": 1823, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 150, + "kind": "interface", + "line": 1846, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 151, + "kind": "interface", + "line": 1856, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 152, + "kind": "interface", + "line": 1883, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 153, + "kind": "interface", + "line": 1893, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 154, + "kind": "interface", + "line": 1918, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 155, + "kind": "interface", + "line": 1928, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 156, + "kind": "interface", + "line": 1955, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 157, + "kind": "interface", + "line": 1965, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 158, + "kind": "interface", + "line": 1991, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 159, + "kind": "interface", + "line": 2015, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 160, + "kind": "interface", + "line": 2132, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 161, + "kind": "interface", + "line": 2156, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 162, + "kind": "interface", + "line": 2182, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 163, + "kind": "interface", + "line": 2201, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 164, + "kind": "interface", + "line": 2330, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 165, + "kind": "interface", + "line": 2402, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 166, + "kind": "interface", + "line": 2955, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 167, + "kind": "interface", + "line": 2969, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 168, + "kind": "interface", + "line": 2984, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 169, + "kind": "interface", + "line": 3006, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 170, + "kind": "interface", + "line": 3025, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 171, + "kind": "interface", + "line": 3047, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 172, + "kind": "interface", + "line": 3066, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 173, + "kind": "interface", + "line": 3088, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 174, + "kind": "interface", + "line": 3107, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 175, + "kind": "interface", + "line": 3129, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 176, + "kind": "interface", + "line": 3148, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 177, + "kind": "interface", + "line": 3180, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 178, + "kind": "interface", + "line": 3212, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 179, + "kind": "interface", + "line": 3246, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 180, + "kind": "interface", + "line": 3270, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 181, + "kind": "interface", + "line": 3294, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 182, + "kind": "interface", + "line": 3318, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 183, + "kind": "interface", + "line": 3342, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 184, + "kind": "interface", + "line": 3366, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 185, + "kind": "interface", + "line": 3390, + "name": "python route decorator", + "path": "src/repo_registry/web_ui/views.py" + }, + { + "fact_id": 187, + "kind": "interface", + "line": null, + "name": "possible API surface", + "path": "tests/test_scope_context_api.py" + }, + { + "fact_id": 188, + "kind": "interface", + "line": null, + "name": "possible API surface", + "path": "tests/test_web_api.py" + }, + { + "fact_id": 189, + "kind": "interface", + "line": null, + "name": "possible API surface", + "path": "workplans/RREG-WP-0012-activity-core-context-api.md" + } + ], + "status": "candidate", + "type": "API" + }, + { + "location": "multiple files", + "name": "CLI command surface: CLI command build_parser, CLI command make_service", + "primary_class": "CLI", + "source_refs": [ + { + "fact_id": 55, + "kind": "interface", + "line": null, + "name": "possible CLI", + "path": "src/repo_registry/cli.py" + }, + { + "fact_id": 186, + "kind": "interface", + "line": null, + "name": "possible CLI", + "path": "tests/test_cli.py" + } + ], + "status": "candidate", + "type": "CLI" + } + ], + "name": "Route LLM Requests Across Providers", + "primary_class": "llm-integration", + "source_refs": [ + { + "fact_id": 197, + "kind": "llm_provider", + "line": null, + "name": "Anthropic", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 198, + "kind": "llm_provider", + "line": null, + "name": "Claude", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 199, + "kind": "llm_provider", + "line": null, + "name": "Gemini", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 200, + "kind": "llm_provider", + "line": null, + "name": "OpenAI", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 201, + "kind": "llm_provider", + "line": null, + "name": "OpenRouter", + "path": "src/repo_registry/candidate_graph/normalization.py" + }, + { + "fact_id": 202, + "kind": "llm_provider", + "line": null, + "name": "Anthropic", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 203, + "kind": "llm_provider", + "line": null, + "name": "Claude", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 204, + "kind": "llm_provider", + "line": null, + "name": "Gemini", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 205, + "kind": "llm_provider", + "line": null, + "name": "OpenAI", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 206, + "kind": "llm_provider", + "line": null, + "name": "OpenRouter", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 207, + "kind": "llm_provider", + "line": null, + "name": "OpenRouter", + "path": "src/repo_registry/web_api/schemas.py" + }, + { + "fact_id": 2, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 3, + "kind": "credential_config", + "line": null, + "name": "Gemini API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 4, + "kind": "credential_config", + "line": null, + "name": "Google API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 5, + "kind": "credential_config", + "line": null, + "name": "OpenAI API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 6, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 7, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "tests/fixtures.py" + }, + { + "fact_id": 8, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/fixtures.py" + }, + { + "fact_id": 9, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_candidate_graph.py" + }, + { + "fact_id": 10, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_content_indexing.py" + }, + { + "fact_id": 11, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "tests/test_repository_scanner.py" + }, + { + "fact_id": 12, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_repository_scanner.py" + }, + { + "fact_id": 13, + "kind": "credential_config", + "line": null, + "name": "Anthropic API key", + "path": "tests/test_scanner_coevolution.py" + }, + { + "fact_id": 14, + "kind": "credential_config", + "line": null, + "name": "OpenRouter API key", + "path": "tests/test_scanner_coevolution.py" + }, + { + "fact_id": 243, + "kind": "provider_registry", + "line": null, + "name": "LLM provider registry", + "path": "src/repo_registry/repo_scanning/scanner.py" + }, + { + "fact_id": 42, + "kind": "fallback_policy", + "line": null, + "name": "LLM provider fallback policy", + "path": "src/repo_registry/repo_scanning/scanner.py" + } + ], + "status": "candidate" + } + ], + "name": "Support Repo Scoping", + "primary_class": "repository-intelligence", + "source_refs": [ + { + "fact_id": 53, + "kind": "intent", + "line": null, + "name": "INTENT", + "path": "INTENT.md" + }, + { + "fact_id": 15, + "kind": "documentation", + "line": null, + "name": "README", + "path": "README.md" + }, + { + "fact_id": 16, + "kind": "documentation", + "line": null, + "name": "abstraction-strategy.md", + "path": "docs/abstraction-strategy.md" + }, + { + "fact_id": 17, + "kind": "documentation", + "line": null, + "name": "acceptance-policy.md", + "path": "docs/acceptance-policy.md" + }, + { + "fact_id": 18, + "kind": "documentation", + "line": null, + "name": "adr-dependency-graph-visualization-framework.md", + "path": "docs/adr-dependency-graph-visualization-framework.md" + }, + { + "fact_id": 19, + "kind": "documentation", + "line": null, + "name": "adr-ep-cap-003-vocabulary-ref-guard.md", + "path": "docs/adr-ep-cap-003-vocabulary-ref-guard.md" + }, + { + "fact_id": 20, + "kind": "documentation", + "line": null, + "name": "api-contract.md", + "path": "docs/api-contract.md" + }, + { + "fact_id": 21, + "kind": "documentation", + "line": null, + "name": "characteristic-evidence-model.md", + "path": "docs/characteristic-evidence-model.md" + }, + { + "fact_id": 22, + "kind": "documentation", + "line": null, + "name": "classification-strategy.md", + "path": "docs/classification-strategy.md" + }, + { + "fact_id": 23, + "kind": "documentation", + "line": null, + "name": "dependency-aware-scope-propagation.md", + "path": "docs/dependency-aware-scope-propagation.md" + }, + { + "fact_id": 24, + "kind": "documentation", + "line": null, + "name": "dependency-visualization-exploration.md", + "path": "docs/dependency-visualization-exploration.md" + }, + { + "fact_id": 25, + "kind": "documentation", + "line": null, + "name": "trusted-auto-approval.md", + "path": "docs/migrations/trusted-auto-approval.md" + }, + { + "fact_id": 26, + "kind": "documentation", + "line": null, + "name": "operations.md", + "path": "docs/operations.md" + }, + { + "fact_id": 27, + "kind": "documentation", + "line": null, + "name": "README", + "path": "docs/quality-criteria/README.md" + }, + { + "fact_id": 28, + "kind": "documentation", + "line": null, + "name": "acceptance-quality-criteria.v1.json", + "path": "docs/quality-criteria/acceptance-quality-criteria.v1.json" + }, + { + "fact_id": 29, + "kind": "documentation", + "line": null, + "name": "quality-criteria-registry.schema.json", + "path": "docs/schemas/quality-criteria-registry.schema.json" + }, + { + "fact_id": 30, + "kind": "documentation", + "line": null, + "name": "repo-scope-context-response.json", + "path": "docs/schemas/repo-scope-context-response.json" + }, + { + "fact_id": 31, + "kind": "documentation", + "line": null, + "name": "self-scoping-assessment.schema.json", + "path": "docs/schemas/self-scoping-assessment.schema.json" + }, + { + "fact_id": 32, + "kind": "documentation", + "line": null, + "name": "scope-md-spec.md", + "path": "docs/scope-md-spec.md" + }, + { + "fact_id": 33, + "kind": "documentation", + "line": null, + "name": "README", + "path": "docs/self-scoping/README.md" + }, + { + "fact_id": 34, + "kind": "documentation", + "line": null, + "name": "repo-scoping-known-bad-2026-05-15-run-39.json", + "path": "docs/self-scoping/assessments/repo-scoping-known-bad-2026-05-15-run-39.json" + }, + { + "fact_id": 35, + "kind": "documentation", + "line": null, + "name": "repo-scoping-golden-profile.v1.json", + "path": "docs/self-scoping/golden/repo-scoping-golden-profile.v1.json" + }, + { + "fact_id": 36, + "kind": "documentation", + "line": null, + "name": "README", + "path": "docs/self-scoping/outcomes/README.md" + }, + { + "fact_id": 37, + "kind": "documentation", + "line": null, + "name": "workflow.md", + "path": "docs/self-scoping/workflow.md" + }, + { + "fact_id": 38, + "kind": "documentation", + "line": null, + "name": "semantic-retrieval.md", + "path": "docs/semantic-retrieval.md" + }, + { + "fact_id": 39, + "kind": "documentation", + "line": null, + "name": "terminology.md", + "path": "docs/terminology.md" + } + ], + "status": "candidate" + } + ] + }, + "known_regression_patterns": [ + { + "description": "Generated tree contains Route LLM Requests Across Providers as a repo-scoping capability.", + "detection_hint": "Flag the provider-routing capability unless product intent and public implementation explicitly support it.", + "id": "RREG-SELF-REG-001", + "severity": "critical", + "title": "LLM provider vocabulary promoted as native capability" + }, + { + "description": "API or CLI surface features are nested below provider routing.", + "detection_hint": "Flag API/CLI surface features whose parent capability is llm-integration or provider-routing.", + "id": "RREG-SELF-REG-002", + "severity": "high", + "title": "Native API and CLI surfaces attached under false capability" + } + ], + "notes": [ + "Generated by repo-scoping self-scoping assessment exporter.", + "Artifact has enough engine identity metadata for comparison." + ], + "quality_gate_outcomes": [ + { + "criteria_version": "repo-scoping-quality-criteria/v1", + "criterion_id": "RREG-QC-002", + "criterion_title": "Native Utility Is Repo-Owned", + "element_id": 1, + "element_name": "Route LLM Requests Across Providers", + "element_type": "capability", + "outcome": "downgraded", + "reason": "Provider-routing or LLM-integration vocabulary requires explicit product evidence before it can be native utility.", + "severity": "high" + }, + { + "criteria_version": "repo-scoping-quality-criteria/v1", + "criterion_id": "RREG-QC-003", + "criterion_title": "Feature Fits Parent Capability", + "element_id": 9, + "element_name": "HTTP API surface: possible API surface, GET /health, @app.get(, +49 more", + "element_type": "feature", + "outcome": "requires_review", + "reason": "API/CLI surface is nested below provider-routing or LLM-integration capability.", + "severity": "high" + }, + { + "criteria_version": "repo-scoping-quality-criteria/v1", + "criterion_id": "RREG-QC-003", + "criterion_title": "Feature Fits Parent Capability", + "element_id": 10, + "element_name": "CLI command surface: CLI command build_parser, CLI command make_service", + "element_type": "feature", + "outcome": "requires_review", + "reason": "API/CLI surface is nested below provider-routing or LLM-integration capability.", + "severity": "high" + } + ], + "review_decisions": [ + { + "accepted_after_edits": false, + "action": "quality_gate_evaluation", + "analysis_run_id": 1, + "created_at": "2026-05-15 15:10:24", + "criteria_version": "repo-scoping-quality-criteria/v1", + "criterion_ids": [ + "RREG-QC-002", + "RREG-QC-003" + ], + "decision_kind": "other", + "evidence_refs": [], + "id": 1, + "notes": "criteria_version=repo-scoping-quality-criteria/v1; criteria=RREG-QC-002, RREG-QC-003; outcomes=downgraded:1, requires_review:2; quality_gate_outcomes=3; rationale=Deterministic quality gates flagged candidates for review without approving registry truth.", + "policy_version": "", + "quality_criteria_version": "repo-scoping-quality-criteria/v1", + "rationale": "Deterministic quality gates flagged candidates for review without approving registry truth.", + "repository_id": 1, + "reviewer_id": "", + "reviewer_type": "deterministic-gate" + } + ], + "schema_version": "self-scoping-assessment/v1", + "target_repository": { + "dirty_state": "clean", + "file_count": 136, + "repo_slug": "repo-scoping", + "repository_id": 1, + "source": "/home/worsch/repo-scoping", + "target_branch": "main", + "target_commit": "abcb2cebbcaa448eb960c276c98a0b769fc493a2" + } +} diff --git a/docs/self-scoping/assessments/repo-scoping-post-wp0015-clean-2026-05-15.md b/docs/self-scoping/assessments/repo-scoping-post-wp0015-clean-2026-05-15.md new file mode 100644 index 0000000..293b9a2 --- /dev/null +++ b/docs/self-scoping/assessments/repo-scoping-post-wp0015-clean-2026-05-15.md @@ -0,0 +1,36 @@ +# Self-Scoping Comparison: repo-scoping-challenger-run-1 + +- Status: `regression` +- Golden profile: `repo-scoping-golden-profile-v1` +- Target repo: `repo-scoping` +- Summary: Assessment repeats known or forbidden self-scoping patterns; prefer the golden profile until the engine is corrected. + +## Missing Expected Capabilities +- Explore Dependency And Impact Graphs +- Generate And Maintain SCOPE.md +- Generate Reviewable Candidate Characteristics +- Index Source Content With Provenance +- Provide Scope Context To Downstream Agents +- Register And Track Repositories +- Review And Approve Candidate Characteristics +- Scan Repositories Into Observed Facts +- Search Compare And Export Approved Profiles + +## Forbidden Native Capabilities Present +- Route LLM Requests Across Providers + +## Known Regression Patterns +- `RREG-SELF-REG-001` LLM provider vocabulary promoted as native capability: Generated tree contains Route LLM Requests Across Providers as a repo-scoping capability. +- `RREG-SELF-REG-002` Native API and CLI surfaces attached under false capability: API or CLI surface features are nested below provider routing. + +## Misplaced Features +- `HTTP API surface: possible API surface, GET /health, @app.get(, +49 more` under `Route LLM Requests Across Providers` (API): API/CLI surface is nested below provider-routing capability. +- `CLI command surface: CLI command build_parser, CLI command make_service` under `Route LLM Requests Across Providers` (CLI): API/CLI surface is nested below provider-routing capability. + +## Matched Expected Capabilities +- None + +## Review Hints +- Do not promote this assessment as a preferred baseline. +- Inspect forbidden capabilities and misplaced features first. +- Use the findings as signal for scanner, generator, or acceptance-policy changes. diff --git a/tests/test_self_scoping_artifacts.py b/tests/test_self_scoping_artifacts.py index 70b379c..b8a1e86 100644 --- a/tests/test_self_scoping_artifacts.py +++ b/tests/test_self_scoping_artifacts.py @@ -11,6 +11,13 @@ KNOWN_BAD_PATH = ( / "assessments" / "repo-scoping-known-bad-2026-05-15-run-39.json" ) +POST_WP0015_PATH = ( + ROOT + / "docs" + / "self-scoping" + / "assessments" + / "repo-scoping-post-wp0015-clean-2026-05-15.json" +) GOLDEN_PROFILE_PATH = ( ROOT / "docs" @@ -90,6 +97,26 @@ def test_known_bad_self_scoping_artifact_captures_rejected_regression_seed(): assert artifact["quality_gate_outcomes"] == [] +def test_post_wp0015_self_scoping_artifact_is_cleanly_bound_and_unapproved(): + artifact = load_json(POST_WP0015_PATH) + + paths = artifact["content_chunk_summary"]["paths"] + capability_names = { + capability["name"] + for ability in artifact["generated_tree"]["abilities"] + for capability in ability["capabilities"] + } + criteria = {outcome["criterion_id"] for outcome in artifact["quality_gate_outcomes"]} + + assert artifact["engine_identity"]["release_binding_status"] == "complete" + assert artifact["engine_identity"]["engine_dirty_state"] == "clean" + assert artifact["execution"]["mode"] == "deterministic-only" + assert not any(path.startswith("var/checkouts/") for path in paths) + assert artifact["approved_map"]["abilities"] == [] + assert capability_names == {"Route LLM Requests Across Providers"} + assert criteria == {"RREG-QC-002", "RREG-QC-003"} + + def test_golden_profile_names_expected_native_capabilities_and_forbidden_false_positive(): profile = load_json(GOLDEN_PROFILE_PATH) diff --git a/workplans/RREG-WP-0015-self-assessment-input-hygiene.md b/workplans/RREG-WP-0015-self-assessment-input-hygiene.md index b0872a9..5fc8ebe 100644 --- a/workplans/RREG-WP-0015-self-assessment-input-hygiene.md +++ b/workplans/RREG-WP-0015-self-assessment-input-hygiene.md @@ -4,7 +4,7 @@ type: workplan title: "Self-Assessment Input Hygiene" domain: capabilities repo: repo-scoping -status: active +status: done owner: codex topic_slug: foerster-capabilities created: "2026-05-15" @@ -52,7 +52,7 @@ contribute documentation, language, or LLM-provider facts to the parent repo. ```task id: RREG-WP-0015-T02 -status: todo +status: done priority: high state_hub_task_id: "81bb46e7-01dc-4c14-8a32-1d4d456dc209" ``` @@ -67,11 +67,18 @@ Acceptance criteria: quality issues from approved registry truth. - The artifact/report names make their relationship to WP0014/WP0015 clear. +Implementation note 2026-05-15: captured +`docs/self-scoping/assessments/repo-scoping-post-wp0015-clean-2026-05-15.json` +and the paired Markdown comparison report. The artifact is release-bound to a +clean engine commit, contains zero `var/checkouts/` paths, leaves the approved +map empty, and records quality-gate outcomes `RREG-QC-002` and `RREG-QC-003` +against the remaining provider-routing candidate regression. + ## T03: Triage Remaining Generator Quality Gaps ```task id: RREG-WP-0015-T03 -status: todo +status: done priority: medium state_hub_task_id: "20b6f34e-1d92-407b-84dd-6e3ec7e77eb3" ``` @@ -84,3 +91,12 @@ Acceptance criteria: and quality-gate outcomes. - The next workplan is scoped around generator improvements, not deterministic acceptance. + +Implementation note 2026-05-15: the clean challenger still generates only +`Route LLM Requests Across Providers`, misses all curated expected +repo-scoping capabilities, and misplaces API/CLI surfaces under provider +routing. The approved map remains empty and quality gates flag the candidate +with `RREG-QC-002` and `RREG-QC-003`, so the next slice is generator quality. +Created `RREG-WP-0016 Native Candidate Generation Recovery` to focus on +separating provider vocabulary from native capability seeds and recovering +repo-owned candidate families. diff --git a/workplans/RREG-WP-0016-native-candidate-generation-recovery.md b/workplans/RREG-WP-0016-native-candidate-generation-recovery.md new file mode 100644 index 0000000..1b99dec --- /dev/null +++ b/workplans/RREG-WP-0016-native-candidate-generation-recovery.md @@ -0,0 +1,95 @@ +--- +id: RREG-WP-0016 +type: workplan +title: "Native Candidate Generation Recovery" +domain: capabilities +repo: repo-scoping +status: active +owner: codex +topic_slug: foerster-capabilities +created: "2026-05-15" +updated: "2026-05-15" +--- + +# Native Candidate Generation Recovery + +WP0014 fixed the acceptance boundary: deterministic rules no longer promote bad +candidates into approved registry truth. WP0015 fixed the self-assessment input +set so repo-scoping no longer analyzes runtime checkouts as if they were native +source. + +The clean post-WP0015 challenger still fails the golden profile. It produces one +candidate capability, `Route LLM Requests Across Providers`, and nests native +API/CLI surfaces below that false provider-routing capability. Quality gates now +flag this correctly (`RREG-QC-002`, `RREG-QC-003`) and the approved map remains +empty, but candidate generation still needs to recover the repo's real native +capabilities. + +This workplan is deliberately about generation quality, not acceptance policy. + +## T01: Separate Provider Vocabulary From Native Capability Seeds + +```task +id: RREG-WP-0016-T01 +status: todo +priority: high +``` + +Update deterministic candidate generation so LLM-provider facts and credential +configuration are never enough to create the parent capability for a repository +unless supported by owned product intent/source. + +Acceptance criteria: +- Provider vocabulary can remain evidence or a low-level observed fact. +- Provider vocabulary does not become the dominant parent capability for + repo-scoping's own self-assessment. +- Existing llm-connect-like fixtures that truly model provider adapters remain + explainable through source-role metadata. + +## T02: Generate Native Repo-Scoping Candidate Families + +```task +id: RREG-WP-0016-T02 +status: todo +priority: high +``` + +Use intent, docs, source, tests, and schema files to generate repo-scoping's +expected native candidate families instead of a single provider-routing bucket. + +Initial expected families: +- repository registration and metadata import +- deterministic repository scanning and observed facts +- provenance-aware content indexing +- reviewable candidate characteristic generation +- candidate review/edit/reject/merge/relink/approval workflow +- approved profile search, comparison, export, and gap exploration +- SCOPE.md generation, diffing, validation, and write flows +- dependency graph and impact exploration +- scope context API for downstream agents + +Acceptance criteria: +- Clean self-assessment matches at least a meaningful subset of the golden + expected capabilities. +- API and CLI features attach under native workflow candidates, not provider + routing. +- Candidate source refs cite repo-owned docs/source/tests instead of schema + examples or dependency vocabulary alone. + +## T03: Re-Run Clean Self-Assessment And Compare + +```task +id: RREG-WP-0016-T03 +status: todo +priority: high +``` + +After generator improvements, rerun the clean deterministic self-assessment and +compare it to the golden profile and the post-WP0015 rejected challenger. + +Acceptance criteria: +- The forbidden provider-routing candidate is absent or isolated as rejected / + requires-review evidence rather than a native capability. +- The comparison report shows matched expected capabilities. +- Remaining gaps are captured as generator follow-up, golden-profile update, or + human review notes.