From 5ee7bcc63bfc7265f7bcd03fe47aab461a6e941b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 17 Aug 2026 14:21:01 +0900 Subject: [PATCH] feat: mark the opened post current in Event Lineage (v1.4.0) Opening Public post from Demo Corp members now marks that node current in the popup Event Lineage DAG so the focused heading has a you-are-here marker. The home DAG stays unmarked. --- CHANGELOG.d/1.4.0-current-event-lineage-node.md | 4 ++++ CHANGELOG.md | 9 +++++++++ frontend/package.json | 2 +- frontend/src/App.css | 5 +++++ frontend/src/App.test.tsx | 10 ++++++++++ frontend/src/App.tsx | 2 +- frontend/src/LineageDag.tsx | 4 ++++ lineageweave/__init__.py | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 10 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 CHANGELOG.d/1.4.0-current-event-lineage-node.md diff --git a/CHANGELOG.d/1.4.0-current-event-lineage-node.md b/CHANGELOG.d/1.4.0-current-event-lineage-node.md new file mode 100644 index 000000000..a41cb4129 --- /dev/null +++ b/CHANGELOG.d/1.4.0-current-event-lineage-node.md @@ -0,0 +1,4 @@ +# 1.4.0 Current Event Lineage node + +Open Public post from the landed Demo Corp members and the popup Event +Lineage DAG marks that post current. The home DAG does not. diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e98c688b..8a0f85648 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to this project are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.4.0] - 2026-08-17 + +### Added + +- Opening Public post from the landed Demo Corp members marks that + post current in the popup Event Lineage DAG, so the focused heading + has a you-are-here node. The home DAG stays unmarked. No TEPP theta + is invented. No cutoff body is invented (ADR 0016). + ## [1.3.0] - 2026-08-17 ### Added diff --git a/frontend/package.json b/frontend/package.json index 0361d7c2b..c29108ea1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "1.3.0", + "version": "1.4.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/App.css b/frontend/src/App.css index d43b5d75f..78fced0e0 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -283,6 +283,11 @@ stroke-width: 2.5; } +.lineage-dag-node[aria-current="true"] circle { + stroke-width: 3; + stroke: canvastext; +} + .keyman-list { list-style: none; padding: 0; diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index 5aa1b02dd..f96a80009 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -2266,6 +2266,16 @@ describe("App, authenticated", () => { screen.getAllByRole("heading", { name: "Event Lineage" }).length, ).toBeGreaterThanOrEqual(2); expect(document.getElementById("post-event-lineage")).toHaveFocus(); + const popup = document.querySelector(".popup-panel"); + expect(popup).not.toBeNull(); + expect(within(popup as HTMLElement).getByLabelText("Open post: Public post")).toHaveAttribute( + "aria-current", + "true", + ); + const homeNode = screen + .getAllByLabelText("Open post: Public post") + .find((node) => !popup?.contains(node)); + expect(homeNode).not.toHaveAttribute("aria-current"); } finally { HTMLElement.prototype.scrollIntoView = originalScrollIntoView; } diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index ce0f8a08a..81f2173b8 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -303,7 +303,7 @@ function EventLineageSection({ return ( <> {scoped.nodes.length > 0 && onSelectPost && ( - + )} {hasLinks && (
    diff --git a/frontend/src/LineageDag.tsx b/frontend/src/LineageDag.tsx index a4b296a9a..c0398b3aa 100644 --- a/frontend/src/LineageDag.tsx +++ b/frontend/src/LineageDag.tsx @@ -8,9 +8,11 @@ function truncateLabel(label: string): string { export function LineageDag({ graph, onSelectPost, + currentPostId, }: { graph: LineageGraph; onSelectPost: (postId: string) => void; + currentPostId?: string; }) { const groups = layoutLineageDag(graph); if (graph.nodes.length === 0) { @@ -50,6 +52,7 @@ export function LineageDag({ })} {group.nodes.map((node) => { const kind = node.is_branch_point ? "branch" : node.is_root ? "root" : "node"; + const isCurrent = node.id === currentPostId; return ( onSelectPost(node.id)} onKeyDown={(event) => { if (event.key === "Enter" || event.key === " ") { diff --git a/lineageweave/__init__.py b/lineageweave/__init__.py index 595ce60bf..1658144d4 100644 --- a/lineageweave/__init__.py +++ b/lineageweave/__init__.py @@ -55,4 +55,4 @@ "sentence_excerpts", ] -__version__ = "1.3.0" +__version__ = "1.4.0" diff --git a/pyproject.toml b/pyproject.toml index f346811ae..5f7b01225 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "1.3.0" +version = "1.4.0" description = "Reconstructs git-branch-style lineage DAGs from scattered short records using multi-channel score fusion and LLM adjudication." readme = "README.md" license = { text = "MIT" } diff --git a/uv.lock b/uv.lock index ff19ac892..848abc537 100644 --- a/uv.lock +++ b/uv.lock @@ -454,7 +454,7 @@ wheels = [ [[package]] name = "lineageweave" -version = "1.3.0" +version = "1.4.0" source = { virtual = "." } dependencies = [ { name = "certifi" },