diff --git a/CHANGELOG.d/1.7.0-name-first-keyman-after-eval.md b/CHANGELOG.d/1.7.0-name-first-keyman-after-eval.md new file mode 100644 index 000000000..a6683348e --- /dev/null +++ b/CHANGELOG.d/1.7.0-name-first-keyman-after-eval.md @@ -0,0 +1,4 @@ +# 1.7.0 Name the first Keyman after landed evaluation + +Open Public post from the landed Demo Corp members and the popup names +the first Keyman after landed evaluation. diff --git a/CHANGELOG.md b/CHANGELOG.md index 33f8e1dee..ce0f9137b 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.7.0] - 2026-08-17 + +### Added + +- Opening Public post from the landed Demo Corp members now names the + first Keyman after landed evaluation: Ada West, then read that + person. Home list opens do not add that copy. No TEPP theta is + invented. No cutoff body is invented (ADR 0016). + ## [1.6.0] - 2026-08-17 ### Added diff --git a/CLAUDE.md b/CLAUDE.md index 92725c1ae..14b58dda7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -51,6 +51,7 @@ members land immediately under that next action, ahead of Other Corp and the week strip. Opening Public post names the next action: read Event Lineage, Keyman, and evaluation on that post. The popup Event Lineage DAG marks that post current. After that current node, the -popup names Keyman and evaluation as the next read. Changing the week -first still focuses the report period field. Mean θ stays on the -period-report panel. +popup names Keyman and evaluation as the next read. After landed +evaluation, the popup names the first Keyman as the next read. +Changing the week first still focuses the report period field. Mean θ +stays on the period-report panel. diff --git a/frontend/package.json b/frontend/package.json index 7d93d7543..47582abbb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "1.6.0", + "version": "1.7.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index a4139577c..74e006b8a 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -1474,6 +1474,7 @@ describe("App, authenticated", () => { expect( screen.queryByRole("status", { name: "Event Lineage next action" }), ).not.toBeInTheDocument(); + expect(screen.queryByRole("status", { name: "Keyman next action" })).not.toBeInTheDocument(); const popup = document.querySelector(".popup-panel"); expect(popup).not.toBeNull(); const evaluation = within(popup as HTMLElement).getByRole("heading", { @@ -2311,8 +2312,13 @@ describe("App, authenticated", () => { 0, ); expect(keyman.compareDocumentPosition(evaluation) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(0); + const keymanNext = await screen.findByRole("status", { name: "Keyman next action" }); + expect(keymanNext).toHaveTextContent("Ada West is the first Keyman. Read that person next."); expect( - evaluation.compareDocumentPosition(affiliate) & Node.DOCUMENT_POSITION_FOLLOWING, + evaluation.compareDocumentPosition(keymanNext) & Node.DOCUMENT_POSITION_FOLLOWING, + ).not.toBe(0); + expect( + keymanNext.compareDocumentPosition(affiliate) & Node.DOCUMENT_POSITION_FOLLOWING, ).not.toBe(0); } finally { HTMLElement.prototype.scrollIntoView = originalScrollIntoView; @@ -2581,6 +2587,9 @@ describe("App, authenticated", () => { expect(screen.getByRole("status", { name: "Event Lineage next action" })).toHaveTextContent( "Public post is current in Event Lineage. Read Keyman and evaluation next.", ); + expect(await screen.findByRole("status", { name: "Keyman next action" })).toHaveTextContent( + "Ada West is the first Keyman. Read that person next.", + ); }); it("lets post_admin rebuild the period report", async () => { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 57f3a2038..1c0c36ac9 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -275,6 +275,10 @@ function eventLineageCurrentNextAction(postTitle: string): string { return `${postTitle} is current in Event Lineage. Read Keyman and evaluation next.`; } +function firstKeymanNextAction(personName: string): string { + return `${personName} is the first Keyman. Read that person next.`; +} + function EventLineageSection({ lineage, graph, @@ -1430,6 +1434,11 @@ function PostDetailPopup({ canExtract={canExtract} onEvaluated={(rows) => setEvaluation(rows)} /> + {keymen?.[0] ? ( +

+ {firstKeymanNextAction(keymen[0].person_name)} +

+ ) : null} )} diff --git a/lineageweave/__init__.py b/lineageweave/__init__.py index 0d4e0f989..fa84379c8 100644 --- a/lineageweave/__init__.py +++ b/lineageweave/__init__.py @@ -55,4 +55,4 @@ "sentence_excerpts", ] -__version__ = "1.6.0" +__version__ = "1.7.0" diff --git a/pyproject.toml b/pyproject.toml index 587115950..b256d6676 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "1.6.0" +version = "1.7.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 b1250c094..6c879e6e3 100644 --- a/uv.lock +++ b/uv.lock @@ -454,7 +454,7 @@ wheels = [ [[package]] name = "lineageweave" -version = "1.6.0" +version = "1.7.0" source = { virtual = "." } dependencies = [ { name = "certifi" },