Skip to content

feat(dashboard): add evidence-grounded operations workspace - #607

Merged
seonghobae merged 4 commits into
feat/tepp-lineage-anchor-consumerfrom
feat/evidence-operations-dashboard
Aug 25, 2026
Merged

feat(dashboard): add evidence-grounded operations workspace#607
seonghobae merged 4 commits into
feat/tepp-lineage-anchor-consumerfrom
feat/evidence-operations-dashboard

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Outcome

Adds the authenticated / operations Dashboard and semantic operational-case persistence for claim investigation, rebid/handover, external information, and repeat-issue evidence. Counts separate visible posts from classified Events, use Event occurrence time, retain extractive source spans, and open the cited post as the next action. External information remains in the Dashboard GNB; no duplicate board is added.

Ask delivery now packages cited answers for reports, alert eligibility, and future MCP resource URIs. Storybook covers dashboard and similar-VOC evidence states.

Stack

Verification

  • focused backend after latest main merge: 93 passed
  • focused frontend/dashboard/navigation: 5 passed, 162 skipped by filter
  • frontend lint and production build passed
  • Storybook production build passed
  • desktop and 390px screenshots inspected

Honest boundary

No keyword classifier or arbitrary fusion weight was added. Similar-VOC semantic adjudication is implemented and Storybook-audited, but its live per-post endpoint/mount remains a follow-up before that subfeature can be claimed shipped. Authenticated production backfill/runtime evidence also remains pending.


Open in Devin Review

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ab733f2c-6294-412e-af0c-c225455e7d3f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae
seonghobae merged commit 61fd631 into feat/tepp-lineage-anchor-consumer Aug 25, 2026
2 of 4 checks passed

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 4 potential issues.

Open in Devin Review

Comment thread frontend/src/App.tsx
Comment on lines +4926 to +4928
const [destination, setDestination] = useState<WorkspaceDestination>(
import.meta.env.MODE === "test" ? "board" : "dashboard",
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Shared post links no longer open the post

The default destination is now dashboard in production while a ?post= URL is still parsed into postToOpen. The PostList that consumes it only mounts on the board destination, and nothing switches to board when a deep-link post id is present, so the linked post never opens and the user lands on the dashboard. Previously the board was the default and deep links opened the post.

Prompt for agents
After changing the default workspace destination to "dashboard" in production, deep links of the form ?post=<id> no longer open the target post because PostList (the board) only mounts when destination==="board", and postToOpen is only consumed there. Restore the deep-link behavior: when a post id is present in the URL (or postToOpen is set), initialize/switch the destination to "board" so the PostList mounts and opens the post. Consider computing the initial destination from the presence of the ?post= parameter, or add an effect that sets destination to "board" when postToOpen becomes non-null.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread frontend/src/App.css
Comment on lines +1248 to +1254
@media (prefers-color-scheme: dark) {
:root {
--color-dashboard-ink: #adcafc;
--color-dashboard-positive: #9bc69e;
--color-dashboard-surface: #1f2028;
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Dashboard dark tokens split across App.css and tokens.css

The new dashboard tokens have light values in tokens.css, but their dark overrides sit in a separate :root dark block in App.css instead of the existing dark block in tokens.css. It works via the cascade and tokens.test.ts does not check these tokens, but it splits one token's light/dark definitions across two files.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

from typing import Mapping, Protocol, Sequence

from .http_client import chat_completion_content, post_json
from .rankweave_client import RankWeaveClient, RankingList

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Similar-VOC module has no runtime mount

similar_voc.py and SimilarVocPanel ship with tests and Storybook but are never imported into a real route or worker, consistent with the author's stated follow-up. Confirm the tests' import of RankingList from rankweave_client resolves so the test file does not error at collection.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +303 to +315
cases = await asyncio.to_thread(
case_client.analyze,
str(row["post_title"]),
normalized.text,
context,
)
async with pool.acquire() as conn:
await persist_operations_cases(
conn,
post_id,
raw_body,
metadata["lineageweave_post_session_id"],
cases,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Case evidence validated against normalized text, digest binds raw body

The case client receives normalized.text and parse_operations_case_response validates evidence spans against it, while persist_operations_cases stores source_body_digest(raw_body). Invalidation stays consistent, but stored evidence spans are guaranteed verbatim only in the normalized text, not the raw source body a reader opens.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant