From 1219a064e7b2a013aca747323664a46ebb2b586b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:23:14 +0900 Subject: [PATCH 01/20] docs: refresh README public surface --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5f1480b40..3aaadffa5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # LineageWeave +[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/ContextualWisdomLab/LineageWeave) + Reconstructs git-branch-style lineage DAGs from scattered short records -- turns a flat pile of loosely-grouped, timestamped items into a browsable set of branching threads, without any explicit "this follows from that" link @@ -15,9 +17,9 @@ group A-100 rec-006 Unrelated: annual account review (own root -- no forced match) ``` -This is a **demo prototype**: it ships with synthetic sample data only -(`lineageweave/fixtures.py`) and no connection to any real dataset or -organization. +LineageWeave now includes an authenticated API/web product stack backed by +PostgreSQL and Keycloak. Synthetic fixtures and demo accounts remain safe +example and test evidence; they are not the product boundary. The supporting [product requirements](docs/product-requirements.md) define the product outcomes, non-goals, ecosystem boundaries, and release evidence; @@ -220,4 +222,4 @@ dependency (embeddings, LLM adjudication, TEPP) is injected, not hardcoded. ## License -MIT -- see [LICENSE](LICENSE). +MIT -- see [LICENSE](LICENSE). \ No newline at end of file From 415a4117bdf883eb6e041ce79e2e40df6032116b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:23:30 +0900 Subject: [PATCH 02/20] docs: repair Pages navigation --- docs/index.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 3b2deb73d..c1232a088 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,6 +2,8 @@ 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. +[Ask DeepWiki](https://deepwiki.com/ContextualWisdomLab/LineageWeave) · [Repository](https://github.com/ContextualWisdomLab/LineageWeave) · [Releases](https://github.com/ContextualWisdomLab/LineageWeave/releases) + ## 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. @@ -18,8 +20,8 @@ The product combines deterministic lineage assembly with bounded retrieval/fusio ## Documentation -- [Repository overview and local stack](../README.md) -- [Architecture](../ARCHITECTURE.md) +- [Repository overview and local stack](https://github.com/ContextualWisdomLab/LineageWeave/blob/main/README.md) +- [Architecture](https://github.com/ContextualWisdomLab/LineageWeave/blob/main/ARCHITECTURE.md) - [Product requirements](product-requirements.md) - [Product/technical gap baseline](product-technical-gap-baseline.md) - [Architecture decisions](adr/) From 47352b5b89cd4a11efd7d11036e71ea47cf46848 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:42:22 +0900 Subject: [PATCH 03/20] docs: add authoritative Pages landing source --- docs/index.html | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 docs/index.html diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..9c50dbb4f --- /dev/null +++ b/docs/index.html @@ -0,0 +1,54 @@ + + + + + + LineageWeave + + + + + +
+

LineageWeave

+

Evidence-bound lineage reconstruction and branching history for scattered enterprise records.

+
+
+

Use LineageWeave when related records do not carry reliable explicit cross-record links and you need to inspect how events, claims, posts, and decisions relate over time without turning inferred lineage into source-system truth.

+ +
+

Evidence boundary

+

Published source and release evidence remain authoritative. Lineage inference, retrieval, and model-assisted adjudication do not silently become source-system truth, authentication authority, tenant authority, measurement authority, or provider-routing authority.

+
+
+

ContextualWisdomLab / LineageWeave

+ + From 63e3d7af4cf456473a0cd170c84e94200c719cc9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:43:02 +0900 Subject: [PATCH 04/20] fix(pages): publish the intended landing source --- scripts/publish_ontology_site.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/publish_ontology_site.py b/scripts/publish_ontology_site.py index 677ea4a92..6665084d8 100644 --- a/scripts/publish_ontology_site.py +++ b/scripts/publish_ontology_site.py @@ -29,6 +29,7 @@ PROV_PROFILE_RELATIVE_PATH = Path("docs/ontology/prov-o-support-profile.ttl") COMPATIBILITY_RELATIVE_PATH = Path("docs/ontology/namespace-compatibility.ttl") SHAPES_RELATIVE_PATH = Path("docs/ontology/lineageweave-kg-shapes.ttl") +LANDING_RELATIVE_PATH = Path("docs/index.html") #: ADR 0207: the repository-case namespace is canonical and the #: lowercase form is the deprecated compatibility vocabulary. CANONICAL_NAMESPACE = "https://contextualwisdomlab.github.io/LineageWeave/ontology#" @@ -217,6 +218,7 @@ def publish_site(repository_root: Path, output_dir: Path) -> None: profile = root / PROV_PROFILE_RELATIVE_PATH compatibility_source = root / COMPATIBILITY_RELATIVE_PATH shapes_source = root / SHAPES_RELATIVE_PATH + landing_source = root / LANDING_RELATIVE_PATH if not source.is_file(): raise FileNotFoundError(f"ontology source is missing: {source}") if not profile.is_file(): @@ -227,6 +229,8 @@ def publish_site(repository_root: Path, output_dir: Path) -> None: ) if not shapes_source.is_file(): raise FileNotFoundError(f"SHACL shapes graph is missing: {shapes_source}") + if not landing_source.is_file(): + raise FileNotFoundError(f"public landing source is missing: {landing_source}") output = _validate_output_directory(output_dir, source, profile) renderer = _load_renderer(root) @@ -242,6 +246,7 @@ def publish_site(repository_root: Path, output_dir: Path) -> None: shutil.rmtree(output) try: renderer.build_site(root, output) + shutil.copyfile(landing_source, output / "index.html") except BaseException: shutil.rmtree(output, ignore_errors=True) raise From 8ecc3673bc790e784023ad51c201380b3b46f8e1 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:43:26 +0900 Subject: [PATCH 05/20] test(pages): bind publication to authoritative landing --- tests/test_public_landing.py | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 tests/test_public_landing.py diff --git a/tests/test_public_landing.py b/tests/test_public_landing.py new file mode 100644 index 000000000..ee9a2fcca --- /dev/null +++ b/tests/test_public_landing.py @@ -0,0 +1,56 @@ +"""Tests for the authoritative LineageWeave GitHub Pages landing source.""" + +from __future__ import annotations + +import importlib.util +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +SCRIPT = ROOT / "scripts" / "publish_ontology_site.py" + + +def _load_publisher(): + spec = importlib.util.spec_from_file_location("publish_ontology_site_landing", SCRIPT) + if spec is None or spec.loader is None: + raise AssertionError("ontology publisher could not be loaded") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def test_publication_copies_the_authoritative_landing_with_durable_navigation( + tmp_path: Path, +) -> None: + publisher = _load_publisher() + output = tmp_path / "site" + + publisher.publish_site(ROOT, output) + + source = (ROOT / publisher.LANDING_RELATIVE_PATH).read_text(encoding="utf-8") + published = (output / "index.html").read_text(encoding="utf-8") + assert published == source + for target in ( + 'href="ontology/"', + 'href="https://github.com/ContextualWisdomLab/LineageWeave"', + 'href="https://github.com/ContextualWisdomLab/LineageWeave/blob/main/README.md"', + 'href="https://github.com/ContextualWisdomLab/LineageWeave/blob/main/ARCHITECTURE.md"', + 'href="https://github.com/ContextualWisdomLab/LineageWeave/releases"', + 'href="https://deepwiki.com/ContextualWisdomLab/LineageWeave"', + ): + assert target in published + + +def test_publication_fails_closed_without_the_authoritative_landing( + tmp_path: Path, + monkeypatch, +) -> None: + publisher = _load_publisher() + output = tmp_path / "site" + monkeypatch.setattr(publisher, "LANDING_RELATIVE_PATH", Path("docs/missing-index.html")) + + with pytest.raises(FileNotFoundError, match="public landing source"): + publisher.publish_site(ROOT, output) + + assert not output.exists() From ced23d9b560a130dddce09b721ed371fd293f657 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:43:52 +0900 Subject: [PATCH 06/20] ci(pages): validate the public landing contract --- .github/workflows/ontology-pages.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ontology-pages.yml b/.github/workflows/ontology-pages.yml index 05e7000bb..46a2076ed 100644 --- a/.github/workflows/ontology-pages.yml +++ b/.github/workflows/ontology-pages.yml @@ -4,6 +4,7 @@ on: pull_request: branches: [main] paths: + - "docs/index.html" - "docs/ontology/**" - "scripts/build_ontology_site.py" - "scripts/publish_ontology_site.py" @@ -11,12 +12,14 @@ on: - "tests/test_ontology.py" - "tests/test_ontology_site.py" - "tests/test_publish_ontology_site.py" + - "tests/test_public_landing.py" - ".github/workflows/ontology-pages.yml" - "pyproject.toml" - "uv.lock" push: branches: [main] paths: + - "docs/index.html" - "docs/ontology/**" - "scripts/build_ontology_site.py" - "scripts/publish_ontology_site.py" @@ -24,6 +27,7 @@ on: - "tests/test_ontology.py" - "tests/test_ontology_site.py" - "tests/test_publish_ontology_site.py" + - "tests/test_public_landing.py" - ".github/workflows/ontology-pages.yml" - "pyproject.toml" - "uv.lock" @@ -64,7 +68,7 @@ jobs: run: | uv run --frozen python -m pytest -q tests/test_ontology.py uv run --frozen python -m coverage run --branch \ - -m pytest -q tests/test_ontology_site.py tests/test_publish_ontology_site.py + -m pytest -q tests/test_ontology_site.py tests/test_publish_ontology_site.py tests/test_public_landing.py uv run --frozen python -m coverage report \ --include=scripts/build_ontology_site.py,scripts/publish_ontology_site.py \ --fail-under=100 @@ -78,6 +82,7 @@ jobs: scripts/build_ontology_site.py scripts/publish_ontology_site.py scripts/ontology_site_contract.py tests/test_ontology_site.py tests/test_publish_ontology_site.py + tests/test_public_landing.py publish: name: Publish ontology to GitHub Pages @@ -117,7 +122,7 @@ jobs: run: | uv run --frozen python -m pytest -q tests/test_ontology.py uv run --frozen python -m coverage run --branch \ - -m pytest -q tests/test_ontology_site.py tests/test_publish_ontology_site.py + -m pytest -q tests/test_ontology_site.py tests/test_publish_ontology_site.py tests/test_public_landing.py uv run --frozen python -m coverage report \ --include=scripts/build_ontology_site.py,scripts/publish_ontology_site.py \ --fail-under=100 From 223931976c05e0abec6d1968d5af5586419b2bc3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 1 Sep 2026 22:43:57 +0900 Subject: [PATCH 07/20] docs: remove unpublished duplicate landing source --- docs/index.md | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 docs/index.md diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index c1232a088..000000000 --- a/docs/index.md +++ /dev/null @@ -1,32 +0,0 @@ -# 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. - -[Ask DeepWiki](https://deepwiki.com/ContextualWisdomLab/LineageWeave) · [Repository](https://github.com/ContextualWisdomLab/LineageWeave) · [Releases](https://github.com/ContextualWisdomLab/LineageWeave/releases) - -## 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](https://github.com/ContextualWisdomLab/LineageWeave/blob/main/README.md) -- [Architecture](https://github.com/ContextualWisdomLab/LineageWeave/blob/main/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 c86daf81527359a8f5b7ff3d68c2841d1dab3b33 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 1 Sep 2026 22:47:28 +0900 Subject: [PATCH 08/20] test(pages): include landing in publisher fixtures Signed-off-by: Codex Commit-Message-Assisted-by: Claude (via Claude Code) --- tests/test_publish_ontology_site.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_publish_ontology_site.py b/tests/test_publish_ontology_site.py index 99b60d3e3..b62003e90 100644 --- a/tests/test_publish_ontology_site.py +++ b/tests/test_publish_ontology_site.py @@ -54,6 +54,9 @@ def _repository_fixture(tmp_path: Path) -> Path: "lineageweave-kg-shapes.ttl", ): (ontology_dir / name).write_bytes((ROOT / "docs" / "ontology" / name).read_bytes()) + (repository / "docs" / "index.html").write_bytes( + (ROOT / "docs" / "index.html").read_bytes() + ) (scripts_dir / "build_ontology_site.py").write_bytes( (ROOT / "scripts" / "build_ontology_site.py").read_bytes() ) From 3ee5b071b910f326813ec364f3833a870e5e88da Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 00:50:45 +0900 Subject: [PATCH 09/20] test(ci): require explicit hosted runner images --- tests/test_github_hosted_runner_contract.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tests/test_github_hosted_runner_contract.py diff --git a/tests/test_github_hosted_runner_contract.py b/tests/test_github_hosted_runner_contract.py new file mode 100644 index 000000000..0bffdbb46 --- /dev/null +++ b/tests/test_github_hosted_runner_contract.py @@ -0,0 +1,18 @@ +"""Repository-owned Linux workflows use an explicit supported hosted image.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +WORKFLOWS = ( + ROOT / ".github" / "workflows" / "tests.yml", + ROOT / ".github" / "workflows" / "ontology-pages.yml", + ROOT / ".github" / "workflows" / "prov-o-contract.yml", +) + + +def test_repository_workflows_pin_ubuntu_2404() -> None: + """Reject floating Linux aliases after repeated pre-checkout queue starvation.""" + combined = "\n".join(path.read_text(encoding="utf-8") for path in WORKFLOWS) + assert "runs-on: ubuntu-latest" not in combined + assert combined.count("runs-on: ubuntu-24.04") == 5 From cb9ef1ca5d3f13d5cb4f41f2c98edb1aa5e6c4c8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 00:51:00 +0900 Subject: [PATCH 10/20] fix(ci): pin test runners to Ubuntu 24.04 --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 648b5e090..9cfeb6e06 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,7 +20,7 @@ jobs: pytest: name: Full test suite if: github.event_name != 'pull_request' || github.event.action != 'closed' - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 services: postgres: image: postgres:16-alpine@sha256:57c72fd2a128e416c7fcc499958864df5301e940bca0a56f58fddf30ffc07777 @@ -66,7 +66,7 @@ jobs: frontend: name: Frontend lint, test, build if: github.event_name != 'pull_request' || github.event.action != 'closed' - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Checkout repository uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # actions/checkout@v7 From 8f70c4862a0edce2d910f16c9675061ebf2ef164 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 00:51:23 +0900 Subject: [PATCH 11/20] fix(ci): pin Pages runners to Ubuntu 24.04 --- .github/workflows/ontology-pages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ontology-pages.yml b/.github/workflows/ontology-pages.yml index 46a2076ed..c81793008 100644 --- a/.github/workflows/ontology-pages.yml +++ b/.github/workflows/ontology-pages.yml @@ -43,7 +43,7 @@ jobs: concurrency: group: ontology-pages-validation-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Checkout repository uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # actions/checkout@v7 @@ -90,7 +90,7 @@ jobs: concurrency: group: ontology-pages-publication cancel-in-progress: false - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: contents: read pages: write From 3836855013a1756025d402cd972a89d383a1fb81 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 00:51:40 +0900 Subject: [PATCH 12/20] fix(ci): pin PROV-O runner to Ubuntu 24.04 --- .github/workflows/prov-o-contract.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prov-o-contract.yml b/.github/workflows/prov-o-contract.yml index eae453153..9e87e4d43 100644 --- a/.github/workflows/prov-o-contract.yml +++ b/.github/workflows/prov-o-contract.yml @@ -34,7 +34,7 @@ concurrency: jobs: standards-contract: name: Registry, inference, coverage, PostgreSQL - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 services: postgres: image: postgres:16-alpine@sha256:57c72fd2a128e416c7fcc499958864df5301e940bca0a56f58fddf30ffc07777 From 35b226b8940ee6542fe059febd94d189f4b83631 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 2 Sep 2026 01:00:52 +0900 Subject: [PATCH 13/20] fix(security): scope SRI exception to canonical metadata --- docs/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.html b/docs/index.html index 9c50dbb4f..8fb67aef2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -5,6 +5,7 @@ LineageWeave +