Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.d/2.6.0-land-first-ask-answer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# 2.6.0 Land the first Ask answer under the named seed next action

Open Public post from the landed Demo Corp members and the first seeded
Ask answer sits under the Ask seed next action, ahead of the input.
Home list opens keep that answer after the input.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.6.0] - 2026-08-17

### Added

- Opening Public post from the landed Demo Corp members now puts the
first Ask answer immediately under the named seed next action, ahead
of the chat input. Home list opens keep that answer after the input.
No TEPP theta is invented. No cutoff body is invented (ADR 0016).

## [2.5.0] - 2026-08-17

### Added
Expand Down
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ landed Ada West related, the popup names the first related node as
the next read. After that next action, the popup lands Priya Nair
related nodes. After those related nodes land, the popup names Ask
about this lineage as the next read. After that next action, the
popup lands Ask about this lineage. Changing the week first still
popup lands Ask about this lineage. After landed chat, the popup names
the first Ask. After that next action, the popup lands the first Ask
answer. Changing the week first still
focuses the report period field. Mean θ stays on the period-report
panel.
2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "frontend",
"private": true,
"version": "2.5.0",
"version": "2.6.0",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
41 changes: 40 additions & 1 deletion frontend/src/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1521,6 +1521,19 @@ describe("App, authenticated", () => {
expect(
screen.getByText("The next commitment is Send Northridge Grid the revised quote, due 2026-01-12."),
).toBeInTheDocument();
const homePopup = document.querySelector(".popup-panel");
expect(homePopup).not.toBeNull();
const homeAsk = within(homePopup as HTMLElement).getByRole("heading", {
name: "Ask about this lineage",
});
const homeInput = within(homePopup as HTMLElement).getByPlaceholderText(/what happened/i);
const homeAnswer = within(homePopup as HTMLElement).getByText(
"The seeded follow-up after the site visit.",
);
expect(homeAsk.compareDocumentPosition(homeInput) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(0);
expect(homeInput.compareDocumentPosition(homeAnswer) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(
0,
);
expect(screen.getByRole("button", { name: /ask seeded question: what happened between these events/i })).toBeInTheDocument();
expect(screen.getByRole("button", { name: /ask seeded question: who is involved/i })).toBeInTheDocument();
expect(screen.getByRole("button", { name: /ask seeded question: what is the next commitment/i })).toBeInTheDocument();
Expand Down Expand Up @@ -2396,6 +2409,22 @@ describe("App, authenticated", () => {
name: "Ask seeded question: What happened between these events?",
}),
).toHaveAttribute("aria-current", "true");
const firstAskAnswer = within(popup as HTMLElement).getByText(
"The seeded follow-up after the site visit.",
);
const askInput = within(popup as HTMLElement).getByPlaceholderText(/what happened/i);
expect(
askSeed.compareDocumentPosition(firstAskAnswer) & Node.DOCUMENT_POSITION_FOLLOWING,
).not.toBe(0);
expect(
firstAskAnswer.compareDocumentPosition(askInput) & Node.DOCUMENT_POSITION_FOLLOWING,
).not.toBe(0);
expect(
firstAskAnswer.compareDocumentPosition(affiliate) & Node.DOCUMENT_POSITION_FOLLOWING,
).not.toBe(0);
expect(
within(popup as HTMLElement).getAllByText("The seeded follow-up after the site visit."),
).toHaveLength(1);
await waitFor(() => expect(document.getElementById("post-ask")).toHaveFocus());
} finally {
HTMLElement.prototype.scrollIntoView = originalScrollIntoView;
Expand Down Expand Up @@ -2681,9 +2710,19 @@ describe("App, authenticated", () => {
const askNext = screen.getByRole("status", { name: "Ask next action" });
expect(askNext.compareDocumentPosition(ask) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(0);
expect(ask.compareDocumentPosition(affiliate) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(0);
expect(await screen.findByRole("status", { name: "Ask seed next action" })).toHaveTextContent(
const askSeed = await screen.findByRole("status", { name: "Ask seed next action" });
expect(askSeed).toHaveTextContent(
"What happened between these events? is the first Ask. Read that answer next.",
);
const firstAskAnswer = within(popup as HTMLElement).getByText(
"The seeded follow-up after the site visit.",
);
expect(
askSeed.compareDocumentPosition(firstAskAnswer) & Node.DOCUMENT_POSITION_FOLLOWING,
).not.toBe(0);
expect(firstAskAnswer.compareDocumentPosition(affiliate) & Node.DOCUMENT_POSITION_FOLLOWING).not.toBe(
0,
);
await waitFor(() => expect(document.getElementById("post-ask")).toHaveFocus());
});

Expand Down
18 changes: 17 additions & 1 deletion frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,17 @@ function ChatPanel({
{firstAskNextAction(exchanges[0].question_text)}
</p>
) : null}
{nameFirstAsk && exchanges[0] ? (
<div key={`seeded-${exchanges[0].question_text}`} className="chat-answer">
<p className="chat-question">{exchanges[0].question_text}</p>
<p>{exchanges[0].answer_text}</p>
<ChatCitations
citedPosts={exchanges[0].cited_posts}
citedPostIds={exchanges[0].cited_post_ids}
onOpenEvidence={setEvidencePostId}
/>
</div>
) : null}
{!seededOnly && (
<div className="chat-input-row">
<input
Expand Down Expand Up @@ -260,7 +271,12 @@ function ChatPanel({
</div>
)}
{error && <p className="error">{error}</p>}
{exchanges.map((exchange) => (
{exchanges
.filter(
(exchange) =>
!(nameFirstAsk && exchange.question_text === exchanges[0]?.question_text),
)
.map((exchange) => (
<div key={`seeded-${exchange.question_text}`} className="chat-answer">
<p className="chat-question">{exchange.question_text}</p>
<p>{exchange.answer_text}</p>
Expand Down
2 changes: 1 addition & 1 deletion lineageweave/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,4 @@
"sentence_excerpts",
]

__version__ = "2.5.0"
__version__ = "2.6.0"
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "lineageweave"
version = "2.5.0"
version = "2.6.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" }
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.