Files
gitlore/docs/ideas/impact-graph.md
Taylor Eernisse 4185abe05d docs: add feature ideas catalog, time-decay scoring plan, and timeline issue doc
Ideas catalog (docs/ideas/): 25 feature concept documents covering future
lore capabilities including bottleneck detection, churn analysis, expert
scoring, collaboration patterns, milestone risk, knowledge silos, and more.
Each doc includes motivation, implementation sketch, data requirements, and
dependencies on existing infrastructure. README.md provides an overview and
SYSTEM-PROPOSAL.md presents the unified analytics vision.

Plans (plans/): Time-decay expert scoring design with four rounds of review
feedback exploring decay functions, scoring algebra, and integration points
with the existing who-expert pipeline.

Issue doc (docs/issues/001): Documents the timeline pipeline bug where
EntityRef was missing project context, causing ambiguous cross-project
references during the EXPAND stage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:16:48 -05:00

3.1 KiB

Cross-Project Impact Graph

  • Command: lore impact-graph [--format json|dot|mermaid]
  • Confidence: 75%
  • Tier: 3
  • Status: proposed
  • Effort: medium — aggregation over entity_references, graph output formatting

What

Aggregate entity_references by project pair to produce a weighted adjacency matrix showing how projects reference each other. Output as JSON, DOT, or Mermaid for visualization.

Why

Makes invisible architectural coupling visible. "Backend and frontend repos have 47 cross-references this quarter" tells you about tight coupling that may need architectural attention.

Data Required

All exists today:

  • entity_references (source/target entity IDs)
  • issues / merge_requests (project_id for source/target)
  • projects (path_with_namespace)

Implementation Sketch

-- Project-to-project reference counts
WITH ref_projects AS (
    SELECT
        CASE er.source_entity_type
            WHEN 'issue' THEN i_src.project_id
            WHEN 'merge_request' THEN mr_src.project_id
        END as source_project_id,
        CASE er.target_entity_type
            WHEN 'issue' THEN i_tgt.project_id
            WHEN 'merge_request' THEN mr_tgt.project_id
        END as target_project_id,
        er.reference_type
    FROM entity_references er
    LEFT JOIN issues i_src ON er.source_entity_type = 'issue' AND er.source_entity_id = i_src.id
    LEFT JOIN merge_requests mr_src ON er.source_entity_type = 'merge_request' AND er.source_entity_id = mr_src.id
    LEFT JOIN issues i_tgt ON er.target_entity_type = 'issue' AND er.target_entity_id = i_tgt.id
    LEFT JOIN merge_requests mr_tgt ON er.target_entity_type = 'merge_request' AND er.target_entity_id = mr_tgt.id
    WHERE er.target_entity_id IS NOT NULL  -- resolved references only
)
SELECT
    p_src.path_with_namespace as source_project,
    p_tgt.path_with_namespace as target_project,
    er.reference_type,
    COUNT(*) as weight
FROM ref_projects rp
JOIN projects p_src ON rp.source_project_id = p_src.id
JOIN projects p_tgt ON rp.target_project_id = p_tgt.id
WHERE rp.source_project_id != rp.target_project_id  -- cross-project only
GROUP BY p_src.path_with_namespace, p_tgt.path_with_namespace, er.reference_type
ORDER BY weight DESC;

Output Formats

Mermaid

graph LR
    Backend -->|closes 23| Frontend
    Backend -->|mentioned 47| Infrastructure
    Frontend -->|mentioned 12| Backend

DOT

digraph impact {
    "group/backend" -> "group/frontend" [label="closes: 23"];
    "group/backend" -> "group/infra" [label="mentioned: 47"];
}

Downsides

  • Requires multiple projects synced; limited value for single-project users
  • "Mentioned" references are noisy (high volume, low signal)
  • Doesn't capture coupling through shared libraries or APIs (code-level coupling)

Extensions

  • lore impact-graph --since 90d — time-scoped coupling analysis
  • lore impact-graph --type closes — only meaningful reference types
  • Include unresolved references to show dependencies on un-synced projects
  • Coupling trend: is cross-project coupling increasing over time?