diff --git a/js/packages/storybook/stories/lineage/WholeModelImpact.stories.tsx b/js/packages/storybook/stories/lineage/WholeModelImpact.stories.tsx index 22d73b5a1..9b1971c72 100644 --- a/js/packages/storybook/stories/lineage/WholeModelImpact.stories.tsx +++ b/js/packages/storybook/stories/lineage/WholeModelImpact.stories.tsx @@ -123,7 +123,7 @@ const lineageNodeBaseProps = { hasParents: true, hasChildren: true, showContent: true, - wholeModelImpact: true, + newCllExperience: true, }; // ============================================================================= @@ -166,7 +166,7 @@ const baseNodeViewArgs: Partial> = { SchemaView: StubSchemaView, NodeSqlView: StubNodeSqlView, ResourceTypeTag, - wholeModelImpact: true, + newCllExperience: true, }; /** Brown title chip + brown left stripe for a whole-model-changed model. */ diff --git a/js/packages/ui/src/api/flag.ts b/js/packages/ui/src/api/flag.ts index e2bd2eac9..3385de47e 100644 --- a/js/packages/ui/src/api/flag.ts +++ b/js/packages/ui/src/api/flag.ts @@ -9,8 +9,6 @@ export interface RecceServerFlags { disable_cll_cache: boolean; impact_at_startup: boolean; new_cll_experience: boolean; - /** Whole-model impact highlighting. Implies new_cll_experience. */ - whole_model_impact: boolean; /** * Inline paired-distribution profiles in the schema view (DRC-3390 Stage B). * When false (the default), Stage C's hook short-circuits and no diff --git a/js/packages/ui/src/components/lineage/GraphNodeOss.tsx b/js/packages/ui/src/components/lineage/GraphNodeOss.tsx index 0e079501b..ae6b06770 100644 --- a/js/packages/ui/src/components/lineage/GraphNodeOss.tsx +++ b/js/packages/ui/src/components/lineage/GraphNodeOss.tsx @@ -299,7 +299,6 @@ function GraphNodeComponent(nodeProps: GraphNodeProps) { cll, impactedNodeIds, newCllExperience, - wholeModelImpact, } = lineageViewCtx; const isImpacted = newCllExperience ? impactedNodeIds.has(id) : false; const { isWholeModelChanged, isWholeModelImpacted } = pickWholeModelFlags( @@ -365,7 +364,6 @@ function GraphNodeComponent(nodeProps: GraphNodeProps) { isImpacted={isImpacted} isWholeModelChanged={isWholeModelChanged} isWholeModelImpacted={isWholeModelImpacted} - wholeModelImpact={wholeModelImpact} // Interactive props interactive={interactive} selectMode={nodeSelectMode} diff --git a/js/packages/ui/src/components/lineage/LineageViewOss.tsx b/js/packages/ui/src/components/lineage/LineageViewOss.tsx index fc30cf185..90637d4ae 100644 --- a/js/packages/ui/src/components/lineage/LineageViewOss.tsx +++ b/js/packages/ui/src/components/lineage/LineageViewOss.tsx @@ -140,12 +140,11 @@ export const MINIMAP_NODE_THRESHOLD = 500; function computeImpactedSets( lineageGraph: LineageGraph, cll: ColumnLineageData, - wholeModelImpact = false, ): { nodeIds: Set; columnIds: Set; - wholeModelImpactedNodeIds?: Set; - wholeModelChangedNodeIds?: Set; + wholeModelImpactedNodeIds: Set; + wholeModelChangedNodeIds: Set; } { const columnIds = computeImpactedColumns(cll); const nodeIds = new Set(); @@ -162,17 +161,14 @@ function computeImpactedSets( nodeIds.add(nodeId); } } - if (wholeModelImpact) { - const { wholeModelImpactedNodeIds, wholeModelChangedNodeIds } = - computeWholeModelImpact(lineageGraph, cll); - return { - nodeIds, - columnIds, - wholeModelImpactedNodeIds, - wholeModelChangedNodeIds, - }; - } - return { nodeIds, columnIds }; + const { wholeModelImpactedNodeIds, wholeModelChangedNodeIds } = + computeWholeModelImpact(lineageGraph, cll); + return { + nodeIds, + columnIds, + wholeModelImpactedNodeIds, + wholeModelChangedNodeIds, + }; } /** @@ -282,7 +278,6 @@ export function PrivateLineageView( const { data: serverFlags } = useRecceServerFlag(); const newCllExperience = serverFlags?.new_cll_experience ?? false; - const wholeModelImpact = serverFlags?.whole_model_impact ?? false; const { runId, showRunId, closeRunResult, runAction, isRunResultOpen } = useRecceActionContext(); const { run } = useRun(runId); @@ -639,11 +634,7 @@ export function PrivateLineageView( // Compute impacted sets once; thread into ancestry to avoid redundant DFS. const impacted = newCllExperience && cll - ? computeImpactedSets( - lineageGraph, - cll, - serverFlags?.whole_model_impact ?? false, - ) + ? computeImpactedSets(lineageGraph, cll) : undefined; const [nodes, edges, nodeColumnSetMap] = await toReactFlow(lineageGraph, { @@ -971,11 +962,7 @@ export function PrivateLineageView( const impacted = newCllExperience && cll - ? computeImpactedSets( - lineageGraph, - cll, - serverFlags?.whole_model_impact ?? false, - ) + ? computeImpactedSets(lineageGraph, cll) : undefined; const [newNodes, newEdges, newNodeColumnSetMap] = await toReactFlow( @@ -1253,7 +1240,6 @@ export function PrivateLineageView( }, changeAnalysisMode, newCllExperience, - wholeModelImpact, setChangeAnalysisMode, getNodeAction: (nodeId: string) => { return multiNodeAction.actionState.actions[nodeId]; diff --git a/js/packages/ui/src/components/lineage/NodeView.tsx b/js/packages/ui/src/components/lineage/NodeView.tsx index 60c503c28..80618fcd6 100644 --- a/js/packages/ui/src/components/lineage/NodeView.tsx +++ b/js/packages/ui/src/components/lineage/NodeView.tsx @@ -211,8 +211,8 @@ export interface NodeViewProps< isWholeModelChanged?: boolean; /** This model is downstream of a whole-model change — paints the amber title chip + amber left stripe. Precedence is enforced internally: `isWholeModelChanged` outranks this flag. */ isWholeModelImpacted?: boolean; - /** Whether the `--whole-model-impact` server flag is on. When false, no whole-model UI renders (no title chip, no left stripe). */ - wholeModelImpact?: boolean; + /** Whether the new CLL experience (`new_cll_experience` server flag) is on. When false, no whole-model UI renders (no title chip, no left stripe). */ + newCllExperience?: boolean; /** This model is downstream of any breaking change. Only feeds the title-row hover tooltip (column-impacted kind) — no visual chip in NodeView. */ isImpacted?: boolean; } @@ -599,7 +599,7 @@ export function NodeView({ isActionAvailable = defaultIsActionAvailable, isWholeModelChanged = false, isWholeModelImpacted = false, - wholeModelImpact = false, + newCllExperience = false, isImpacted = false, rowCountDisplay, }: NodeViewProps) { @@ -639,7 +639,7 @@ export function NodeView({ // MUI colorSchemes setup — useThemeColors() is the correct accessor. const { isDark } = useThemeColors(); const treatmentInputs = { - wholeModelImpact, + newCllExperience, isWholeModelChanged, isWholeModelImpacted, isImpacted, diff --git a/js/packages/ui/src/components/lineage/NodeViewOss.tsx b/js/packages/ui/src/components/lineage/NodeViewOss.tsx index ef56215d0..feb74336b 100644 --- a/js/packages/ui/src/components/lineage/NodeViewOss.tsx +++ b/js/packages/ui/src/components/lineage/NodeViewOss.tsx @@ -338,7 +338,7 @@ export function NodeViewOss({ featureToggles={featureToggles} isWholeModelChanged={wholeModelFlags.isWholeModelChanged} isWholeModelImpacted={wholeModelFlags.isWholeModelImpacted} - wholeModelImpact={lineageViewCtx?.wholeModelImpact ?? false} + newCllExperience={lineageViewCtx?.newCllExperience ?? false} isImpacted={impactedNodeIds?.has(node.id) ?? false} modelDetail={(() => { if (!modelDetail) return undefined; diff --git a/js/packages/ui/src/components/lineage/__tests__/LineageNode.test.tsx b/js/packages/ui/src/components/lineage/__tests__/LineageNode.test.tsx index 406b48901..aca72e4ee 100644 --- a/js/packages/ui/src/components/lineage/__tests__/LineageNode.test.tsx +++ b/js/packages/ui/src/components/lineage/__tests__/LineageNode.test.tsx @@ -424,7 +424,7 @@ describe("LineageNode", () => { ["breaking", "Model-Wide Change"], ["non_breaking", "Additive Change"], ["partial_breaking", "Column Change"], - ])("shows %s category text label when wholeModelImpact is false", (category, label) => { + ])("shows %s category text label when newCllExperience is false", (category, label) => { const props = createMockNodeProps( { showChangeAnalysis: true, changeCategory: category }, { label: "test" }, @@ -439,12 +439,12 @@ describe("LineageNode", () => { "breaking", "non_breaking", "partial_breaking", - ])("suppresses %s category text label when wholeModelImpact is true (badge carries the signal)", (category) => { + ])("suppresses %s category text label when newCllExperience is true (badge carries the signal)", (category) => { const props = createMockNodeProps( { showChangeAnalysis: true, changeCategory: category, - wholeModelImpact: true, + newCllExperience: true, }, { label: "test" }, ); @@ -701,7 +701,7 @@ describe("LineageNode", () => { it("renders no graph badge for whole-model-changed (signalled by other surfaces)", () => { const props = createMockNodeProps({ isWholeModelChanged: true, - wholeModelImpact: true, + newCllExperience: true, }); const { container } = render(); expect( @@ -712,7 +712,7 @@ describe("LineageNode", () => { it("renders no graph badge for whole-model-impacted (signalled by other surfaces)", () => { const props = createMockNodeProps({ isWholeModelImpacted: true, - wholeModelImpact: true, + newCllExperience: true, }); const { container } = render(); expect( @@ -720,10 +720,10 @@ describe("LineageNode", () => { ).toHaveLength(0); }); - it("renders the additive badge for non_breaking when wholeModelImpact is on", () => { + it("renders the additive badge for non_breaking when newCllExperience is on", () => { const props = createMockNodeProps({ changeCategory: "non_breaking", - wholeModelImpact: true, + newCllExperience: true, }); render(); const badge = screen.getByTestId("whole-model-additive-badge"); @@ -734,7 +734,7 @@ describe("LineageNode", () => { it("renders no badge when neither flag is set and category is not additive", () => { const props = createMockNodeProps({ changeCategory: "breaking", - wholeModelImpact: true, + newCllExperience: true, }); const { container } = render(); expect( @@ -742,10 +742,10 @@ describe("LineageNode", () => { ).toHaveLength(0); }); - it("renders the column-changed badge for partial_breaking when wholeModelImpact is on", () => { + it("renders the column-changed badge for partial_breaking when newCllExperience is on", () => { const props = createMockNodeProps({ changeCategory: "partial_breaking", - wholeModelImpact: true, + newCllExperience: true, }); render(); const badge = screen.getByTestId("column-changed-badge"); @@ -753,10 +753,10 @@ describe("LineageNode", () => { expect(badge.textContent).toBe("COLUMN"); }); - it("renders the column-impacted badge for isImpacted nodes without own change when wholeModelImpact is on", () => { + it("renders the column-impacted badge for isImpacted nodes without own change when newCllExperience is on", () => { const props = createMockNodeProps({ isImpacted: true, - wholeModelImpact: true, + newCllExperience: true, }); render(); const badge = screen.getByTestId("column-impacted-badge"); @@ -768,7 +768,7 @@ describe("LineageNode", () => { const props = createMockNodeProps({ isWholeModelImpacted: true, changeCategory: "partial_breaking", - wholeModelImpact: true, + newCllExperience: true, }); render(); // Whole-model-impacted resolution wins over column-changed, but @@ -786,7 +786,7 @@ describe("LineageNode", () => { const props = createMockNodeProps({ isImpacted: true, changeCategory: "partial_breaking", - wholeModelImpact: true, + newCllExperience: true, }); render(); expect(screen.getByTestId("column-changed-badge")).toBeInTheDocument(); @@ -795,7 +795,7 @@ describe("LineageNode", () => { ).not.toBeInTheDocument(); }); - it("renders no badge when wholeModelImpact is off, even if flags are set", () => { + it("renders no badge when newCllExperience is off, even if flags are set", () => { const props = createMockNodeProps({ isWholeModelChanged: true, isWholeModelImpacted: true, diff --git a/js/packages/ui/src/components/lineage/__tests__/NodeView.test.tsx b/js/packages/ui/src/components/lineage/__tests__/NodeView.test.tsx index 65b17b226..20039a3a2 100644 --- a/js/packages/ui/src/components/lineage/__tests__/NodeView.test.tsx +++ b/js/packages/ui/src/components/lineage/__tests__/NodeView.test.tsx @@ -163,14 +163,14 @@ describe("NodeView", () => { // never renders a graph badge of any kind. The structural badge check // (`[data-testid$="-badge"]` returns 0) catches a regression that // re-introduces a badge surface under any naming. - test("renders the changed title chip (no inline badge) when isWholeModelChanged is true and wholeModelImpact is on", () => { + test("renders the changed title chip (no inline badge) when isWholeModelChanged is true and newCllExperience is on", () => { const { container } = render( , ); expect( @@ -181,14 +181,14 @@ describe("NodeView", () => { ).toHaveLength(0); }); - test("renders the impacted title chip (no inline badge) when isWholeModelImpacted is true and wholeModelImpact is on", () => { + test("renders the impacted title chip (no inline badge) when isWholeModelImpacted is true and newCllExperience is on", () => { const { container } = render( , ); expect( @@ -207,7 +207,7 @@ describe("NodeView", () => { isSingleEnv={false} isWholeModelChanged isWholeModelImpacted - wholeModelImpact + newCllExperience />, ); expect( @@ -227,7 +227,7 @@ describe("NodeView", () => { node={createNode("model")} onCloseNode={vi.fn()} isSingleEnv={false} - wholeModelImpact + newCllExperience />, ); expect( @@ -251,7 +251,7 @@ describe("NodeView", () => { }} onCloseNode={vi.fn()} isSingleEnv={false} - wholeModelImpact + newCllExperience />, ); expect( @@ -262,7 +262,7 @@ describe("NodeView", () => { ).toHaveLength(0); }); - test("renders no whole-model surfaces when wholeModelImpact is off, even if flags are set", () => { + test("renders no whole-model surfaces when newCllExperience is off, even if flags are set", () => { const { container } = render( { result.current.publish({ nodeIds: new Set(["model.test.orders"]), columnIds: new Set(["model.test.orders.status"]), + wholeModelImpactedNodeIds: new Set(), + wholeModelChangedNodeIds: new Set(), }); }); @@ -55,6 +57,8 @@ describe("usePublishedImpactSets", () => { result.current.publish({ nodeIds: new Set(["a"]), columnIds: new Set(["a.x"]), + wholeModelImpactedNodeIds: new Set(), + wholeModelChangedNodeIds: new Set(), }); }); const first = result.current.impactedColumnIds; @@ -63,6 +67,8 @@ describe("usePublishedImpactSets", () => { result.current.publish({ nodeIds: new Set(["a", "b"]), columnIds: new Set(["a.x", "b.y"]), + wholeModelImpactedNodeIds: new Set(), + wholeModelChangedNodeIds: new Set(), }); }); const second = result.current.impactedColumnIds; @@ -71,33 +77,14 @@ describe("usePublishedImpactSets", () => { expect(second.size).toBe(2); }); - it("reuses a stable empty-Set reference when whole-model fields are omitted", () => { - // Allocating `new Set()` on every publish would break Object.is bailout in - // setState and cause extra renders on every refresh when whole-model is off. + it("starts with a stable empty-Set reference for whole-model fields", () => { + // The initial whole-model sets share a stable empty-Set reference. + // Allocating `new Set()` for the initial state would break Object.is + // bailout in setState and cause extra renders on refresh. const { result } = renderHook(() => usePublishedImpactSets()); - const initialWholeChanged = result.current.wholeModelChangedNodeIds; - const initialWholeImpacted = result.current.wholeModelImpactedNodeIds; - - act(() => { - result.current.publish({ - nodeIds: new Set(["a"]), - columnIds: new Set(["a.x"]), - }); - }); - const afterFirst = result.current.wholeModelChangedNodeIds; - - act(() => { - result.current.publish({ - nodeIds: new Set(["b"]), - columnIds: new Set(["b.x"]), - }); - }); - const afterSecond = result.current.wholeModelChangedNodeIds; - - expect(afterFirst).toBe(initialWholeChanged); - expect(afterSecond).toBe(initialWholeChanged); - expect(result.current.wholeModelImpactedNodeIds).toBe(initialWholeImpacted); + expect(result.current.wholeModelChangedNodeIds.size).toBe(0); + expect(result.current.wholeModelImpactedNodeIds.size).toBe(0); }); it("publishes whole-model impact sets when provided", () => { diff --git a/js/packages/ui/src/components/lineage/hooks/usePublishedImpactSets.ts b/js/packages/ui/src/components/lineage/hooks/usePublishedImpactSets.ts index 888b8f5b7..a2be31645 100644 --- a/js/packages/ui/src/components/lineage/hooks/usePublishedImpactSets.ts +++ b/js/packages/ui/src/components/lineage/hooks/usePublishedImpactSets.ts @@ -3,8 +3,8 @@ import { useCallback, useState } from "react"; export interface ImpactSets { nodeIds: Set; columnIds: Set; - wholeModelImpactedNodeIds?: Set; - wholeModelChangedNodeIds?: Set; + wholeModelImpactedNodeIds: Set; + wholeModelChangedNodeIds: Set; } export interface UsePublishedImpactSetsResult { @@ -15,9 +15,9 @@ export interface UsePublishedImpactSetsResult { publish: (sets: ImpactSets) => void; } -// Stable empty-set reference shared by the whole-model fallback path. -// Allocating `new Set()` on every publish would break `Object.is` bailout in -// `setState`, causing extra renders on refresh when whole-model is disabled. +// Stable empty-set reference for the whole-model initial state (before the +// first `publish`). A fresh `new Set()` here would break the `Object.is` +// bailout in `setState`, causing extra renders on refresh. const EMPTY_SET: ReadonlySet = new Set(); // State (not refs) so downstream memos re-render when impact CLL populates the @@ -40,12 +40,8 @@ export function usePublishedImpactSets(): UsePublishedImpactSetsResult { const publish = useCallback((sets: ImpactSets) => { setImpactedNodeIds(sets.nodeIds); setImpactedColumnIds(sets.columnIds); - setWholeModelImpactedNodeIds( - sets.wholeModelImpactedNodeIds ?? (EMPTY_SET as Set), - ); - setWholeModelChangedNodeIds( - sets.wholeModelChangedNodeIds ?? (EMPTY_SET as Set), - ); + setWholeModelImpactedNodeIds(sets.wholeModelImpactedNodeIds); + setWholeModelChangedNodeIds(sets.wholeModelChangedNodeIds); }, []); return { diff --git a/js/packages/ui/src/components/lineage/nodes/LineageNode.tsx b/js/packages/ui/src/components/lineage/nodes/LineageNode.tsx index 7247c9f38..79bf2ff2b 100644 --- a/js/packages/ui/src/components/lineage/nodes/LineageNode.tsx +++ b/js/packages/ui/src/components/lineage/nodes/LineageNode.tsx @@ -156,8 +156,6 @@ export interface LineageNodeProps { isWholeModelChanged?: boolean; /** This model is downstream of (impacted by) a whole-model change. Suppresses the graph badge (the signal lives on NodeView's title chip + stripe) and the change-category text label. Precedence is enforced internally: `isWholeModelChanged` outranks this flag. */ isWholeModelImpacted?: boolean; - /** Whether the `--whole-model-impact` server flag is on. When false, no per-column badges render and the "Model-Wide Change / Column Change / Additive Change" text labels are shown instead. */ - wholeModelImpact?: boolean; // === Callbacks === /** Callback when node is clicked */ @@ -302,7 +300,6 @@ function LineageNodeComponent({ isImpacted: isImpactedProp, isWholeModelChanged = false, isWholeModelImpacted = false, - wholeModelImpact = false, // Callbacks onNodeClick, onNodeDoubleClick, @@ -459,7 +456,7 @@ function LineageNodeComponent({ }; const treatmentInputs = { - wholeModelImpact, + newCllExperience, isWholeModelChanged, isWholeModelImpacted, isImpacted, @@ -474,13 +471,13 @@ function LineageNodeComponent({ treatmentInputs, ); - // When --whole-model-impact is on, the COLUMN / ADD graph badge and the + // In the new CLL experience, the COLUMN / ADD graph badge and the // NodeView title chip + stripe carry the signal — suppress the text // label except for "unknown", which has no badge equivalent. const changeCategoryLabel = showChangeAnalysis && changeCategory && - (!wholeModelImpact || changeCategory === "unknown") + (!newCllExperience || changeCategory === "unknown") ? CHANGE_CATEGORY_LABELS[changeCategory] : null; diff --git a/js/packages/ui/src/components/lineage/wholeModelTreatment.ts b/js/packages/ui/src/components/lineage/wholeModelTreatment.ts index f41c4742a..f68638ed4 100644 --- a/js/packages/ui/src/components/lineage/wholeModelTreatment.ts +++ b/js/packages/ui/src/components/lineage/wholeModelTreatment.ts @@ -45,12 +45,12 @@ export type TitleChipKind = "changed" | "impacted"; export type GraphBadgeKind = "additive" | "column-changed" | "column-impacted"; /** - * Raw inputs consumed by the surface classifiers. `wholeModelImpact` gates - * the entire pipeline (server flag from `--whole-model-impact`); when false, + * Raw inputs consumed by the surface classifiers. `newCllExperience` gates + * the entire pipeline (the `new_cll_experience` server flag); when false, * every classifier returns `null` and no treatment renders. */ export interface TreatmentInputs { - wholeModelImpact: boolean; + newCllExperience: boolean; isWholeModelChanged: boolean; isWholeModelImpacted: boolean; isImpacted: boolean; @@ -149,14 +149,14 @@ const GRAPH_BADGE_LABELS: Record< }; function classifyTitleChip(inputs: TreatmentInputs): TitleChipKind | null { - if (!inputs.wholeModelImpact) return null; + if (!inputs.newCllExperience) return null; if (inputs.isWholeModelChanged) return "changed"; if (inputs.isWholeModelImpacted) return "impacted"; return null; } function classifyGraphBadge(inputs: TreatmentInputs): GraphBadgeKind | null { - if (!inputs.wholeModelImpact) return null; + if (!inputs.newCllExperience) return null; // Whole-model kinds short-circuit the badge — their signal lives on the // NodeView title chip + stripe instead. if (inputs.isWholeModelChanged || inputs.isWholeModelImpacted) return null; diff --git a/js/packages/ui/src/contexts/lineage/types.ts b/js/packages/ui/src/contexts/lineage/types.ts index 9be39d250..3f5d11a53 100644 --- a/js/packages/ui/src/contexts/lineage/types.ts +++ b/js/packages/ui/src/contexts/lineage/types.ts @@ -250,18 +250,15 @@ export interface LineageViewContextType { isNodeShowingChangeAnalysis: (nodeId: string) => boolean; /** Whether impact radius (change analysis) mode is active */ changeAnalysisMode: boolean; - /** Whether the new CLL experience flag is enabled on the server */ - newCllExperience: boolean; /** - * Whether the `--whole-model-impact` server flag is on. Implies - * `newCllExperience`. Gates two surfaces (NodeView title chip + left - * stripe for whole-model kinds; LineageNode COLUMN / ADD graph badge - * for per-column kinds) AND the suppression of the "Breaking / - * Non Breaking / Partial Breaking" text labels on the graph node. - * When false, lineage nodes render the original category text labels - * and no whole-model UI. + * Whether the new CLL experience flag is enabled on the server. Besides the + * column-level lineage visuals, this gates the whole-model surfaces (NodeView + * title chip + left stripe for whole-model kinds; LineageNode COLUMN / ADD + * graph badge for per-column kinds) AND the suppression of the "Breaking / + * Non Breaking / Partial Breaking" text labels on the graph node. When false, + * lineage nodes render the original category text labels and no whole-model UI. */ - wholeModelImpact: boolean; + newCllExperience: boolean; // TODO: Move isImpacted to be a per-model state on node data instead of // a lookup set, so impact status is part of the graph model rather than // a side-channel computed separately. @@ -275,8 +272,7 @@ export interface LineageViewContextType { * CLL classifier level — `change_category === "breaking"`). Drives the * brown title chip + brown left stripe in NodeView. The LineageNode graph * badge is intentionally suppressed for whole-model kinds; the chip + - * stripe carry the signal. Empty Set when the `--whole-model-impact` - * flag is off. + * stripe carry the signal. Empty Set when the new CLL experience is off. */ wholeModelChangedNodeIds: Set; /** @@ -287,8 +283,7 @@ export interface LineageViewContextType { * intentionally suppressed for whole-model kinds. Changed-wins: a model * may appear in both this set AND in `wholeModelChangedNodeIds`; * consumers must consult `wholeModelChangedNodeIds` first (use - * `pickWholeModelFlags`). Empty Set when the `--whole-model-impact` flag - * is off. + * `pickWholeModelFlags`). Empty Set when the new CLL experience is off. */ wholeModelImpactedNodeIds: Set; /** Set change analysis mode on/off */ diff --git a/js/src/components/lineage/__tests__/GraphNode.test.tsx b/js/src/components/lineage/__tests__/GraphNode.test.tsx index 2ab105011..1637c1b38 100644 --- a/js/src/components/lineage/__tests__/GraphNode.test.tsx +++ b/js/src/components/lineage/__tests__/GraphNode.test.tsx @@ -253,7 +253,6 @@ const createMockContext = ( impactedNodeIds: new Set(), wholeModelImpactedNodeIds: new Set(), wholeModelChangedNodeIds: new Set(), - wholeModelImpact: false, ...overrides, }); diff --git a/recce/cli.py b/recce/cli.py index 1eff19ff8..7da220931 100644 --- a/recce/cli.py +++ b/recce/cli.py @@ -1212,12 +1212,6 @@ def diff( help="Enable the new column-level lineage visual experience.", envvar="RECCE_NEW_CLL_EXPERIENCE", ) -@click.option( - "--whole-model-impact", - is_flag=True, - help="Highlight models downstream of a whole-model change. Implies --new-cll-experience.", - envvar="RECCE_WHOLE_MODEL_IMPACT", -) @click.option( "--inline-profile", is_flag=True, @@ -1308,7 +1302,6 @@ def server(host, port, lifetime, idle_timeout=0, state_file=None, **kwargs): "disable_cll_cache": True, "impact_at_startup": False, "new_cll_experience": False, - "whole_model_impact": False, "inline_profile": False, } console = Console() @@ -1363,10 +1356,6 @@ def server(host, port, lifetime, idle_timeout=0, state_file=None, **kwargs): if kwargs.get("new_cll_experience", False): flag["new_cll_experience"] = True - if kwargs.get("whole_model_impact", False): - flag["whole_model_impact"] = True - flag["new_cll_experience"] = True - if kwargs.get("inline_profile", False): flag["inline_profile"] = True flag["new_cll_experience"] = True diff --git a/tests/test_cli.py b/tests/test_cli.py index c0b66ec2a..ff5f39a76 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -209,28 +209,6 @@ def test_create_state_loader_does_not_call_load(self, mock_state_loader_class): mock_state_loader.load.assert_not_called() assert result is mock_state_loader - @patch("uvicorn.run") - @patch("recce.server.AppState") - def test_cmd_server_with_whole_model_impact_implies_new_cll_experience(self, mock_app_state, mock_run): - self.runner.invoke(cli_command_server, ["--whole-model-impact", "--single-env"]) - mock_run.assert_called_once() - - app_state_call_args = mock_app_state.call_args - app_state_flag = app_state_call_args.kwargs["flag"] - assert app_state_flag["whole_model_impact"] is True - assert app_state_flag["new_cll_experience"] is True - - @patch("uvicorn.run") - @patch("recce.server.AppState") - def test_cmd_server_without_whole_model_impact_both_flags_false(self, mock_app_state, mock_run): - self.runner.invoke(cli_command_server, ["--single-env"]) - mock_run.assert_called_once() - - app_state_call_args = mock_app_state.call_args - app_state_flag = app_state_call_args.kwargs["flag"] - assert app_state_flag["whole_model_impact"] is False - assert app_state_flag["new_cll_experience"] is False - @patch("uvicorn.run") @patch("recce.server.AppState") def test_cmd_server_with_inline_profile_implies_new_cll_experience(self, mock_app_state, mock_run):