From 6656fca78e4506c8e0aa1df7ac128243789d5315 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:10:18 +0900 Subject: [PATCH 1/9] test(release): reproduce v2.40 runtime identity drift --- tests/test_package_version.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/test_package_version.py diff --git a/tests/test_package_version.py b/tests/test_package_version.py new file mode 100644 index 000000000..cb85f136e --- /dev/null +++ b/tests/test_package_version.py @@ -0,0 +1,20 @@ +"""Release identity stays consistent across Python and frontend artifacts.""" + +from __future__ import annotations + +import json +import tomllib +from pathlib import Path + +from lineageweave import __version__ + + +def test_release_versions_are_synchronized() -> None: + """Runtime provenance must use the same version as shipped package metadata.""" + repository_root = Path(__file__).resolve().parents[1] + project = tomllib.loads((repository_root / "pyproject.toml").read_text(encoding="utf-8")) + frontend = json.loads( + (repository_root / "frontend" / "package.json").read_text(encoding="utf-8") + ) + + assert __version__ == project["project"]["version"] == frontend["version"] From 7207d6947eed9cc6dcc0900c1973224b618ee61e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:10:56 +0900 Subject: [PATCH 2/9] fix(release): align runtime version with v2.40 successor --- lineageweave/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lineageweave/__init__.py b/lineageweave/__init__.py index 45c371fa7..b28dab796 100644 --- a/lineageweave/__init__.py +++ b/lineageweave/__init__.py @@ -130,4 +130,4 @@ "serialize_lineage_analysis_result", ] -__version__ = "2.20.0" +__version__ = "2.40.0" From 898149cb8c610615a7cdcad68968fe29aa114b44 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:11:05 +0900 Subject: [PATCH 3/9] docs(stack): carry parent Pages landing into incomplete-coverage successor --- docs/index.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/index.md diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..3b2deb73d --- /dev/null +++ b/docs/index.md @@ -0,0 +1,30 @@ +# LineageWeave + +LineageWeave reconstructs evidence-bound lineage, project journeys, and relationship context from scattered enterprise records so people can inspect how events, claims, posts, and decisions relate over time. + +## Start here + +Use LineageWeave when source systems contain related records without reliable explicit cross-record links and you need a browsable, evidence-preserving view of branching histories rather than a flat search result. + +The product combines deterministic lineage assembly with bounded retrieval/fusion and optional adjudication through shared ContextualWisdomLab components. It keeps source authority, authentication, tenant scope, measurement, and model-provider routing in their owning products and contracts. + +## Product surfaces + +- lineage reconstruction and project journeys; +- operations/dashboard views over governed records; +- evidence-aware Global Ask and related context navigation; +- authenticated API and web client over durable PostgreSQL state; +- integration with ThreadWeave, RankWeave, TEPP, contextual-orchestrator, and shared context contracts through explicit boundaries. + +## Documentation + +- [Repository overview and local stack](../README.md) +- [Architecture](../ARCHITECTURE.md) +- [Product requirements](product-requirements.md) +- [Product/technical gap baseline](product-technical-gap-baseline.md) +- [Architecture decisions](adr/) +- [Research notes](lineage-bi-research-notes.md) + +## Status and evidence + +The repository has progressed beyond its original synthetic reconstruction demo into a broader authenticated product stack, while synthetic fixtures remain important for safe examples and tests. Treat protected-main behavior, current release evidence, and repository verification as authoritative; do not infer production readiness from a documentation page or an open pull request alone. From ab34fb9e1a5e06e26e26e44f2966d728d97e5600 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:11:16 +0900 Subject: [PATCH 4/9] test(stack): carry parent short-canvas bound into incomplete-coverage successor --- .../src/leftoverMapPlotSmallCanvas.test.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 frontend/src/leftoverMapPlotSmallCanvas.test.ts diff --git a/frontend/src/leftoverMapPlotSmallCanvas.test.ts b/frontend/src/leftoverMapPlotSmallCanvas.test.ts new file mode 100644 index 000000000..75d18ab13 --- /dev/null +++ b/frontend/src/leftoverMapPlotSmallCanvas.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from "vitest"; +import { layoutLeftoverMapPlot, type LeftoverMapPlottablePair } from "./leftoverMapPlotLayout"; + +const completeCaptionPair: LeftoverMapPlottablePair = { + pair_kind: "closest", + post_id: "post-small-canvas", + post_title: "Small canvas post", + criterion_code: "sales_lead_quality", + leftover_distance: 0.12, + leftover_map_reconstruction: 0.25, + leftover_map_explained_share: 0.76, + leftover_map_person_axis_1: -1, + leftover_map_person_axis_2: -1, + leftover_map_item_axis_1: 1, + leftover_map_item_axis_2: -1, +}; + +describe("layoutLeftoverMapPlot small-canvas caption bounds", () => { + it("keeps a complete three-caption stack inside the requested 20px height", () => { + const layout = layoutLeftoverMapPlot( + [completeCaptionPair], + (criterionCode) => criterionCode, + { height: 20 }, + ); + + expect(layout).not.toBeNull(); + expect(layout?.height).toBe(20); + const segment = layout?.segments[0]; + expect(segment).toBeDefined(); + expect(segment?.labelY).toBeGreaterThanOrEqual(12); + expect(segment?.reconstructionY).toBeGreaterThanOrEqual(segment?.labelY ?? 0); + expect(segment?.explainedShareY).toBeGreaterThanOrEqual(segment?.reconstructionY ?? 0); + expect(segment?.explainedShareY).toBeLessThanOrEqual(16); + }); +}); From d837883c67fa9753f4b0cbf4326d33759bdd98eb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:11:24 +0900 Subject: [PATCH 5/9] test(i18n): inherit parent Vietnamese share RED --- .../src/leftoverMapPlotVietnameseCopy.test.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 frontend/src/leftoverMapPlotVietnameseCopy.test.ts diff --git a/frontend/src/leftoverMapPlotVietnameseCopy.test.ts b/frontend/src/leftoverMapPlotVietnameseCopy.test.ts new file mode 100644 index 000000000..16d29d5db --- /dev/null +++ b/frontend/src/leftoverMapPlotVietnameseCopy.test.ts @@ -0,0 +1,27 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { setLocale, tf } from "./i18n"; + +const GRAPHIC_DISPLAY_COPY = + "Leftover map after IRT main effects. Axis ticks name persisted leftover-map coordinates. Pair segments name leftover-map distance d, leftover-map reconstruction R̂, leftover-map explained leftover share e, leftover-map unexplained leftover share s, leftover-map cross share x, leftover-map unexplained leftover U, leftover residual R, leftover observed Y, leftover expected E, and leftover-map rank. Click a post marker to open that post. The plot does not invent a leftover score."; + +afterEach(() => { + setLocale("en"); +}); + +describe("leftover-map Vietnamese copy inheritance", () => { + it("keeps explained leftover share terminology as an explicit share", () => { + setLocale("vi"); + + expect( + tf("leftover-map explained leftover share {label}", { label: "R̂²/R² 0.76" }), + ).toBe("tỷ phần phần dư được giải thích trên bản đồ phần dư R̂²/R² 0.76"); + }); + + it("keeps the expanded graphic description explicit about explained share e", () => { + setLocale("vi"); + + expect(tf(GRAPHIC_DISPLAY_COPY, {})).toContain( + "tỷ phần phần dư được giải thích e", + ); + }); +}); From 2570e99e9cd3f39eae063015031b21a9c4af4c2f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:36:54 +0900 Subject: [PATCH 6/9] test(release): require v2.41 runtime identity --- tests/test_package_version.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/test_package_version.py diff --git a/tests/test_package_version.py b/tests/test_package_version.py new file mode 100644 index 000000000..cb85f136e --- /dev/null +++ b/tests/test_package_version.py @@ -0,0 +1,20 @@ +"""Release identity stays consistent across Python and frontend artifacts.""" + +from __future__ import annotations + +import json +import tomllib +from pathlib import Path + +from lineageweave import __version__ + + +def test_release_versions_are_synchronized() -> None: + """Runtime provenance must use the same version as shipped package metadata.""" + repository_root = Path(__file__).resolve().parents[1] + project = tomllib.loads((repository_root / "pyproject.toml").read_text(encoding="utf-8")) + frontend = json.loads( + (repository_root / "frontend" / "package.json").read_text(encoding="utf-8") + ) + + assert __version__ == project["project"]["version"] == frontend["version"] From 9edc673ed45258198324a32d4a4d89f8b3e19238 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:38:00 +0900 Subject: [PATCH 7/9] fix(release): align runtime provenance with v2.41 --- lineageweave/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lineageweave/__init__.py b/lineageweave/__init__.py index 45c371fa7..226794a62 100644 --- a/lineageweave/__init__.py +++ b/lineageweave/__init__.py @@ -130,4 +130,4 @@ "serialize_lineage_analysis_result", ] -__version__ = "2.20.0" +__version__ = "2.41.0" From f969cf9cf9af8a4ba0e7e126d1c61f6b0bef543e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:38:25 +0900 Subject: [PATCH 8/9] test(stack): inherit repaired #814 contracts --- docs/index.md | 30 ++++++++++++++++ .../src/leftoverMapPlotSmallCanvas.test.ts | 35 +++++++++++++++++++ .../src/leftoverMapPlotVietnameseCopy.test.ts | 27 ++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 docs/index.md create mode 100644 frontend/src/leftoverMapPlotSmallCanvas.test.ts create mode 100644 frontend/src/leftoverMapPlotVietnameseCopy.test.ts diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..3b2deb73d --- /dev/null +++ b/docs/index.md @@ -0,0 +1,30 @@ +# LineageWeave + +LineageWeave reconstructs evidence-bound lineage, project journeys, and relationship context from scattered enterprise records so people can inspect how events, claims, posts, and decisions relate over time. + +## Start here + +Use LineageWeave when source systems contain related records without reliable explicit cross-record links and you need a browsable, evidence-preserving view of branching histories rather than a flat search result. + +The product combines deterministic lineage assembly with bounded retrieval/fusion and optional adjudication through shared ContextualWisdomLab components. It keeps source authority, authentication, tenant scope, measurement, and model-provider routing in their owning products and contracts. + +## Product surfaces + +- lineage reconstruction and project journeys; +- operations/dashboard views over governed records; +- evidence-aware Global Ask and related context navigation; +- authenticated API and web client over durable PostgreSQL state; +- integration with ThreadWeave, RankWeave, TEPP, contextual-orchestrator, and shared context contracts through explicit boundaries. + +## Documentation + +- [Repository overview and local stack](../README.md) +- [Architecture](../ARCHITECTURE.md) +- [Product requirements](product-requirements.md) +- [Product/technical gap baseline](product-technical-gap-baseline.md) +- [Architecture decisions](adr/) +- [Research notes](lineage-bi-research-notes.md) + +## Status and evidence + +The repository has progressed beyond its original synthetic reconstruction demo into a broader authenticated product stack, while synthetic fixtures remain important for safe examples and tests. Treat protected-main behavior, current release evidence, and repository verification as authoritative; do not infer production readiness from a documentation page or an open pull request alone. diff --git a/frontend/src/leftoverMapPlotSmallCanvas.test.ts b/frontend/src/leftoverMapPlotSmallCanvas.test.ts new file mode 100644 index 000000000..75d18ab13 --- /dev/null +++ b/frontend/src/leftoverMapPlotSmallCanvas.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from "vitest"; +import { layoutLeftoverMapPlot, type LeftoverMapPlottablePair } from "./leftoverMapPlotLayout"; + +const completeCaptionPair: LeftoverMapPlottablePair = { + pair_kind: "closest", + post_id: "post-small-canvas", + post_title: "Small canvas post", + criterion_code: "sales_lead_quality", + leftover_distance: 0.12, + leftover_map_reconstruction: 0.25, + leftover_map_explained_share: 0.76, + leftover_map_person_axis_1: -1, + leftover_map_person_axis_2: -1, + leftover_map_item_axis_1: 1, + leftover_map_item_axis_2: -1, +}; + +describe("layoutLeftoverMapPlot small-canvas caption bounds", () => { + it("keeps a complete three-caption stack inside the requested 20px height", () => { + const layout = layoutLeftoverMapPlot( + [completeCaptionPair], + (criterionCode) => criterionCode, + { height: 20 }, + ); + + expect(layout).not.toBeNull(); + expect(layout?.height).toBe(20); + const segment = layout?.segments[0]; + expect(segment).toBeDefined(); + expect(segment?.labelY).toBeGreaterThanOrEqual(12); + expect(segment?.reconstructionY).toBeGreaterThanOrEqual(segment?.labelY ?? 0); + expect(segment?.explainedShareY).toBeGreaterThanOrEqual(segment?.reconstructionY ?? 0); + expect(segment?.explainedShareY).toBeLessThanOrEqual(16); + }); +}); diff --git a/frontend/src/leftoverMapPlotVietnameseCopy.test.ts b/frontend/src/leftoverMapPlotVietnameseCopy.test.ts new file mode 100644 index 000000000..16d29d5db --- /dev/null +++ b/frontend/src/leftoverMapPlotVietnameseCopy.test.ts @@ -0,0 +1,27 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { setLocale, tf } from "./i18n"; + +const GRAPHIC_DISPLAY_COPY = + "Leftover map after IRT main effects. Axis ticks name persisted leftover-map coordinates. Pair segments name leftover-map distance d, leftover-map reconstruction R̂, leftover-map explained leftover share e, leftover-map unexplained leftover share s, leftover-map cross share x, leftover-map unexplained leftover U, leftover residual R, leftover observed Y, leftover expected E, and leftover-map rank. Click a post marker to open that post. The plot does not invent a leftover score."; + +afterEach(() => { + setLocale("en"); +}); + +describe("leftover-map Vietnamese copy inheritance", () => { + it("keeps explained leftover share terminology as an explicit share", () => { + setLocale("vi"); + + expect( + tf("leftover-map explained leftover share {label}", { label: "R̂²/R² 0.76" }), + ).toBe("tỷ phần phần dư được giải thích trên bản đồ phần dư R̂²/R² 0.76"); + }); + + it("keeps the expanded graphic description explicit about explained share e", () => { + setLocale("vi"); + + expect(tf(GRAPHIC_DISPLAY_COPY, {})).toContain( + "tỷ phần phần dư được giải thích e", + ); + }); +}); From 326a2f016f7bbf1f01bffdffa8b96a9b1451b6c0 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 18:39:57 +0900 Subject: [PATCH 9/9] test(release): require v2.42 runtime identity --- tests/test_package_version.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/test_package_version.py diff --git a/tests/test_package_version.py b/tests/test_package_version.py new file mode 100644 index 000000000..cb85f136e --- /dev/null +++ b/tests/test_package_version.py @@ -0,0 +1,20 @@ +"""Release identity stays consistent across Python and frontend artifacts.""" + +from __future__ import annotations + +import json +import tomllib +from pathlib import Path + +from lineageweave import __version__ + + +def test_release_versions_are_synchronized() -> None: + """Runtime provenance must use the same version as shipped package metadata.""" + repository_root = Path(__file__).resolve().parents[1] + project = tomllib.loads((repository_root / "pyproject.toml").read_text(encoding="utf-8")) + frontend = json.loads( + (repository_root / "frontend" / "package.json").read_text(encoding="utf-8") + ) + + assert __version__ == project["project"]["version"] == frontend["version"]