From eed1945105bde252bedad366ccfdcb66a6b6c28f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 17 Sep 2026 01:24:17 +0000 Subject: [PATCH] refactor(contracts): delete retired wire aliases after cutover Internal callers already use the current similar, redundancy, call-chain, symbol-line, and storage-telemetry contracts. Drop the unused compatibility shapes instead of keeping them as tombstone decoders or duplicate fields. Co-authored-by: Zack Jackson --- .../src/primitives/symbol_graph.rs | 2 - .../src/code_index_scheduler/queries.rs | 6 - .../src/code_index_scheduler/tests/serving.rs | 6 +- .../src/retrieval/callable_code.rs | 22 ++- .../src/retrieval/catalog.rs | 11 +- .../tracedecay-contracts/src/retrieval/mod.rs | 28 ++-- .../src/retrieval/primitive_surface.rs | 136 +++++++++--------- .../src/retrieval/requests.rs | 38 ++++- .../src/retrieval/symbol_graph.rs | 3 - .../contracts_suite/catalog_contributions.rs | 12 +- .../src/storage_telemetry_api.rs | 14 -- .../src/handlers/graph/search.rs | 33 +---- .../src/retrieval/execution.rs | 2 - .../tests/canonical_execution_equivalence.rs | 2 - .../schemas/dashboard-contracts.schema.json | 5 - .../codegen/tests/generated-decoders.test.ts | 4 +- dashboard/src/contracts/generated.ts | 1 - .../observatory/ObservatoryPage.dom.test.tsx | 6 - .../observatory/ObservatoryPage.tsx | 2 +- .../observatory/storageModel.test.ts | 1 - .../workspaces/observatory/storageModel.ts | 6 +- dashboard/stories/fixtures/data.ts | 5 - sdks/typescript/src/operations.ts | 8 +- 23 files changed, 166 insertions(+), 187 deletions(-) diff --git a/crates/tracedecay-application/src/primitives/symbol_graph.rs b/crates/tracedecay-application/src/primitives/symbol_graph.rs index 4e0f96db7c..1d91f9e06e 100644 --- a/crates/tracedecay-application/src/primitives/symbol_graph.rs +++ b/crates/tracedecay-application/src/primitives/symbol_graph.rs @@ -1078,8 +1078,6 @@ pub(crate) fn symbol_record( qualified_name: metadata.qualified_name, kind: metadata.kind, file, - start_line_zero_based: metadata.start_line, - end_line_zero_based: end_line, line: metadata.start_line.saturating_add(1), end_line: end_line.saturating_add(1), is_async: metadata.is_async, diff --git a/crates/tracedecay-code-index-runtime/src/code_index_scheduler/queries.rs b/crates/tracedecay-code-index-runtime/src/code_index_scheduler/queries.rs index cd7b95086c..25cabb4f5f 100644 --- a/crates/tracedecay-code-index-runtime/src/code_index_scheduler/queries.rs +++ b/crates/tracedecay-code-index-runtime/src/code_index_scheduler/queries.rs @@ -1157,8 +1157,6 @@ impl NativeRecordReadPortV1 for LatestCompleteCodeIndexV1 { }, |chunk| chunk.anchor.source_span, ), - start_line_zero_based: lineage.start_line, - end_line_zero_based, line, end_line, signature: lineage.signature.clone(), @@ -1208,8 +1206,6 @@ fn graph_projection_symbol_record( kind: metadata.kind, path, span, - start_line_zero_based: metadata.start_line, - end_line_zero_based, line: metadata .start_line .checked_add(1) @@ -1311,8 +1307,6 @@ fn application_symbol_record(record: NativeSymbolRecordV1) -> SymbolPrimitiveRec qualified_name: record.qualified_name, kind: record.kind, file: record.path, - start_line_zero_based: record.start_line_zero_based, - end_line_zero_based: record.end_line_zero_based, line: record.line, end_line: record.end_line, signature: record.signature, diff --git a/crates/tracedecay-code-index-runtime/src/code_index_scheduler/tests/serving.rs b/crates/tracedecay-code-index-runtime/src/code_index_scheduler/tests/serving.rs index cdc2027b5f..95a31307d2 100644 --- a/crates/tracedecay-code-index-runtime/src/code_index_scheduler/tests/serving.rs +++ b/crates/tracedecay-code-index-runtime/src/code_index_scheduler/tests/serving.rs @@ -1054,7 +1054,9 @@ async fn expired_source_proof_reschedules_pending_clone_backfill() { settled.is_ok(), "the source refresh stranded clone backfill: pending_wake={:?} reconcile_in_progress={} source_age={:?} receipts={:?}", registry.pending_wake_micros_for_scope(&scope).await, - registry.reconcile_in_progress_for_test(fixture.path()).await, + registry + .reconcile_in_progress_for_test(fixture.path()) + .await, source_freshness .state .lock() @@ -4542,8 +4544,6 @@ async fn callable_application_operations_consume_exact_lexical_and_graph_owners( assert_eq!(callee.edge_kind, "calls"); assert_eq!(callee.symbol.name, "callee"); assert_eq!(callee.symbol.file, "src/lib.rs"); - assert_eq!(callee.symbol.start_line_zero_based, 13); - assert_eq!(callee.symbol.end_line_zero_based, 13); assert_eq!(callee.symbol.line, 14); assert_eq!(callee.symbol.end_line, 14); } diff --git a/crates/tracedecay-contracts/src/retrieval/callable_code.rs b/crates/tracedecay-contracts/src/retrieval/callable_code.rs index 2e34a2d86c..f094a161fc 100644 --- a/crates/tracedecay-contracts/src/retrieval/callable_code.rs +++ b/crates/tracedecay-contracts/src/retrieval/callable_code.rs @@ -718,8 +718,6 @@ mod tests { "qualified_name": "crate::worker::work", "kind": "function", "file": "src/worker.rs", - "start_line_zero_based": 4, - "end_line_zero_based": 8, "line": 5, "end_line": 9, "signature": null, @@ -730,5 +728,25 @@ mod tests { ) .is_err() ); + assert!( + serde_json::from_str::( + r#"{ + "node_id": "node.fixture", + "name": "work", + "qualified_name": "crate::worker::work", + "kind": "function", + "file": "src/worker.rs", + "start_line_zero_based": 4, + "end_line_zero_based": 8, + "line": 5, + "end_line": 9, + "signature": null, + "is_async": false, + "score": null + }"#, + ) + .is_err(), + "zero-based line fields are not part of the symbol record contract" + ); } } diff --git a/crates/tracedecay-contracts/src/retrieval/catalog.rs b/crates/tracedecay-contracts/src/retrieval/catalog.rs index 3d5e5e5884..f99cc80d80 100644 --- a/crates/tracedecay-contracts/src/retrieval/catalog.rs +++ b/crates/tracedecay-contracts/src/retrieval/catalog.rs @@ -202,10 +202,11 @@ fn primitive_read_surfaces(spec: &PrimitiveReadSpec) -> &'static [BindingSurface } } -/// Similar/redundancy cut over to the family wire schema. Protocol revisions -/// share one (surface, operation) key; `ProtocolRevisionRange` carries the -/// accepted revisions. Do not mint a second binding for the same spelling; -/// `index_bindings` rejects duplicate surface-operation keys. +/// Similar and redundancy expose one current family schema. Callers already +/// use that schema, so the binding is the current protocol revision only — +/// not a revision window for a retired request shape. Do not mint a second +/// binding for the same spelling; `index_bindings` rejects duplicate +/// surface-operation keys. fn clone_family_surface_bindings( capability_id: &CapabilityId, operation: &str, @@ -226,7 +227,7 @@ fn clone_family_surface_bindings( capability_id: capability_id.clone(), surface, operation: SurfaceOperationName::new(operation)?, - protocol_revisions: ProtocolRevisionRange::new(1, 2)?, + protocol_revisions: ProtocolRevisionRange::new(1, 1)?, required_features: Vec::new(), status: BindingStatus::Current, alias_of: None, diff --git a/crates/tracedecay-contracts/src/retrieval/mod.rs b/crates/tracedecay-contracts/src/retrieval/mod.rs index d1c598fd45..d2f663eab1 100644 --- a/crates/tracedecay-contracts/src/retrieval/mod.rs +++ b/crates/tracedecay-contracts/src/retrieval/mod.rs @@ -96,23 +96,21 @@ pub use ports::{ pub use primitive_surface::{ CalleeV1, CalleesResultV1, CalleesSurfaceRequestV1, ContextCodeBlockV1, ContextModeV1, ContextResultV1, ContextSearchMatchV1, ContextSurfaceRequestV1, ImpactNodeV1, ImpactResultV1, - ImpactSurfaceRequestV1, LegacyRedundancySurfaceRequestV1, LegacySimilarSurfaceRequestV1, - MAX_REDUNDANCY_FAMILIES_V1, MAX_REDUNDANCY_PULL_REQUEST_PATHS_V1, MAX_REDUNDANCY_WORK_V1, - NodeDepthSurfaceRequestV1, NodeDetailsV1, NodeExpansionCostV1, NodeResultV1, - NodeSurfaceRequestV1, PortCycleAnchorV1, PortCycleFileV1, PortCycleSymbolV1, PortCycleV1, - PortMatchedSymbolV1, PortOrderLevelV1, PortOrderResultV1, PortOrderSurfaceRequestV1, - PortOrderSymbolV1, PortStatusResultV1, PortStatusSurfaceRequestV1, PortTargetOnlySymbolV1, - PortUnmatchedSymbolV1, PrimitiveFreshnessStateV1, PrimitiveIndexingStateV1, - PrimitiveLaneCompleteV1, PrimitiveLaneStateV1, PrimitiveLaneStatusV1, PrimitiveNotFoundV1, - PrimitiveRecallV1, PrimitiveSearchCoverageV1, PrimitiveSearchFreshnessV1, + ImpactSurfaceRequestV1, MAX_REDUNDANCY_FAMILIES_V1, MAX_REDUNDANCY_PULL_REQUEST_PATHS_V1, + MAX_REDUNDANCY_WORK_V1, NodeDepthSurfaceRequestV1, NodeDetailsV1, NodeExpansionCostV1, + NodeResultV1, NodeSurfaceRequestV1, PortCycleAnchorV1, PortCycleFileV1, PortCycleSymbolV1, + PortCycleV1, PortMatchedSymbolV1, PortOrderLevelV1, PortOrderResultV1, + PortOrderSurfaceRequestV1, PortOrderSymbolV1, PortStatusResultV1, PortStatusSurfaceRequestV1, + PortTargetOnlySymbolV1, PortUnmatchedSymbolV1, PrimitiveFreshnessStateV1, + PrimitiveIndexingStateV1, PrimitiveLaneCompleteV1, PrimitiveLaneStateV1, PrimitiveLaneStatusV1, + PrimitiveNotFoundV1, PrimitiveRecallV1, PrimitiveSearchCoverageV1, PrimitiveSearchFreshnessV1, PrimitiveSymbolLocationV1, PrimitiveUnavailableEvidenceV1, PrimitiveUnavailableStatusV1, RedundancyCoverageV1, RedundancyFamilyV1, RedundancyPartialReasonV1, RedundancyRankingV1, - RedundancyResultV1, RedundancyScopeV1, RedundancySurfaceRequestV1, - RedundancySurfaceRequestWireV1, RenamePreviewNodeV1, RenamePreviewPrimitiveOutcomeV1, - RenamePreviewPrimitiveRequestV1, RenamePreviewPrimitiveResultV1, RenamePreviewReferenceV1, - RenamePreviewTextOnlyMatchV1, SimilarCoverageV1, SimilarFamilyV1, SimilarMatchClassV1, - SimilarOccurrenceV1, SimilarResultV1, SimilarSurfaceRequestV1, SimilarSurfaceRequestWireV1, - SimilarTargetV1, TodoMarkerV1, TodosResultV1, TodosSurfaceRequestV1, + RedundancyResultV1, RedundancyScopeV1, RedundancySurfaceRequestV1, RenamePreviewNodeV1, + RenamePreviewPrimitiveOutcomeV1, RenamePreviewPrimitiveRequestV1, + RenamePreviewPrimitiveResultV1, RenamePreviewReferenceV1, RenamePreviewTextOnlyMatchV1, + SimilarCoverageV1, SimilarFamilyV1, SimilarMatchClassV1, SimilarOccurrenceV1, SimilarResultV1, + SimilarSurfaceRequestV1, SimilarTargetV1, TodoMarkerV1, TodosResultV1, TodosSurfaceRequestV1, }; pub use requests::{ AffectedTestAttributionV1, AffectedTestsRequest, AffectedTestsResult, AnchorExpandRequest, diff --git a/crates/tracedecay-contracts/src/retrieval/primitive_surface.rs b/crates/tracedecay-contracts/src/retrieval/primitive_surface.rs index 0acfd5c1e5..410973b5ac 100644 --- a/crates/tracedecay-contracts/src/retrieval/primitive_surface.rs +++ b/crates/tracedecay-contracts/src/retrieval/primitive_surface.rs @@ -156,31 +156,12 @@ pub struct SimilarSurfaceRequestV1 { pub repository_id: RepositoryId, pub target: SimilarTargetV1, pub match_classes: Vec, - /// Preferred result page size. Accepts legacy `limit` as a wire alias. - #[serde(alias = "limit")] + /// Preferred result page size. pub result_limit: u32, pub work_limit: u32, pub cursor: Option, } -/// Pre-family similar request shape (`{symbol, limit}`) retained for decode -/// so cutover clients get a typed migration error instead of opaque serde noise. -#[derive(Clone, Debug, Deserialize, PartialEq, Eq)] -#[serde(deny_unknown_fields)] -pub struct LegacySimilarSurfaceRequestV1 { - pub symbol: String, - pub limit: Option, -} - -/// Runtime decode envelope for `tracedecay_similar`: current family schema or -/// the retired `{symbol, limit}` spelling. -#[derive(Clone, Debug, Deserialize, PartialEq, Eq)] -#[serde(untagged)] -pub enum SimilarSurfaceRequestWireV1 { - Current(SimilarSurfaceRequestV1), - Legacy(LegacySimilarSurfaceRequestV1), -} - #[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Eq, Serialize)] #[serde(deny_unknown_fields)] pub struct RenamePreviewPrimitiveRequestV1 { @@ -227,35 +208,13 @@ pub struct RedundancySurfaceRequestV1 { pub match_classes: Vec, pub scope: RedundancyScopeV1, pub include_generated_paths: bool, - /// Preferred family page size. Accepts legacy `max_pairs` / `limit` aliases. - #[serde(alias = "max_pairs", alias = "limit")] + /// Preferred family page size. pub family_limit: u32, pub member_limit: u32, pub work_limit: u32, pub cursor: Option, } -/// Pre-family redundancy request shape retained for decode so cutover clients -/// get a typed migration error instead of opaque serde noise. -#[derive(Clone, Debug, Deserialize, PartialEq)] -#[serde(deny_unknown_fields)] -pub struct LegacyRedundancySurfaceRequestV1 { - pub path: Option, - pub min_lines: Option, - pub max_pairs: Option, - pub similarity_threshold: Option, - pub include_naming_only: Option, - pub include_generated_paths: Option, -} - -/// Runtime decode envelope for `tracedecay_redundancy`. -#[derive(Clone, Debug, Deserialize, PartialEq)] -#[serde(untagged)] -pub enum RedundancySurfaceRequestWireV1 { - Current(RedundancySurfaceRequestV1), - Legacy(LegacyRedundancySurfaceRequestV1), -} - #[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Eq, Serialize)] #[serde(deny_unknown_fields)] pub struct TodosSurfaceRequestV1 { @@ -764,7 +723,7 @@ mod tests { ContextModeV1, ContextResultV1, ContextSurfaceRequestV1, PrimitiveFreshnessStateV1, PrimitiveIndexingStateV1, PrimitiveLaneCompleteV1, PrimitiveLaneStatusV1, PrimitiveRecallV1, PrimitiveSearchCoverageV1, PrimitiveSearchFreshnessV1, - RedundancySurfaceRequestWireV1, SimilarSurfaceRequestWireV1, + RedundancySurfaceRequestV1, SimilarSurfaceRequestV1, }; use crate::memory::{FactSearchGraphCoverageV1, FactSearchGraphDegradationV1}; @@ -901,38 +860,77 @@ mod tests { } #[test] - fn similar_and_redundancy_accept_legacy_request_shapes_on_the_wire() { - let legacy_similar = json!({"symbol": "foo", "limit": 5}); - let wire: SimilarSurfaceRequestWireV1 = - serde_json::from_value(legacy_similar).expect("legacy similar decodes"); - assert!(matches!(wire, SimilarSurfaceRequestWireV1::Legacy(_))); - - let legacy_redundancy = json!({ - "path": "src/", - "min_lines": 10, - "max_pairs": 20, - "similarity_threshold": 0.9, - "include_naming_only": false, - "include_generated_paths": true - }); - let wire: RedundancySurfaceRequestWireV1 = - serde_json::from_value(legacy_redundancy).expect("legacy redundancy decodes"); - assert!(matches!(wire, RedundancySurfaceRequestWireV1::Legacy(_))); - + fn similar_and_redundancy_reject_retired_request_shapes() { let current_similar = json!({ "project_id": "project.demo", "repository_id": "repo.demo", "target": {"kind": "symbol_occurrence", "symbol_occurrence_id": "symbol.v1.demo"}, "match_classes": ["conservative_exact"], - "limit": 3, + "result_limit": 3, "work_limit": 100, "cursor": null }); - let wire: SimilarSurfaceRequestWireV1 = serde_json::from_value(current_similar) - .expect("current similar decodes with limit alias"); - match wire { - SimilarSurfaceRequestWireV1::Current(request) => assert_eq!(request.result_limit, 3), - SimilarSurfaceRequestWireV1::Legacy(_) => panic!("expected current family schema"), - } + let request: SimilarSurfaceRequestV1 = + serde_json::from_value(current_similar).expect("current similar schema decodes"); + assert_eq!(request.result_limit, 3); + + assert!( + serde_json::from_value::(json!({"symbol": "foo", "limit": 5})) + .is_err(), + "retired {{symbol, limit}} is not a similar request" + ); + assert!( + serde_json::from_value::(json!({ + "project_id": "project.demo", + "repository_id": "repo.demo", + "target": {"kind": "symbol_occurrence", "symbol_occurrence_id": "symbol.v1.demo"}, + "match_classes": ["conservative_exact"], + "limit": 3, + "work_limit": 100 + })) + .is_err(), + "limit is not an alias of result_limit" + ); + + let current_redundancy = json!({ + "project_id": "project.demo", + "repository_id": "repo.demo", + "match_classes": ["conservative_exact"], + "scope": {"kind": "repository"}, + "include_generated_paths": false, + "family_limit": 4, + "member_limit": 2, + "work_limit": 8, + "cursor": null + }); + let request: RedundancySurfaceRequestV1 = + serde_json::from_value(current_redundancy).expect("current redundancy schema decodes"); + assert_eq!(request.family_limit, 4); + assert!( + serde_json::from_value::(json!({ + "path": "src/", + "min_lines": 10, + "max_pairs": 20, + "similarity_threshold": 0.9, + "include_naming_only": false, + "include_generated_paths": true + })) + .is_err(), + "retired path/min_lines/max_pairs shape is not a redundancy request" + ); + assert!( + serde_json::from_value::(json!({ + "project_id": "project.demo", + "repository_id": "repo.demo", + "match_classes": ["conservative_exact"], + "scope": {"kind": "repository"}, + "include_generated_paths": false, + "max_pairs": 4, + "member_limit": 2, + "work_limit": 8 + })) + .is_err(), + "max_pairs is not an alias of family_limit" + ); } } diff --git a/crates/tracedecay-contracts/src/retrieval/requests.rs b/crates/tracedecay-contracts/src/retrieval/requests.rs index 56b14b4ecd..22e845f864 100644 --- a/crates/tracedecay-contracts/src/retrieval/requests.rs +++ b/crates/tracedecay-contracts/src/retrieval/requests.rs @@ -303,11 +303,9 @@ pub struct QualifiedNamePrimitiveResult { #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[serde(deny_unknown_fields)] pub struct CallChainPrimitiveRequest { - #[serde(alias = "from_id")] pub from_node_id: String, - #[serde(alias = "to_id")] pub to_node_id: String, - #[serde(default = "default_call_chain_depth", alias = "max_depth")] + #[serde(default = "default_call_chain_depth")] pub maximum_depth: u32, } @@ -489,3 +487,37 @@ pub struct PrimitiveInvocation { pub operation: ApplicationOperation, pub request: PrimitiveRequest, } + +#[cfg(test)] +mod tests { + use super::CallChainPrimitiveRequest; + + #[test] + fn call_chain_rejects_retired_field_names() { + let current = serde_json::from_value::(serde_json::json!({ + "from_node_id": "node.from", + "to_node_id": "node.to", + "maximum_depth": 3 + })) + .expect("current call-chain schema decodes"); + assert_eq!(current.maximum_depth, 3); + + for retired in [ + serde_json::json!({ + "from_id": "node.from", + "to_id": "node.to", + "max_depth": 3 + }), + serde_json::json!({ + "from_node_id": "node.from", + "to_node_id": "node.to", + "max_depth": 3 + }), + ] { + assert!( + serde_json::from_value::(retired).is_err(), + "retired call-chain field names are not aliases" + ); + } + } +} diff --git a/crates/tracedecay-contracts/src/retrieval/symbol_graph.rs b/crates/tracedecay-contracts/src/retrieval/symbol_graph.rs index 9279b86741..34342c5e46 100644 --- a/crates/tracedecay-contracts/src/retrieval/symbol_graph.rs +++ b/crates/tracedecay-contracts/src/retrieval/symbol_graph.rs @@ -64,9 +64,6 @@ pub struct SymbolPrimitiveRecord { pub qualified_name: String, pub kind: String, pub file: String, - /// Canonical tree-sitter row retained for compatibility adapters. - pub start_line_zero_based: u32, - pub end_line_zero_based: u32, /// One-based user-facing line. pub line: u32, pub end_line: u32, diff --git a/crates/tracedecay-contracts/tests/contracts_suite/catalog_contributions.rs b/crates/tracedecay-contracts/tests/contracts_suite/catalog_contributions.rs index a45624dd9b..c1af574a6e 100644 --- a/crates/tracedecay-contracts/tests/contracts_suite/catalog_contributions.rs +++ b/crates/tracedecay-contracts/tests/contracts_suite/catalog_contributions.rs @@ -185,7 +185,7 @@ fn verified_graph_mcp_reads_have_application_primitive_admission_identity() { } #[test] -fn similar_and_redundancy_cover_protocol_revisions_on_one_surface_operation() { +fn similar_and_redundancy_use_the_current_protocol_revision_only() { use tracedecay_tool_catalog::BindingStatus; let contribution = primitive_read_contribution().unwrap(); @@ -208,19 +208,19 @@ fn similar_and_redundancy_cover_protocol_revisions_on_one_surface_operation() { assert_eq!(binding.alias_of(), None); assert!( binding.protocol_revisions().contains(1), - "{operation} must accept protocol revision 1" + "{operation} must accept the current protocol revision" ); assert!( - binding.protocol_revisions().contains(2), - "{operation} must accept protocol revision 2" + !binding.protocol_revisions().contains(2), + "{operation} must not keep a retired protocol revision" ); assert_eq!(binding.protocol_revisions().minimum(), 1); - assert_eq!(binding.protocol_revisions().maximum(), 2); + assert_eq!(binding.protocol_revisions().maximum(), 1); } } #[test] -fn application_catalog_snapshot_admits_similar_redundancy_protocol_range() { +fn application_catalog_snapshot_admits_one_similar_redundancy_binding() { tracedecay_contracts::catalog_composition::build_application_catalog_snapshot() .expect("catalog construction must succeed with one binding per surface-operation"); } diff --git a/crates/tracedecay-dashboard-api/src/storage_telemetry_api.rs b/crates/tracedecay-dashboard-api/src/storage_telemetry_api.rs index 3140eb977a..72a4c4a7a5 100644 --- a/crates/tracedecay-dashboard-api/src/storage_telemetry_api.rs +++ b/crates/tracedecay-dashboard-api/src/storage_telemetry_api.rs @@ -67,10 +67,6 @@ pub struct StoreTelemetryEntryV1 { /// Stable store key (the store's file name), or the raw file name when it is /// not a valid [`StoreKeyV1`]. pub store: String, - /// The dashboard's primary role label for the store (`graph` / `memory` / - /// `lcm` / `savings`). Retained for compatibility; see `roles` for the - /// complete set. - pub role: String, /// Every dashboard role served by this one store file. More than one role /// here means the roles share a database, not that a store was duplicated. pub roles: Vec, @@ -177,14 +173,6 @@ impl SampledStoreV1 { _ => None, } } - - /// The dashboard's primary role label for this store. - fn primary_role(&self) -> String { - self.roles - .first() - .cloned() - .unwrap_or_else(|| "store".to_string()) - } } /// The owner-configured soft budget for one store, resolved from configuration. @@ -565,7 +553,6 @@ fn telemetry_entry( }); let budget = budget_dimension(&sampled.store, sample, retention); let growth = growth_dimension(total_bytes, free_bytes); - let role = sampled.primary_role(); let table_growth = table_growth_dimension(TableGrowthTelemetryReadV1::Unsupported { store: StoreKeyV1::new(sanitize_store_key(&sampled.store)) .unwrap_or_else(|_| fallback_store_key()), @@ -573,7 +560,6 @@ fn telemetry_entry( StoreTelemetryEntryV1 { store: sampled.store, - role, roles: sampled.roles, path: sampled.path, read: sampled.read, diff --git a/crates/tracedecay-mcp/src/handlers/graph/search.rs b/crates/tracedecay-mcp/src/handlers/graph/search.rs index 100477fcde..21be7bec82 100644 --- a/crates/tracedecay-mcp/src/handlers/graph/search.rs +++ b/crates/tracedecay-mcp/src/handlers/graph/search.rs @@ -10,11 +10,10 @@ use serde_json::{Value, json}; use tracedecay_code_index::graph_projection::CodeGraphSymbolSummaryV1; use tracedecay_contracts::retrieval::{ ContextCodeBlockV1, ContextModeV1, ContextResultV1, ContextSearchMatchV1, - ContextSurfaceRequestV1, RedundancyScopeV1, RedundancySurfaceRequestWireV1, - RenamePreviewNodeV1, RenamePreviewPrimitiveRequestV1, RenamePreviewPrimitiveResultV1, - RenamePreviewReferenceV1, RenamePreviewTextOnlyMatchV1, SimilarCoverageV1, SimilarFamilyV1, - SimilarMatchClassV1, SimilarOccurrenceV1, SimilarResultV1, SimilarSurfaceRequestWireV1, - SimilarTargetV1, + ContextSurfaceRequestV1, RedundancyScopeV1, RedundancySurfaceRequestV1, RenamePreviewNodeV1, + RenamePreviewPrimitiveRequestV1, RenamePreviewPrimitiveResultV1, RenamePreviewReferenceV1, + RenamePreviewTextOnlyMatchV1, SimilarCoverageV1, SimilarFamilyV1, SimilarMatchClassV1, + SimilarOccurrenceV1, SimilarResultV1, SimilarSurfaceRequestV1, SimilarTargetV1, }; use tracedecay_domain::ExactClass; use tracedecay_domain::errors::{Result, TraceDecayError}; @@ -1038,17 +1037,7 @@ pub async fn handle_find_exact_symbol( #[hotpath::measure(label = "mcp.graph.similar.total")] pub async fn handle_similar(ctx: &McpToolContext<'_>, args: Value) -> Result { - let wire: SimilarSurfaceRequestWireV1 = decode_primitive_request(&args, "tracedecay_similar")?; - let request = match wire { - SimilarSurfaceRequestWireV1::Current(request) => request, - SimilarSurfaceRequestWireV1::Legacy(_) => { - return Err(TraceDecayError::ProjectRoute { - reason_code: "similar-request-schema-retired".to_owned(), - retryable: false, - detail: "tracedecay_similar retired the {symbol, limit} request shape; use the family schema (project_id, repository_id, target, match_classes, result_limit, work_limit). Catalog binding.mcp.similar.v1 covers protocol revisions 1..=2 on one surface-operation key.".to_owned(), - }); - } - }; + let request: SimilarSurfaceRequestV1 = decode_primitive_request(&args, "tracedecay_similar")?; let project_id = request.project_id; let repository_id = request.repository_id; let target = match request.target { @@ -1222,18 +1211,8 @@ fn clone_lane_unavailable_error( #[hotpath::measure(label = "mcp.graph.redundancy.total")] pub async fn handle_redundancy(ctx: &McpToolContext<'_>, args: Value) -> Result { - let wire: RedundancySurfaceRequestWireV1 = + let request: RedundancySurfaceRequestV1 = decode_primitive_request(&args, "tracedecay_redundancy")?; - let request = match wire { - RedundancySurfaceRequestWireV1::Current(request) => request, - RedundancySurfaceRequestWireV1::Legacy(_) => { - return Err(TraceDecayError::ProjectRoute { - reason_code: "redundancy-request-schema-retired".to_owned(), - retryable: false, - detail: "tracedecay_redundancy retired the path/min_lines/max_pairs request shape; use the family schema (project_id, repository_id, match_classes, scope, family_limit, member_limit, work_limit). Catalog binding.mcp.redundancy.v1 covers protocol revisions 1..=2 on one surface-operation key.".to_owned(), - }); - } - }; if request.project_id != ctx.admitted_scope().project_id || request.repository_id != ctx.admitted_scope().repository_id { diff --git a/crates/tracedecay-query/src/retrieval/execution.rs b/crates/tracedecay-query/src/retrieval/execution.rs index 8b3559e448..7ed6f8b97e 100644 --- a/crates/tracedecay-query/src/retrieval/execution.rs +++ b/crates/tracedecay-query/src/retrieval/execution.rs @@ -69,8 +69,6 @@ pub struct NativeSymbolRecordV1 { pub kind: String, pub path: String, pub span: SourceSpan, - pub start_line_zero_based: u32, - pub end_line_zero_based: u32, pub line: u32, pub end_line: u32, pub signature: Option, diff --git a/crates/tracedecay-query/tests/canonical_execution_equivalence.rs b/crates/tracedecay-query/tests/canonical_execution_equivalence.rs index c4a10f9b5c..3fa79fc2e5 100644 --- a/crates/tracedecay-query/tests/canonical_execution_equivalence.rs +++ b/crates/tracedecay-query/tests/canonical_execution_equivalence.rs @@ -208,8 +208,6 @@ impl FixtureRecords { start_byte: 21, end_byte: 89, }, - start_line_zero_based: 6, - end_line_zero_based: 8, line: 7, end_line: 9, signature: Some("pub async fn run_query()".to_owned()), diff --git a/dashboard/codegen/schemas/dashboard-contracts.schema.json b/dashboard/codegen/schemas/dashboard-contracts.schema.json index 2a5350dfe6..1ed9645067 100644 --- a/dashboard/codegen/schemas/dashboard-contracts.schema.json +++ b/dashboard/codegen/schemas/dashboard-contracts.schema.json @@ -21487,10 +21487,6 @@ "$ref": "#/$defs/StorageTelemetryReadV1", "description": "The typed telemetry read: `observed` with a sample, or `unknown` when the\npragma read failed. Never silently healthy." }, - "role": { - "description": "The dashboard's primary role label for the store (`graph` / `memory` /\n`lcm` / `savings`). Retained for compatibility; see `roles` for the\ncomplete set.", - "type": "string" - }, "roles": { "description": "Every dashboard role served by this one store file. More than one role\nhere means the roles share a database, not that a store was duplicated.", "items": { @@ -21517,7 +21513,6 @@ }, "required": [ "store", - "role", "roles", "path", "read", diff --git a/dashboard/codegen/tests/generated-decoders.test.ts b/dashboard/codegen/tests/generated-decoders.test.ts index 181f400330..198ba1ce63 100644 --- a/dashboard/codegen/tests/generated-decoders.test.ts +++ b/dashboard/codegen/tests/generated-decoders.test.ts @@ -17,6 +17,7 @@ import { MemoryStatusV1Schema, MemoryTrustBucketV1Schema, StorageTelemetryPayloadV1Schema, + StoreTelemetryEntryV1Schema, WIRE_SCHEMA_REVISION, } from "../../src/contracts/index.ts"; @@ -246,7 +247,6 @@ describe("wire storage payload decoders", () => { stores: [ { store: "s", - role: "graph", roles: ["graph", "memory"], path: "/p", read: { @@ -287,6 +287,7 @@ describe("wire storage payload decoders", () => { }); expect(parsed.stores[0]!.read.kind).toBe("observed"); expect(parsed.stores[0]!.roles).toEqual(["graph", "memory"]); + expect(StoreTelemetryEntryV1Schema.shape).not.toHaveProperty("role"); // A dashboard read cannot establish its own growth baseline. const growth = parsed.stores[0]!.growth; expect(growth.state).toBe("unknown"); @@ -295,7 +296,6 @@ describe("wire storage payload decoders", () => { it("rejects the retired unsupported budget and absent growth variants", () => { const entry = { store: "s", - role: "graph", roles: ["graph"], path: "/p", read: { kind: "unknown", store: "s" }, diff --git a/dashboard/src/contracts/generated.ts b/dashboard/src/contracts/generated.ts index 20d9bed37d..917d6cd990 100644 --- a/dashboard/src/contracts/generated.ts +++ b/dashboard/src/contracts/generated.ts @@ -5230,7 +5230,6 @@ export const StoreTelemetryEntryV1Schema = z.object({ growth: z.lazy(() => StoreGrowthDimensionV1Schema), path: z.string(), read: z.lazy(() => StorageTelemetryReadV1Schema), - role: z.string(), roles: z.array(z.string()), store: z.string(), table_growth: z.lazy(() => TableGrowthDimensionV1Schema), diff --git a/dashboard/src/workspaces/observatory/ObservatoryPage.dom.test.tsx b/dashboard/src/workspaces/observatory/ObservatoryPage.dom.test.tsx index 8c7283e571..a7fe0db1ac 100644 --- a/dashboard/src/workspaces/observatory/ObservatoryPage.dom.test.tsx +++ b/dashboard/src/workspaces/observatory/ObservatoryPage.dom.test.tsx @@ -769,7 +769,6 @@ function telemetryPayload() { stores: [ { store: 'graph.db', - role: 'graph', roles: ['graph', 'memory'], path: '/project/.tracedecay/graph.db', read: { @@ -798,7 +797,6 @@ function telemetryPayload() { }, { store: 'lcm.db', - role: 'lcm', roles: ['lcm'], path: '/profile/lcm.db', read: { @@ -832,7 +830,6 @@ function telemetryPayload() { }, { store: 'savings.db', - role: 'savings', roles: ['savings'], path: '/profile/savings.db', read: { @@ -860,7 +857,6 @@ function telemetryPayload() { }, { store: 'sessions.db', - role: 'sessions', roles: ['sessions'], path: '/profile/sessions.db', read: { @@ -887,7 +883,6 @@ function telemetryPayload() { }, { store: 'incident.db', - role: 'incident', roles: ['incident'], path: '/profile/incident.db', read: { kind: 'unknown', store: 'incident.db' }, @@ -936,7 +931,6 @@ function telemetryPayload() { function byteOnlyStore() { return { store: 'savings.db', - role: 'savings', roles: ['savings'], path: '/profile/savings.db', read: { diff --git a/dashboard/src/workspaces/observatory/ObservatoryPage.tsx b/dashboard/src/workspaces/observatory/ObservatoryPage.tsx index ad67f354dc..0ed69af7e4 100644 --- a/dashboard/src/workspaces/observatory/ObservatoryPage.tsx +++ b/dashboard/src/workspaces/observatory/ObservatoryPage.tsx @@ -726,7 +726,7 @@ function StoreCard({
- {storeRolesLabel(entry.roles, entry.role)} + {storeRolesLabel(entry.roles)}
{sized ? ( diff --git a/dashboard/src/workspaces/observatory/storageModel.test.ts b/dashboard/src/workspaces/observatory/storageModel.test.ts index 250cf6be88..9c8a32c867 100644 --- a/dashboard/src/workspaces/observatory/storageModel.test.ts +++ b/dashboard/src/workspaces/observatory/storageModel.test.ts @@ -135,7 +135,6 @@ describe('Observatory storage read models', () => { stores: [ { store: 'graph.db', - role: 'graph', roles: ['graph', 'memory'], path: '/profile/graph.db', read: { diff --git a/dashboard/src/workspaces/observatory/storageModel.ts b/dashboard/src/workspaces/observatory/storageModel.ts index b8039218cb..aca392a81d 100644 --- a/dashboard/src/workspaces/observatory/storageModel.ts +++ b/dashboard/src/workspaces/observatory/storageModel.ts @@ -242,9 +242,9 @@ export function tableGrowthOmissionPresentation( /** Every role this one store file serves. More than one means the roles share a * database — not that a store was reported twice. */ -export function storeRolesLabel(roles: string[], role: string): string { - const ordered = roles.length > 0 ? roles : [role]; - return ordered.length > 1 ? `${ordered.join(' · ')} (shared store file)` : ordered.join(' · '); +export function storeRolesLabel(roles: string[]): string { + if (roles.length === 0) return 'role unrecorded'; + return roles.length > 1 ? `${roles.join(' · ')} (shared store file)` : roles.join(' · '); } /** The shared byte magnitudes, joined for a sentence rather than split for a diff --git a/dashboard/stories/fixtures/data.ts b/dashboard/stories/fixtures/data.ts index 0e3d8da4e5..7444270225 100644 --- a/dashboard/stories/fixtures/data.ts +++ b/dashboard/stories/fixtures/data.ts @@ -2193,7 +2193,6 @@ const storageTelemetry = envelope({ // Shared store file: graph + project memory, budget within its soft // limit. A dashboard status read does not create a growth baseline. store: 'graph.db', - role: 'graph', roles: ['graph', 'memory'], path: '/fast/projects/tracedecay/.tracedecay/graph.db', read: { @@ -2224,7 +2223,6 @@ const storageTelemetry = envelope({ { // Over its owner-configured soft limit, with a real overage. store: 'lcm.db', - role: 'lcm', roles: ['lcm'], path: '/home/zack/.tracedecay/lcm.db', read: { @@ -2256,7 +2254,6 @@ const storageTelemetry = envelope({ { // No owner entry: a missing *setting*, never a fabricated pass. store: 'savings.db', - role: 'savings', roles: ['savings'], path: '/home/zack/.tracedecay/savings.db', read: { @@ -2283,7 +2280,6 @@ const storageTelemetry = envelope({ // The configured budget is unreadable, so the budget is unknown — the // dashboard never renders that as "within budget". store: 'sessions.db', - role: 'sessions', roles: ['sessions'], path: '/home/zack/.tracedecay/sessions.db', read: { @@ -2310,7 +2306,6 @@ const storageTelemetry = envelope({ // The pragma read failed: sizes stay null and both dimensions are typed // unknown rather than collapsing to zero. store: 'incident.db', - role: 'incident', roles: ['incident'], path: '/home/zack/.tracedecay/incident.db', read: { kind: 'unknown', store: 'incident.db' }, diff --git a/sdks/typescript/src/operations.ts b/sdks/typescript/src/operations.ts index 3666ae04bb..8feb657574 100644 --- a/sdks/typescript/src/operations.ts +++ b/sdks/typescript/src/operations.ts @@ -665,7 +665,7 @@ export type StartWorkAttemptCommand = { readonly attempt_id: AttemptId; readonly export type StorageStatusHistoryPointV1 = { readonly database_bytes: number; readonly observed_at: number }; export type SymbolGraphScope = { readonly path_prefix?: string | null }; export type SymbolOccurrenceId = string; -export type SymbolPrimitiveRecord = { readonly end_line: number; readonly end_line_zero_based: number; readonly file: string; readonly is_async: boolean; readonly kind: string; readonly line: number; readonly name: string; readonly node_id: string; readonly qualified_name: string; readonly score?: number | null; readonly signature?: string | null; readonly start_line_zero_based: number }; +export type SymbolPrimitiveRecord = { readonly end_line: number; readonly file: string; readonly is_async: boolean; readonly kind: string; readonly line: number; readonly name: string; readonly node_id: string; readonly qualified_name: string; readonly score?: number | null; readonly signature?: string | null }; export type SymbolRelationRecord = { readonly depth?: number | null; readonly dispatch_from?: string | null; readonly dispatch_via_trait: boolean; readonly edge_kind: string; readonly symbol: SymbolPrimitiveRecord }; export type TaskEvidenceLinkV1 = { readonly anchor_id: RetrievalAnchorId; readonly evidence_digest: ManifestDigest; readonly link_id: string; readonly observed_at: UtcMicros; readonly revision: number; readonly task_id: TaskId }; export type TaskHandoffScope = { readonly definition_id: WorkflowDefinitionId; readonly definition_version: number; readonly from_actor_id: ActorId; readonly project_id: ProjectId; readonly repository_id: RepositoryId; readonly run_id: RunId; readonly step_id: WorkflowStepId; readonly task_id: TaskId; readonly thread_id: ThreadId; readonly to_actor_id: ActorId; readonly worktree_id: WorktreeId }; @@ -1936,7 +1936,7 @@ const DEFINITIONS = { StorageStatusHistoryPointV1: {"additionalProperties":false,"properties":{"database_bytes":{"format":"uint64","minimum":0,"type":"integer"},"observed_at":{"format":"int64","type":"integer"}},"required":["observed_at","database_bytes"],"type":"object"}, SymbolGraphScope: {"additionalProperties":false,"description":"Optional narrowing inside the immutable project/repository/worktree scope\ncarried by [`RequestContext`]. A path prefix never establishes identity or\nauthorization.","properties":{"path_prefix":{"type":["string","null"]}},"type":"object"}, SymbolOccurrenceId: {"description":"Strongly typed canonical identity: `SymbolOccurrenceId`.","type":"string"}, - SymbolPrimitiveRecord: {"additionalProperties":false,"properties":{"end_line":{"format":"uint32","minimum":0,"type":"integer"},"end_line_zero_based":{"format":"uint32","minimum":0,"type":"integer"},"file":{"type":"string"},"is_async":{"type":"boolean"},"kind":{"type":"string"},"line":{"description":"One-based user-facing line.","format":"uint32","minimum":0,"type":"integer"},"name":{"type":"string"},"node_id":{"type":"string"},"qualified_name":{"type":"string"},"score":{"format":"double","type":["number","null"]},"signature":{"type":["string","null"]},"start_line_zero_based":{"description":"Canonical tree-sitter row retained for compatibility adapters.","format":"uint32","minimum":0,"type":"integer"}},"required":["node_id","name","qualified_name","kind","file","start_line_zero_based","end_line_zero_based","line","end_line","is_async"],"type":"object"}, + SymbolPrimitiveRecord: {"additionalProperties":false,"properties":{"end_line":{"format":"uint32","minimum":0,"type":"integer"},"file":{"type":"string"},"is_async":{"type":"boolean"},"kind":{"type":"string"},"line":{"description":"One-based user-facing line.","format":"uint32","minimum":0,"type":"integer"},"name":{"type":"string"},"node_id":{"type":"string"},"qualified_name":{"type":"string"},"score":{"format":"double","type":["number","null"]},"signature":{"type":["string","null"]}},"required":["node_id","name","qualified_name","kind","file","line","end_line","is_async"],"type":"object"}, SymbolRelationRecord: {"additionalProperties":false,"properties":{"depth":{"format":"uint32","minimum":0,"type":["integer","null"]},"dispatch_from":{"type":["string","null"]},"dispatch_via_trait":{"type":"boolean"},"edge_kind":{"type":"string"},"symbol":{"$ref":"#/$defs/SymbolPrimitiveRecord"}},"required":["symbol","edge_kind","dispatch_via_trait"],"type":"object"}, TaskEvidenceLinkV1: {"additionalProperties":false,"properties":{"anchor_id":{"$ref":"#/$defs/RetrievalAnchorId"},"evidence_digest":{"$ref":"#/$defs/ManifestDigest"},"link_id":{"type":"string"},"observed_at":{"$ref":"#/$defs/UtcMicros"},"revision":{"format":"uint64","minimum":0,"type":"integer"},"task_id":{"$ref":"#/$defs/TaskId"}},"required":["link_id","revision","task_id","anchor_id","evidence_digest","observed_at"],"type":"object"}, TaskHandoffScope: {"additionalProperties":false,"properties":{"definition_id":{"$ref":"#/$defs/WorkflowDefinitionId"},"definition_version":{"format":"uint64","minimum":1,"type":"integer"},"from_actor_id":{"$ref":"#/$defs/ActorId"},"project_id":{"$ref":"#/$defs/ProjectId"},"repository_id":{"$ref":"#/$defs/RepositoryId"},"run_id":{"$ref":"#/$defs/RunId"},"step_id":{"$ref":"#/$defs/WorkflowStepId"},"task_id":{"$ref":"#/$defs/TaskId"},"thread_id":{"$ref":"#/$defs/ThreadId"},"to_actor_id":{"$ref":"#/$defs/ActorId"},"worktree_id":{"$ref":"#/$defs/WorktreeId"}},"required":["project_id","repository_id","worktree_id","definition_id","definition_version","step_id","task_id","thread_id","run_id","from_actor_id","to_actor_id"],"type":"object"}, @@ -2369,7 +2369,7 @@ const SCHEMAS: readonly CanonicalJsonSchema[] = [ {"$defs":{"BranchStackEdgeV1":DEFINITIONS.BranchStackEdgeV1,"BranchStackId":DEFINITIONS.BranchStackId,"BranchStackNodeV1":DEFINITIONS.BranchStackNodeV1,"BranchStackRevisionId":DEFINITIONS.BranchStackRevisionId,"BranchStackRevisionV1":DEFINITIONS.BranchStackRevisionV1,"BranchStackSourceV1":DEFINITIONS.BranchStackSourceV1,"CommitId":DEFINITIONS.CommitId,"ManifestDigest":DEFINITIONS.ManifestDigest,"MechanicalIntegrationModeV1":DEFINITIONS.MechanicalIntegrationModeV1,"NativeIntegrationDirectionV1":DEFINITIONS.NativeIntegrationDirectionV1,"NativeIntegrationSealedStackSnapshotV1":DEFINITIONS.NativeIntegrationSealedStackSnapshotV1,"NativeIntegrationSelectionBindingV1":DEFINITIONS.NativeIntegrationSelectionBindingV1,"ProjectId":DEFINITIONS.ProjectId,"RefId":DEFINITIONS.RefId,"RepositoryId":DEFINITIONS.RepositoryId,"ResolvedScope":DEFINITIONS.ResolvedScope,"ScopeSetId":DEFINITIONS.ScopeSetId,"ScopeSetRevision":DEFINITIONS.ScopeSetRevision,"StackNodeId":DEFINITIONS.StackNodeId,"WorktreeId":DEFINITIONS.WorktreeId,"WorktreeInventoryEpoch":DEFINITIONS.WorktreeInventoryEpoch,"WorktreeInventorySnapshotId":DEFINITIONS.WorktreeInventorySnapshotId},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"description":"Read-only preflight over one frozen snapshot identity.\n\n`preferred_mode` selects only one of the three fixed mechanical encodings.\nIt cannot change topology, commit order, or the commit set.","properties":{"preferred_mode":{"anyOf":[{"$ref":"#/$defs/MechanicalIntegrationModeV1"},{"type":"null"}],"default":null},"snapshot":{"$ref":"#/$defs/NativeIntegrationSealedStackSnapshotV1"}},"required":["snapshot"],"title":"NativeIntegrationPreflightSurfaceRequest","type":"object"}, {"$defs":{"PageRequest":DEFINITIONS.PageRequest},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"page":{"$ref":"#/$defs/PageRequest"},"qualified_name":{"type":"string"}},"required":["qualified_name","page"],"title":"QualifiedNamePrimitiveRequest","type":"object"}, {"$defs":{"SymbolPrimitiveRecord":DEFINITIONS.SymbolPrimitiveRecord},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"next_cursor":{"description":"Opaque resume token; its bounded string is the public wire form.","type":["string","null"]},"symbols":{"items":{"$ref":"#/$defs/SymbolPrimitiveRecord"},"type":"array"},"total":{"format":"uint64","minimum":0,"type":["integer","null"]}},"required":["symbols"],"title":"QualifiedNamePrimitiveResult","type":"object"}, - {"$defs":{"CommitId":DEFINITIONS.CommitId,"ProjectId":DEFINITIONS.ProjectId,"ProviderId":DEFINITIONS.ProviderId,"RedundancyScopeV1":DEFINITIONS.RedundancyScopeV1,"RepositoryId":DEFINITIONS.RepositoryId,"SimilarMatchClassV1":DEFINITIONS.SimilarMatchClassV1},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"cursor":{"type":["string","null"]},"family_limit":{"description":"Preferred family page size. Accepts legacy `max_pairs` / `limit` aliases.","format":"uint32","minimum":0,"type":"integer"},"include_generated_paths":{"type":"boolean"},"match_classes":{"items":{"$ref":"#/$defs/SimilarMatchClassV1"},"type":"array"},"member_limit":{"format":"uint32","minimum":0,"type":"integer"},"project_id":{"$ref":"#/$defs/ProjectId"},"repository_id":{"$ref":"#/$defs/RepositoryId"},"scope":{"$ref":"#/$defs/RedundancyScopeV1"},"work_limit":{"format":"uint32","minimum":0,"type":"integer"}},"required":["project_id","repository_id","match_classes","scope","include_generated_paths","family_limit","member_limit","work_limit"],"title":"RedundancySurfaceRequestV1","type":"object"}, + {"$defs":{"CommitId":DEFINITIONS.CommitId,"ProjectId":DEFINITIONS.ProjectId,"ProviderId":DEFINITIONS.ProviderId,"RedundancyScopeV1":DEFINITIONS.RedundancyScopeV1,"RepositoryId":DEFINITIONS.RepositoryId,"SimilarMatchClassV1":DEFINITIONS.SimilarMatchClassV1},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"cursor":{"type":["string","null"]},"family_limit":{"description":"Preferred family page size.","format":"uint32","minimum":0,"type":"integer"},"include_generated_paths":{"type":"boolean"},"match_classes":{"items":{"$ref":"#/$defs/SimilarMatchClassV1"},"type":"array"},"member_limit":{"format":"uint32","minimum":0,"type":"integer"},"project_id":{"$ref":"#/$defs/ProjectId"},"repository_id":{"$ref":"#/$defs/RepositoryId"},"scope":{"$ref":"#/$defs/RedundancyScopeV1"},"work_limit":{"format":"uint32","minimum":0,"type":"integer"}},"required":["project_id","repository_id","match_classes","scope","include_generated_paths","family_limit","member_limit","work_limit"],"title":"RedundancySurfaceRequestV1","type":"object"}, {"$defs":{"CodeGenerationId":DEFINITIONS.CodeGenerationId,"ManifestDigest":DEFINITIONS.ManifestDigest,"ProjectId":DEFINITIONS.ProjectId,"RedundancyCoverageV1":DEFINITIONS.RedundancyCoverageV1,"RedundancyFamilyV1":DEFINITIONS.RedundancyFamilyV1,"RedundancyPartialReasonV1":DEFINITIONS.RedundancyPartialReasonV1,"RedundancyRankingV1":DEFINITIONS.RedundancyRankingV1,"RepositoryId":DEFINITIONS.RepositoryId,"SimilarFamilyV1":DEFINITIONS.SimilarFamilyV1,"SimilarMatchClassV1":DEFINITIONS.SimilarMatchClassV1,"SimilarOccurrenceV1":DEFINITIONS.SimilarOccurrenceV1,"SourceSpan":DEFINITIONS.SourceSpan,"SymbolOccurrenceId":DEFINITIONS.SymbolOccurrenceId,"WorktreeId":DEFINITIONS.WorktreeId},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"coverage":{"$ref":"#/$defs/RedundancyCoverageV1"},"families":{"items":{"$ref":"#/$defs/RedundancyFamilyV1"},"type":"array"},"next_cursor":{"type":["string","null"]},"ranked_by":{"$ref":"#/$defs/RedundancyRankingV1"},"source_generation":{"$ref":"#/$defs/CodeGenerationId"}},"required":["source_generation","ranked_by","families","coverage"],"title":"RedundancyResultV1","type":"object"}, {"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"new_name":{"type":["string","null"]},"node_id":{"type":"string"}},"required":["node_id"],"title":"RenamePreviewPrimitiveRequestV1","type":"object"}, {"$defs":{"PrimitiveNotFoundV1":DEFINITIONS.PrimitiveNotFoundV1,"RenamePreviewNodeV1":DEFINITIONS.RenamePreviewNodeV1,"RenamePreviewPrimitiveResultV1":DEFINITIONS.RenamePreviewPrimitiveResultV1,"RenamePreviewReferenceV1":DEFINITIONS.RenamePreviewReferenceV1,"RenamePreviewTextOnlyMatchV1":DEFINITIONS.RenamePreviewTextOnlyMatchV1},"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"$ref":"#/$defs/RenamePreviewPrimitiveResultV1"},{"$ref":"#/$defs/PrimitiveNotFoundV1"}],"title":"RenamePreviewPrimitiveOutcomeV1"}, @@ -2383,7 +2383,7 @@ const SCHEMAS: readonly CanonicalJsonSchema[] = [ {"$defs":{"ClosedUtcIntervalV1":DEFINITIONS.ClosedUtcIntervalV1,"RetainedErrorV1":DEFINITIONS.RetainedErrorV1,"RetainedOutcomeStatusV1":DEFINITIONS.RetainedOutcomeStatusV1,"SessionCoverageIntervalV1":DEFINITIONS.SessionCoverageIntervalV1,"SessionCoverageModeV1":DEFINITIONS.SessionCoverageModeV1,"SessionCoverageReasonV1":DEFINITIONS.SessionCoverageReasonV1,"SessionCoverageRequestV1":DEFINITIONS.SessionCoverageRequestV1,"SessionCoverageStateV1":DEFINITIONS.SessionCoverageStateV1,"SessionRefreshFrontierResultV1":DEFINITIONS.SessionRefreshFrontierResultV1,"SessionRefreshProgressV1":DEFINITIONS.SessionRefreshProgressV1,"SessionRefreshReceiptV1":DEFINITIONS.SessionRefreshReceiptV1,"SessionRefreshTerminalStateResultV1":DEFINITIONS.SessionRefreshTerminalStateResultV1,"SessionSourceCoverageV1":DEFINITIONS.SessionSourceCoverageV1,"TemporalCoverageV1":DEFINITIONS.TemporalCoverageV1,"ValidCoverageIntervalV1":DEFINITIONS.ValidCoverageIntervalV1},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"error":{"anyOf":[{"$ref":"#/$defs/RetainedErrorV1"},{"type":"null"}]},"outcome":{"$ref":"#/$defs/RetainedOutcomeStatusV1"},"progress":{"anyOf":[{"$ref":"#/$defs/SessionRefreshProgressV1"},{"type":"null"}]},"receipt":{"anyOf":[{"$ref":"#/$defs/SessionRefreshReceiptV1"},{"type":"null"}]},"scope":{"type":"string"},"tool":{"type":"string"}},"required":["outcome","scope","tool"],"title":"SessionRefreshStatusResultV1","type":"object"}, {"$defs":{"RetainedOutputFormatV1":DEFINITIONS.RetainedOutputFormatV1,"RetainedTimeFilterV1":DEFINITIONS.RetainedTimeFilterV1,"SessionGitRefV1":DEFINITIONS.SessionGitRefV1,"SessionGitRelationV1":DEFINITIONS.SessionGitRelationV1},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"format":{"anyOf":[{"$ref":"#/$defs/RetainedOutputFormatV1"},{"type":"null"}]},"git_ref":{"$ref":"#/$defs/SessionGitRefV1"},"limit":{"format":"uint64","minimum":0,"type":["integer","null"]},"relation":{"anyOf":[{"$ref":"#/$defs/SessionGitRelationV1"},{"type":"null"}]},"since":{"anyOf":[{"$ref":"#/$defs/RetainedTimeFilterV1"},{"type":"null"}]},"until":{"anyOf":[{"$ref":"#/$defs/RetainedTimeFilterV1"},{"type":"null"}]},"value":{"type":"string"}},"required":["git_ref","value"],"title":"SessionsForRequestV1","type":"object"}, {"$defs":{"CorrelationIndexCountModeV1":DEFINITIONS.CorrelationIndexCountModeV1,"CorrelationIndexV1":DEFINITIONS.CorrelationIndexV1,"RetainedOutcomeStatusV1":DEFINITIONS.RetainedOutcomeStatusV1,"SessionCorrelationHitV1":DEFINITIONS.SessionCorrelationHitV1},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"count":{"format":"uint","minimum":0,"type":"integer"},"git_ref":{"type":["string","null"]},"index":{"anyOf":[{"$ref":"#/$defs/CorrelationIndexV1"},{"type":"null"}]},"index_empty":{"type":["boolean","null"]},"message":{"type":["string","null"]},"observed_count":{"format":"uint","minimum":0,"type":["integer","null"]},"observed_sessions":{"items":{"$ref":"#/$defs/SessionCorrelationHitV1"},"type":["array","null"]},"problem_code":{"type":["string","null"]},"relation":{"type":["string","null"]},"results":{"items":{"$ref":"#/$defs/SessionCorrelationHitV1"},"type":"array"},"since":{"format":"int64","type":["integer","null"]},"status":{"$ref":"#/$defs/RetainedOutcomeStatusV1"},"until":{"format":"int64","type":["integer","null"]},"value":{"type":["string","null"]}},"required":["count","results","status"],"title":"SessionsForResultV1","type":"object"}, - {"$defs":{"ProjectId":DEFINITIONS.ProjectId,"RepositoryId":DEFINITIONS.RepositoryId,"SimilarMatchClassV1":DEFINITIONS.SimilarMatchClassV1,"SimilarTargetV1":DEFINITIONS.SimilarTargetV1,"SourceSpan":DEFINITIONS.SourceSpan,"SymbolOccurrenceId":DEFINITIONS.SymbolOccurrenceId},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"cursor":{"type":["string","null"]},"match_classes":{"items":{"$ref":"#/$defs/SimilarMatchClassV1"},"type":"array"},"project_id":{"$ref":"#/$defs/ProjectId"},"repository_id":{"$ref":"#/$defs/RepositoryId"},"result_limit":{"description":"Preferred result page size. Accepts legacy `limit` as a wire alias.","format":"uint32","minimum":0,"type":"integer"},"target":{"$ref":"#/$defs/SimilarTargetV1"},"work_limit":{"format":"uint32","minimum":0,"type":"integer"}},"required":["project_id","repository_id","target","match_classes","result_limit","work_limit"],"title":"SimilarSurfaceRequestV1","type":"object"}, + {"$defs":{"ProjectId":DEFINITIONS.ProjectId,"RepositoryId":DEFINITIONS.RepositoryId,"SimilarMatchClassV1":DEFINITIONS.SimilarMatchClassV1,"SimilarTargetV1":DEFINITIONS.SimilarTargetV1,"SourceSpan":DEFINITIONS.SourceSpan,"SymbolOccurrenceId":DEFINITIONS.SymbolOccurrenceId},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"cursor":{"type":["string","null"]},"match_classes":{"items":{"$ref":"#/$defs/SimilarMatchClassV1"},"type":"array"},"project_id":{"$ref":"#/$defs/ProjectId"},"repository_id":{"$ref":"#/$defs/RepositoryId"},"result_limit":{"description":"Preferred result page size.","format":"uint32","minimum":0,"type":"integer"},"target":{"$ref":"#/$defs/SimilarTargetV1"},"work_limit":{"format":"uint32","minimum":0,"type":"integer"}},"required":["project_id","repository_id","target","match_classes","result_limit","work_limit"],"title":"SimilarSurfaceRequestV1","type":"object"}, {"$defs":{"CodeGenerationId":DEFINITIONS.CodeGenerationId,"ManifestDigest":DEFINITIONS.ManifestDigest,"ProjectId":DEFINITIONS.ProjectId,"RepositoryId":DEFINITIONS.RepositoryId,"SimilarCoverageV1":DEFINITIONS.SimilarCoverageV1,"SimilarFamilyV1":DEFINITIONS.SimilarFamilyV1,"SimilarMatchClassV1":DEFINITIONS.SimilarMatchClassV1,"SimilarOccurrenceV1":DEFINITIONS.SimilarOccurrenceV1,"SourceSpan":DEFINITIONS.SourceSpan,"SymbolOccurrenceId":DEFINITIONS.SymbolOccurrenceId,"WorktreeId":DEFINITIONS.WorktreeId},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"coverage":{"$ref":"#/$defs/SimilarCoverageV1"},"families":{"items":{"$ref":"#/$defs/SimilarFamilyV1"},"type":"array"},"source":{"$ref":"#/$defs/SimilarOccurrenceV1"},"source_generation":{"$ref":"#/$defs/CodeGenerationId"}},"required":["source","families","source_generation","coverage"],"title":"SimilarResultV1","type":"object"}, {"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"node_id":{"type":"string"}},"required":["node_id"],"title":"SourceBodyPrimitiveRequest","type":"object"}, {"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"body":{"type":"string"},"end_line":{"format":"uint32","minimum":0,"type":"integer"},"file":{"type":"string"},"node_id":{"type":"string"},"start_line":{"format":"uint32","minimum":0,"type":"integer"}},"required":["node_id","file","start_line","end_line","body"],"title":"SourceBodyPrimitiveResult","type":"object"},