Cross-Repository Symbol Search

Cross-Repository Symbol Search: What It Is and Why It Matters for Large Teams

Cross-repository symbol search is the ability to locate, resolve, and trace named code elements functions, variables, classes, fields, procedures, and data structures across multiple codebases simultaneously, with full awareness of how those elements relate to each other. Unlike text-based search, which matches character strings, symbol search understands what the code means structurally: that processPayment in a billing service is the same entity being called from three other repositories, not merely a string that happens to appear in several files. For large engineering teams managing distributed systems, this distinction determines whether a developer can complete a task in minutes or spend hours reconstructing what they need to know from fragments spread across dozens of codebases.

Cross-Repository Symbol Search

Detect hidden dependencies within research execution structures by analyzing cross-system interactions and pipeline behavior.

לחץ כאן

The shift toward microservices, multi-platform architectures, and large application portfolios has made single-repository search fundamentally inadequate. When a shared utility function lives in one repository and is consumed by fifteen others, or when a field defined in a COBOL program flows through JCL jobs and into downstream Java services, text search returns noise. It cannot tell a call site from a comment, a live function from dead code, or a relevant reference from a coincidental string match. The result is a constant tax on developer time: navigating manually between repositories, relying on team members who hold context in their heads, or simply making changes without full knowledge of what they affect. As explored in the context of כלי ניתוח קוד סטטי, the ability to reason across an entire application estate not just individual files is what separates tools built for enterprise scale from those built for individual developers.

Symbol-aware search across repositories changes the nature of development work in large teams. It shifts code navigation from an exploratory, labor-intensive process into a precise, structured query against a unified index that understands the codebase semantically. Every section of this article examines a different dimension of that shift: what symbol search is technically, where it breaks down without the right tooling, and how teams that invest in it recover time, reduce risk, and move faster on complex systems.

תוכן העניינים

What Cross-Repository Symbol Search Actually Means

Symbol search operates at the level of the abstract syntax tree rather than raw text. When a tool indexes a codebase for symbol-aware search, it parses source code into a structural representation that identifies what each piece of code is a function definition, a variable declaration, a class method, a field reference and how it relates to other elements. That structural model is then used to resolve queries: not “find the string getUserById” but “find the definition of the function getUserById and every location that calls it, regardless of which repository it lives in.”

The distinction between text search and symbol search becomes most apparent in large, heterogeneous codebases. A text search for a common field name like accountId across a large enterprise system might return tens of thousands of results spanning comments, documentation strings, variable declarations, call arguments, and test fixtures. Symbol search narrows that to the specific data element and its actual usage across the dependency graph. The difference in signal-to-noise ratio is not a matter of convenience but a matter of whether the search result is actionable at all.

Cross-repository symbol resolution extends this capability across repository boundaries. It requires a unified index that ingests code from multiple repositories, resolves import chains, and understands that a function exported from one package and imported into another is the same symbol not two separate strings. This cross-boundary resolution is where most IDE-based search tools stop. They understand the current project, and sometimes the packages it depends on, but they do not index the downstream consumers of those packages. For teams building shared libraries, platform services, or foundational utilities used across many products, this limitation is significant.

The Difference Between Text Search and Symbol-Aware Search

Text search is a substring matching operation. A query returns any file where the search string appears, including strings that happen to match inside comments, log messages, test data, or documentation. Pattern-based improvements such as regular expressions reduce noise in specific cases but do not resolve the fundamental problem: the tool does not understand what the code means, only what characters appear where.

Symbol-aware search resolves identifiers by parsing the code. It understands that a function defined in module A and imported into module B is a reference to the same entity, that a renamed parameter inside a function body is not a separate symbol, and that a field reference in a COBOL program corresponds to a specific working-storage definition rather than any string with that name. The query result is a set of semantic relationships, not a list of string occurrences.

For large teams, this distinction directly affects how much work each search requires. When a developer needs to find every caller of a function before changing its signature, a text search requires manual filtering of results, disambiguation of similar names, and verification that each result is actually a call site. A symbol search returns the precise set of callers, resolved against the actual dependency graph. The manual work disappears. As examined in ניתוח זרימת נתונים ובקרה, structural understanding of code is the prerequisite for accurate analysis and the same principle applies to search.

What Qualifies as a Symbol Across Languages and Platforms

In modern languages like Java, Python, Go, and TypeScript, symbols include functions, methods, classes, interfaces, variables, and type definitions. In legacy environments, the definition expands considerably. COBOL programs define data names, section labels, paragraph names, and copybook members. JCL environments have procedure names, dataset identifiers, and step references. Databases expose table names, column definitions, stored procedures, and views. Each of these is a named element that can be searched, referenced, and traced and each participates in the broader execution flow of the system.

Cross-repository symbol search in a heterogeneous enterprise environment must handle all of these types. A query that traces where a database field is read cannot stop at the SQL query it must follow the field through the application code that processes it, the batch jobs that feed it, and the downstream services that consume the results. This requires a symbol model that is language-aware across the entire stack, not just within a single runtime or toolchain.

How Symbol Resolution Works Across Repository Boundaries

Symbol resolution across repository boundaries requires an index that ingests all repositories simultaneously and maintains a global graph of relationships. When code in repository B imports a function from repository A, the index records both the export in A and the import in B as references to the same symbol node in the graph. Queries against that graph return results across both repositories, filtered by the actual semantic relationship rather than by text matching.

This unified graph model is what separates purpose-built cross-repository search platforms from general-purpose code search tools. The latter index individual repositories and rely on the user to correlate results manually across multiple searches. The former maintains the relationship graph continuously, so that a query for “all callers of this function” returns results from all consuming repositories in a single operation. This architectural difference determines whether cross-repository search is genuinely usable at enterprise scale or merely theoretically possible.

Why Single-Repository Search Breaks Down at Scale

Engineering teams that rely on repository-native search or IDE-based navigation discover the limits of those tools at predictable inflection points. The first is when the team splits a monolith into separate services, each with its own repository. The second is when shared libraries acquire more consumers than a single team can track. The third is when an acquisition or organizational merger combines multiple independent codebases that must now interoperate. At each of these points, the assumption that all relevant code lives in one place the assumption that single-repository search depends on stops holding.

The cost of that assumption failing is not a one-time migration effort but an ongoing operational tax. Every developer who needs to trace a symbol across repositories pays the cost of manual navigation, context reconstruction, and uncertainty about whether they found everything. As examined in the analysis of distributed systems and static analysis, extensive codebases spread across multiple repositories and services introduce structural search challenges that become performance bottlenecks at scale.

The Multi-Repository Reality of Enterprise Systems

Enterprise systems are not built to fit neatly inside a single repository. They evolve through team growth, organizational changes, technology migrations, vendor integrations, and compliance requirements that introduce new systems alongside existing ones. A financial institution running mainframe batch processes alongside Java microservices and cloud functions does not have the option of consolidating everything into one repository for search convenience. The repository boundaries reflect real organizational and technical distinctions that cannot be erased.

Microservices architectures formalize this distribution. Each service has its own repository, its own deployment pipeline, and its own team. Shared libraries, API contracts, and data models connect those services but the connections themselves are represented as cross-repository dependencies that repository-native search tools cannot resolve. A developer modifying a shared API must know who calls it. Without cross-repository symbol search, the only options are asking other teams, reading documentation that may be outdated, or making the change and discovering the broken consumers in CI.

Large organizations also deal with code across multiple version control systems. Mainframe source may live in a separate catalog or version control system, while distributed services use Git. Web applications may be in a different Git hosting platform from the infrastructure code. Cross-repository symbol search requires a tool that ingests from all of these sources and builds a unified index a capability that platform-native search tools, which are limited to their own hosting environment, cannot provide.

What Happens When Teams Rely on Text Search and grep

grep and its equivalents are not symbol-aware. They match text and return file locations. For exploratory tasks in small, single-language codebases, this is often sufficient. For any task that requires understanding how code elements relate across a large, multi-language system, text search introduces systematic errors in both directions: too many results that require manual filtering, and missed results where the relevant code uses different naming conventions, aliasing, or indirect references.

The manual filtering cost compounds at scale. A developer who spends fifteen minutes disambiguating grep results for a simple function call lookup is not experiencing a minor inconvenience they are experiencing a structural tax that applies to every task requiring cross-codebase navigation. Multiply that across a team of fifty developers performing several such lookups per day, and the aggregate cost becomes a measurable constraint on development velocity.

The missed-result problem is more serious than the noise problem. When a developer misses a call site during a refactoring operation, the consequence is a runtime error in a system that was not touched during testing. When a developer misses a reference to a deprecated field during a data migration, the consequence may be data corruption in a downstream system. Text search does not guarantee completeness, and in large codebases with complex dependency structures, incompleteness is the norm rather than the exception.

Context Loss and Coordination Overhead Across Team Boundaries

When symbol resolution requires human coordination rather than tooling, the cost extends beyond individual developer time. It creates dependencies between teams that slow down decision-making, introduces latency into changes that should be straightforward, and concentrates knowledge in the individuals who happen to know which repositories contain relevant code.

Teams that own shared libraries or foundational services deal with this constantly. Every change to a public interface requires either contacting all consuming teams to verify impact, or accepting risk that unknown consumers will be broken. Teams that consume shared libraries face the inverse problem: when they observe unexpected behavior, they cannot easily determine whether the issue originates in their code or in a dependency in another repository. Both cases require cross-repository visibility that text search cannot provide.

The Specific Scenarios Where Cross-Repository Symbol Search Matters Most

The value of cross-repository symbol search is most visible in high-stakes, time-sensitive situations where incomplete information has direct consequences. These are not edge cases for large teams they are routine conditions of operating distributed systems at scale.

Security Vulnerability Remediation Across Distributed Dependencies

When a vulnerability is discovered in a shared library, framework, or utility function, the immediate question is: which systems are affected? In a multi-repository environment, answering that question requires knowing which repositories depend on the vulnerable component and, more specifically, which versions they use and which code paths actually invoke the vulnerable functionality.

Text search cannot answer this reliably. Symbol search can because the index already contains the dependency relationships. A query for all consumers of a specific function or all importers of a specific package returns results across every indexed repository, filtered by actual usage. Security teams can identify affected systems in minutes rather than days, prioritize remediation based on actual exposure rather than theoretical dependency, and verify completeness of patching rather than hoping they found every case.

Safe Refactoring of Shared Functions and Interfaces

Refactoring a function used only within a single repository is a contained operation: find the callers within the repository, update them, test, and deploy. Refactoring a function exported from a shared library and consumed across dozens of repositories is a fundamentally different task. Without cross-repository symbol search, the developer modifying the function has no reliable way to know the full set of callers. With it, the complete call graph is immediately available. As discussed in the context of code refactoring and maintainability, safe restructuring depends directly on knowing what will be affected before making changes and at multi-repository scale, that knowledge requires purpose-built tooling.

Safe refactoring across repositories requires understanding not just which repositories call a function but how they call it: with what arguments, under what conditions, expecting what return behavior. Symbol search provides the entry point for that analysis the complete set of call sites after which impact analysis can determine the scope of change required. Without the entry point, the entire downstream analysis is blocked.

Onboarding Engineers to Multi-Team, Multi-Language Systems

A new engineer joining a team that owns one service in a larger distributed system needs to understand not just their service but how it connects to the rest of the system. Where does input data originate? Which services consume this service’s output? Which functions in this repository are called by external consumers and therefore cannot be changed without coordination?

These are cross-repository questions that cannot be answered by reading code in a single repository. An engineer who must answer them through documentation, team knowledge, or exploratory text search will spend weeks building a mental model that cross-repository symbol search can provide in hours. The ability to query “what calls this function” and “what does this function call” across the entire system, with results that are precise and complete, compresses the onboarding timeline and reduces dependence on tribal knowledge.

Tracing Execution Paths Across Services and Data Layers

Production incidents in distributed systems typically require tracing an execution path from the point of failure back through multiple services to identify the origin of the problem. That tracing exercise is primarily a symbol resolution task: find what called the failing function, what called that, and what data was passed at each step. When those steps cross repository boundaries as they commonly do in microservices architectures the tracing requires cross-repository symbol resolution.

Without it, the trace requires switching between multiple codebases, searching each one independently, and mentally connecting the results. With it, the trace follows the call graph directly from the point of failure through however many repositories the path crosses, until the root cause is identified. The reduction in mean time to resolution for production incidents in multi-service systems is one of the most direct and measurable benefits of cross-repository symbol search.

What Makes Symbol Search Different in Multi-Language Environments

Multi-language environments introduce a specific challenge that cross-repository symbol search must address: the concept of a “symbol” differs significantly between languages, and relationships between symbols in different languages require a bridge model that understands both sides of the boundary.

In a system where a Java service calls a COBOL program through a defined interface, the Java side has methods, classes, and parameters. The COBOL side has paragraphs, sections, and data names. A symbol search tool that indexes both must represent the relationship between a Java method call and the COBOL paragraph it invokes as a single cross-language dependency not as two separate symbol graphs that happen to share a string at a boundary.

This is a significantly harder indexing problem than single-language symbol resolution. It requires language-specific parsers for every language in the system, a unified symbol model that can represent elements from any of those languages, and a dependency resolution layer that understands how different languages interact at runtime and data-exchange boundaries. Tools that claim cross-language support but implement it as parallel single-language indexes with text-matched boundaries will produce incorrect results at those boundaries exactly the places where developers need accuracy most. As explored through the lens of reducing mean time to resolution with code indexing, unified visibility across languages is the prerequisite for accurate cross-system analysis.

AST-Aware Indexing Versus Pattern Matching in Heterogeneous Codebases

Abstract syntax tree indexing parses source code into a language-specific structural representation before building the symbol index. The parser understands the grammar of the language what constitutes a function definition, a variable declaration, a type reference and uses that understanding to extract symbols with their correct identities and relationships.

Pattern matching, even sophisticated pattern matching, works on text. It can be tuned to approximate symbol-aware behavior in controlled single-language environments, but in heterogeneous codebases it degrades unpredictably at language boundaries. The same identifier in two different languages may have the same string but completely different meanings and relationships. AST-aware indexing resolves each according to the rules of its language; pattern matching cannot reliably distinguish them.

Cross-Language Symbol Resolution in Legacy and Modern Stacks

Legacy enterprise systems create cross-language dependencies that are particularly difficult to resolve correctly because the languages involved COBOL, PL/I, JCL, Assembler have different conventions for naming, referencing, and invoking code elements. A COBOL field defined in a copybook and referenced in a program is a different relationship than a Java field defined in a class and referenced in a method, even though both are “a field being used.” Correct cross-language symbol resolution requires understanding both.

This matters most in environments where mainframe code and modern application code share data and execution. When a COBOL batch job populates a table that a Java service reads, the dependency between the COBOL data definition and the Java column reference is a cross-language, cross-repository symbol relationship. Tracing it requires a tool that understands both languages deeply enough to represent that relationship in a unified index and resolve queries against it.

Handling Version Divergence and Platform-Specific Symbol Conventions

In large multi-repository systems, different repositories often depend on different versions of shared libraries. This means the same symbol may have different signatures, behaviors, or even existence depending on which version of a dependency is in scope. Cross-repository symbol search must be version-aware: a query for all callers of a function must know which version of the library each caller depends on, so that version-specific differences in the function’s interface are correctly accounted for.

Platform-specific conventions add another dimension. Mainframe environments use naming conventions eight-character identifiers, section-based organization, copy library references that differ significantly from conventions in distributed service environments. A symbol search tool that imposes a single naming model across platforms will produce indexing errors in the environments where its model does not fit.

איך SMART TS XL Delivers Cross-Repository Symbol Search for Enterprise Teams

SMART TS XL is built around the premise that understanding a large, heterogeneous software system requires unified visibility across all of its components not just the parts that happen to use common tooling. Its indexing approach ingests source code from mainframe platforms, distributed systems, databases, and modern application environments into a single analysis repository. From that unified index, it resolves symbol relationships across language and repository boundaries, providing the search and navigation capabilities that multi-language, multi-platform enterprise teams require.

The platform’s Software Intelligence technology builds a cross-reference graph that connects every named element in the indexed system to every other element it relates to. Functions, fields, programs, procedures, tables, copybooks, datasets, and documents are all nodes in that graph. The edges represent semantic relationships: calls, references, definitions, data flow, and inheritance. Queries against that graph return results that reflect the actual structure of the system, not the result of text matching against source files stored in separate silos. As described on the enterprise search solutions page, the platform is designed to search the entire application portfolio for everywhere a field is used, find every instance of a referenced item, and identify areas of business logic critical to the enterprise.

Unified Symbol Indexing Across Languages, Platforms, and Repositories

SMART TS XL ingests source code from any platform and any language and builds a unified cross-reference index from the result. COBOL programs, JCL job streams, Java services, .NET applications, Python scripts, SQL procedures, and database schemas are all indexed using language-specific parsers that produce a common graph representation. That graph is what makes cross-language, cross-repository queries possible: every symbol from every source is represented in the same index, with relationships resolved across language boundaries.

This means a query for a data field defined in a COBOL copybook returns not just the programs that reference the copybook, but the JCL jobs that invoke those programs, the database tables that store the field’s values, and the downstream application code that reads those values. The query traverses language boundaries automatically because the index represents the complete dependency graph, not a collection of language-specific partial graphs.

Call Chain Tracing and Symbol Navigation Across Repository Boundaries

Call chain tracing answers the question “what calls this, and what does that call, down to the root?” at any level of the system. For a shared function that is called from multiple services, each of which may itself be called from other services, the call chain is a tree that may span many repositories. SMART TS XL resolves that tree in the indexed graph and presents the result as a navigable structure, so developers can trace execution paths without manually switching between repositories and running separate searches in each.

This is the core navigational capability that cross-repository symbol search enables. Developers navigating complex execution paths, architects assessing the blast radius of a proposed change, and security analysts tracing the path of data through the system all need this capability. The alternative reconstructing call chains manually through repository hopping is the dominant source of the context-switching cost that erodes development velocity in distributed systems. The value of eliminating that cost is illustrated in גרף תלות להפחתת סיכונים, where mapping component interconnections is foundational to managing change safely.

Impact Analysis Starting from a Single Symbol

Impact analysis is the process of determining what will be affected if a specific symbol is changed, renamed, or removed. At repository scale, impact analysis is bounded and manageable most IDEs provide it for well-understood languages. At multi-repository scale, it requires a cross-repository symbol index: you cannot determine impact on repositories you have not indexed, and you cannot index repositories you do not have visibility into.

SMART TS XL performs impact analysis from any symbol across the entire indexed system. A change to a shared function, a data field in a copybook, or a database column triggers an analysis that traces the dependency graph from that symbol outward, identifying every component that will be affected at every level of the dependency tree. The result is presented as a cross-reference report that shows impact by repository, by program, and by specific reference location. This capability is central to the impact analysis solutions that IN-COM provides for enterprise modernization the ability to know before making a change exactly what that change will touch.

Organizational Benefits for Large Teams Beyond Individual Productivity

The case for cross-repository symbol search is often made at the individual developer level: faster searches, less context switching, quicker onboarding. These benefits are real. But the organizational case extends further, into areas that affect team structure, release risk, and the long-term cost of maintaining complex systems.

Reducing Coordination Overhead and Tribal Knowledge Dependency

Large engineering organizations develop informal networks of knowledge about how their systems are connected. Certain engineers know which repositories consume a shared library. Certain architects know which services share a database table. Certain long-tenured developers know the history of a field definition that has been refactored multiple times. When this knowledge lives in people rather than tooling, it creates structural fragility: key personnel become bottlenecks, team velocity depends on who is available, and organizational knowledge erodes as team composition changes.

Cross-repository symbol search transfers knowledge from people to the index. The question “which repositories call this function?” has an answer that does not depend on who is in the room. The question “where is this field defined and where is it used?” has a precise answer derivable from the index rather than from memory. This reduction in knowledge centralization does not eliminate the value of experienced engineers, but it removes a category of bottleneck that grows more expensive as systems scale.

Faster Incident Response When Tracing Cross-Service Failures

Production incidents in multi-service systems require cross-system tracing under time pressure. The ability to follow a call chain from a failing endpoint through its upstream dependencies and identify the source of unexpected behavior is precisely what cross-repository symbol search provides and it provides it in the time frame that incident response demands.

Teams without this capability rely on log correlation, manual code reading, and inter-team communication to trace cross-service failures. Each of these approaches introduces latency that extends the incident window. Teams with cross-repository symbol search can begin tracing from the point of failure immediately, following the call graph through however many repositories the execution path spans. The reduction in mean time to recovery for production incidents in distributed systems is one of the clearest quantitative benefits of this capability.

Supporting Safe Modernization Through Symbol-Level Dependency Understanding

Legacy modernization the process of migrating, refactoring, or replacing components in a large existing system requires knowing what each component connects to before changing it. This is not a new observation, but it becomes substantially more difficult when the connections span multiple repositories, languages, and platforms. As analyzed in dependency topology and modernization sequencing, dependency structure directly determines what can be changed independently and what must be coordinated across system boundaries.

Symbol-level dependency understanding provides the precision that modernization requires. Knowing that a data field is referenced in 47 specific locations across 12 repositories is more actionable than knowing that a system “has many consumers.” It identifies exactly what must be updated during a migration, exactly what must be tested, and exactly what can be left unchanged. This precision reduces the risk of incomplete migrations and the cost of discovering downstream breakage after deployment.

Comparing Approaches: Native Search, IDE Extensions, and Purpose-Built Symbol Search

Teams evaluating cross-repository symbol search typically begin with the tools they already have native platform search and IDE-based navigation and discover their limitations as system complexity grows. Understanding where each approach stops working clarifies what purpose-built cross-repository search adds.

Limitations of Native GitHub and GitLab Symbol Search

GitHub Code Search and GitLab Exact Code Search both support symbol search within their respective platforms. They have improved significantly in precision and support for cross-repository queries within their ecosystems. The fundamental limitation shared by both is platform scope: they index only the repositories hosted on their platform. Organizations using multiple version control systems for example, Git for application code and a mainframe source control system for legacy programs cannot achieve unified search through either platform. Organizations that use both GitHub and GitLab face two separate, non-interoperable indexes.

For organizations whose code is entirely within a single Git hosting platform, native search provides meaningful cross-repository capability at no additional tooling cost. For organizations with heterogeneous source control environments, or with significant legacy code bases outside the Git ecosystem, native platform search provides visibility into only a fraction of the system.

IDE-Based Search and Its Repository Boundary Constraints

IDE-based code navigation is the most commonly used form of symbol search. Every major IDE provides go-to-definition, find-references, and call hierarchy features that work well within the scope of a single project or workspace. These features are well-integrated into developer workflow and require no additional tooling.

The limitation is workspace scope. An IDE understands the project currently open and the packages it depends on typically resolved from a package manager. It does not index downstream consumers: the other repositories that depend on the current project’s exported symbols. This means find-references in an IDE returns results within the current project, not across the ecosystem of repositories that consume it. For library authors, platform engineers, and anyone working on foundational code, this is a significant gap.

IDE extensions that connect to external symbol databases can extend this capability, but they depend on the quality and coverage of the underlying index. An IDE extension connected to a platform-limited index inherits that index’s limitations.

When Purpose-Built Cross-Repository Search Is the Right Investment

Purpose-built cross-repository search platforms earn their place when the cost of the alternatives manual coordination, incomplete searches, extended incident resolution exceeds the cost of the tooling. For small teams working entirely within a single version control platform and a single programming language, native tools may be sufficient. For large teams managing distributed systems across multiple repositories, multiple languages, and multiple platforms, the compounding daily cost of working without cross-repository symbol search typically exceeds the cost of purpose-built tooling quickly and continues to grow as the system does.

The decision is also shaped by risk tolerance. Teams operating systems where a missed symbol reference during a refactoring or migration can cause production failures in dependent services face a qualitatively different risk profile from teams where all changes are fully contained within one repository. That risk profile is what makes cross-repository symbol search a foundational capability rather than an optimization for organizations running complex, interconnected systems at scale.

Cross-Repository Symbol Search as a Foundation for Codebase Visibility

Cross-repository symbol search is not a feature layered onto an existing development workflow it is the foundation on which accurate, complete knowledge of a large codebase rests. Without it, every task that requires understanding how code elements connect across repository boundaries carries a hidden cost: the cost of reconstructing what the index would have provided automatically.

For large engineering teams, that cost is structural. It appears in the time developers spend navigating between repositories manually, in the incidents caused by incomplete refactoring, in the onboarding delays that result from undocumented cross-service dependencies, and in the coordination overhead that grows as the number of repositories and teams increases. These costs do not plateau as the system grows; they scale with complexity.

Purpose-built cross-repository symbol search, combined with cross-language indexing and impact analysis, converts these structural costs into recoverable time. Developers navigate the system through an index rather than through manual exploration. Changes are assessed against a complete dependency graph rather than an assumed one. Incidents are traced along the call chain rather than through inter-team communication. The cumulative effect is a development organization that can reason accurately about its system and act on that reasoning without the friction that impedes teams operating without this visibility.