diff --git a/CHANGELOG.d/2.0.0-land-first-related-after-priya.md b/CHANGELOG.d/2.0.0-land-first-related-after-priya.md
new file mode 100644
index 000000000..2a45ea23d
--- /dev/null
+++ b/CHANGELOG.d/2.0.0-land-first-related-after-priya.md
@@ -0,0 +1,4 @@
+# 2.0.0 Land the first related node after Priya Nair is named
+
+Open Public post from the landed Demo Corp members and the popup lands
+Priya Nair related nodes under the first-related next action.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 51c3a60b3..735156c4d 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).
+## [2.0.0] - 2026-08-17
+
+### Added
+
+- Opening Public post from the landed Demo Corp members now lands
+ Priya Nair related nodes under the first-related next action, ahead
+ of Affiliate tree. Home list opens still wait for a related click.
+ No TEPP theta is invented. No cutoff body is invented (ADR 0016).
+
## [1.9.0] - 2026-08-17
### Added
diff --git a/CLAUDE.md b/CLAUDE.md
index 7b5ca8ca3..096852a4b 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -54,5 +54,6 @@ Lineage DAG marks that post current. After that current node, the
popup names Keyman and evaluation as the next read. After landed
evaluation, the popup names the first Keyman as the next read. After
landed Ada West related, the popup names the first related node as
-the next read. Changing the week first still focuses the report
+the next read. After that next action, the popup lands Priya Nair
+related nodes. 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 72127cf5b..24240f91f 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,7 +1,7 @@
{
"name": "frontend",
"private": true,
- "version": "1.9.0",
+ "version": "2.0.0",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx
index c2640786c..b4fab0d22 100644
--- a/frontend/src/App.test.tsx
+++ b/frontend/src/App.test.tsx
@@ -1477,6 +1477,7 @@ describe("App, authenticated", () => {
expect(screen.queryByRole("status", { name: "Keyman next action" })).not.toBeInTheDocument();
expect(screen.queryByRole("status", { name: "Related next action" })).not.toBeInTheDocument();
expect(screen.queryByText("Related to Ada West")).not.toBeInTheDocument();
+ expect(screen.queryByText("Related to Priya Nair")).not.toBeInTheDocument();
const popup = document.querySelector(".popup-panel");
expect(popup).not.toBeNull();
const evaluation = within(popup as HTMLElement).getByRole("heading", {
@@ -2333,10 +2334,24 @@ describe("App, authenticated", () => {
expect(relatedNext).toHaveTextContent(
"Priya Nair is the first related node. Read that person next.",
);
+ expect(
+ within(popup as HTMLElement).getByRole("button", {
+ name: "Related nodes for Priya Nair (Counterparty)",
+ }),
+ ).toHaveAttribute("aria-current", "true");
+ const landedRelated = await within(popup as HTMLElement).findByRole("heading", {
+ name: "Related to Priya Nair",
+ });
+ expect(
+ within(landedRelated.closest(".related-keymen") as HTMLElement).getByText(/Ada West/),
+ ).toBeInTheDocument();
expect(related.compareDocumentPosition(relatedNext) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(
0,
);
- expect(relatedNext.compareDocumentPosition(affiliate) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(
+ expect(
+ relatedNext.compareDocumentPosition(landedRelated) & Node.DOCUMENT_POSITION_FOLLOWING,
+ ).not.toBe(0);
+ expect(landedRelated.compareDocumentPosition(affiliate) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(
0,
);
} finally {
@@ -2613,6 +2628,7 @@ describe("App, authenticated", () => {
expect(await screen.findByRole("status", { name: "Related next action" })).toHaveTextContent(
"Priya Nair is the first related node. Read that person next.",
);
+ expect(await screen.findByRole("heading", { name: "Related to Priya Nair" })).toBeInTheDocument();
});
it("lets post_admin rebuild the period report", async () => {
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 047f5b636..e1db31c1d 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -568,6 +568,7 @@ function KeymanPanel({
focusEntity,
focusTeam,
landFirstKeyman,
+ landFirstRelated,
afterList,
}: {
postId: string;
@@ -580,10 +581,13 @@ function KeymanPanel({
focusEntity?: { entityId: string; entityName: string } | null;
focusTeam?: { teamId: string; teamName: string } | null;
landFirstKeyman?: boolean;
+ landFirstRelated?: boolean;
afterList?: ReactNode;
}) {
const [related, setRelated] = useState
Loading related nodes...
+ ) : landedRelated.length === 0 ? ( +No related nodes in the visible graph.
+ ) : ( +