fix: honest empty state and edge labels in influence projects view
What
The Influence tab's Projects ego view showed "No project membership data available." when a selected user had no project-linked edges. That reads as a collection failure. It isn't: renderEgoProjects filters state.connections for type === "membership", and those edges aren't project memberships.
ComputeConnections derives them from merge request authorship and in-window user events:
// internal/analyzer/connections.go:97-98
// User-to-project membership edges (for project view in ego network).
// Count how many MRs/events each user has per project as weight.The members API is never called. The edge only exists if a user authored an MR or generated an event against a project within the collection window. A user with strong review ties but no in-window authored activity, a Dormant Expert, has zero of these edges and lands on the empty state, which then reads as missing data.
A CSM coworker hit this on the live demo: the default-selected top influencer was a Dormant Expert, which lands on the Projects view empty by default, and the copy said data was missing when the real story is quiet in the window, active in review.
Same mislabel one level down: the ego-graph edge style table rendered these edges with the display label "member" (edgeStyles.membership.label), carrying the same wrong claim into hover and edge-label text.
Fix
Display copy only.
internal/renderer/static/src/07-influence.js: empty-state copy inrenderEgoProjectsnow reads "No project activity recorded for this user in the collection window. Project links are derived from merge request and event activity, not project membership. Quiet or review-only users may have none."edgeStyles.membership.labelchanged from"member"to"active". Updated a neighboring comment that listed the label set.internal/renderer/static/assets/app.src.js: rebuilt viamake staticto matchsrc/.internal/renderer/render_test.go: addedTestRender_InfluenceEgoProjectsEmptyStateHonest, asserting the new copy and label are present and the old strings are gone. Confirmed it fails against the pre-fix bundle viagit stashbefore committing.
The "membership" type string in the schema and analyzer (internal/analyzer/connections.go, internal/schema) is untouched.
public/ at the repo root: left alone. It's manifold run/render output, fully gitignored (git ls-files public/ returns nothing tracked), and no make target regenerates it.
Test coverage
TestRender_InfluenceEgoProjectsEmptyStateHonest follows the existing structural-test pattern in this file (assert new strings present, old strings gone), same shape as TestRender_DashboardJSEscapesInstanceData.
make check (go vet + go test ./... -count=1) passes.
Out of scope
The ego-graph legend (internal/renderer/static/src/08-detail.js, #ego-network-legend) shows dots for Review, Merge, and Project only. It never had a dot for the membership/"active" edge type, in either view. Pre-existing, not a regression from this change, left alone to keep the diff to the copy fix above.