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
47 changes: 47 additions & 0 deletions echo/docs/plans/smart-loop-briefs/wave29-REPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Wave 29 Drive-By Insight Sweep Report

## Summary

- Added a transcript scroll-to-bottom affordance on the conversation transcript view. The shared scroll button now uses a Phosphor icon, while existing project chat scroll controls keep their current behavior.
- Replaced hardcoded canvas cadence copy with labels derived from actual cadence config. Static canvases now say they do not update on their own, and active loops show the configured cadence.
- Added `?chunk=<id>` support alongside existing `#chunk-<id>` anchors, moved chunk scrolling into a tested hook, and updated chat reference/source links to emit chunk anchors only when chunk-level data is present.
- Made canvas fullscreen use the full dynamic viewport with a 100dvh/100dvw wrapper and iframe, removing the previous padded/dead-band layout.
- Added a participant portal "ready to record" confirmation step after name/details entry. `skipOnboarding=1` still starts recording directly.

## Files Changed

- `echo/frontend/package.json`
- `echo/frontend/pnpm-lock.yaml`
- `echo/frontend/src/components/canvas/CanvasFrame.tsx`
- `echo/frontend/src/components/canvas/cadenceLabel.ts`
- `echo/frontend/src/components/canvas/cadenceLabel.test.ts`
- `echo/frontend/src/components/chat/CanvasSuggestionCard.tsx`
- `echo/frontend/src/components/chat/References.tsx`
- `echo/frontend/src/components/chat/Sources.tsx`
- `echo/frontend/src/components/chat/conversationReferenceLinks.ts`
- `echo/frontend/src/components/common/ScrollToBottom.tsx`
- `echo/frontend/src/components/conversation/ConversationTranscriptSection.tsx`
- `echo/frontend/src/components/conversation/useChunkAnchorScroll.ts`
- `echo/frontend/src/components/conversation/useChunkAnchorScroll.test.tsx`
- `echo/frontend/src/components/participant/ParticipantInitiateForm.tsx`
- `echo/frontend/src/locales/*.po`
- `echo/frontend/src/locales/*.ts`
- `echo/frontend/src/routes/project/canvas/CanvasRoute.tsx`

## QA Gates

- `cd echo/frontend && npx tsc --noEmit`: passed.
- `cd echo/frontend && ./node_modules/.bin/biome lint . --diagnostic-level=error`: passed, `Checked 447 files`.
- `cd echo/frontend && ./node_modules/.bin/lingui extract`: passed.
- `cd echo/frontend && ./node_modules/.bin/lingui compile --typescript`: passed.
- `cd echo/frontend && ./node_modules/.bin/vitest run src/components/canvas/cadenceLabel.test.ts src/components/conversation/useChunkAnchorScroll.test.tsx --environment jsdom`: passed, `2 passed`, `5 tests passed`.
- `git diff --check`: passed.

## Screenshots

No screenshots were captured. The changed views depend on live BFF/participant portal data and the brief said not to block on the full podman stack.

## Notes

- Scope stayed within `echo/frontend` plus this report. No `echo/server`, `echo/agent`, or `echo/directus` files were changed.
- `pnpm` is not directly on PATH in this shell; dependencies were added through `corepack pnpm`. The install completed package/lock updates but returned pnpm's ignored-build-scripts warning, so QA commands were run through local binaries and `npx`.
67 changes: 67 additions & 0 deletions echo/docs/plans/smart-loop-briefs/wave29-driveby.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Brief: Wave 29 — drive-by insight sweep (frontend/portal only)

Start: you are already on branch sameer/driveby-insights (tracking
origin/main) in this worktree. Do NOT run any git write commands.

Scope guard: echo/frontend only. Do not touch echo/server, echo/agent, or
echo/directus. If a fix truly requires a server change, document it in the
report instead of making it.

Five small, independent fixes from the live agent_insight backlog. Each is
participant- or host-visible tomorrow morning; polish matters.

## 1. Scroll-to-bottom button

Long participant response lists (conversation view) force manual scrolling
to reach the newest content ("really annoying" — said live). Add a small
floating scroll-to-bottom affordance that appears only when scrolled away
from the bottom, on the conversation transcript/responses view (and the
project chat panel if it lacks one). Subtle variant, Phosphor icon, brand
rules (no bold, lowercase dembrane).

## 2. Honest cadence label on canvas cards

CanvasSuggestionCard (echo/frontend/src/components/chat/) shows a hardcoded
"updates every few minutes" style label even when the proposed canvas is
static / non-looping. Derive the label from the actual proposal config:
real cadence when it loops, a clear quiet "does not update on its own"
state when it does not. Same honesty on the canvas route freshness cluster
if it shows a cadence that does not match the loop config.

## 3. Conversation links land on the moment

Chat references and canvas links currently land at the top of a
conversation. Add support on the conversation route for a chunk anchor
(e.g. ?chunk=<id> or #chunk-<id>): scroll to and briefly highlight that
chunk on load. Then, wherever the frontend renders references that already
carry chunk-level data, emit the deep link. Do NOT invent chunk ids where
the data lacks them — conversation-level links stay as they are.

## 4. Full-viewport fullscreen

Canvas presentation/fullscreen mode: the container stops abruptly and does
not scale to full viewport height (host friction, in_progress). Make the
fullscreen wrapper truly 100dvh/100dvw, iframe filling it, no dead bands.
Check both the dashboard canvas route and any standalone present mode.

## 5. Ready-to-record portal step

Participant portal: after entering a name, recording starts immediately.
The team asked for an intermediate "ready to start" state during live QR
testing. Add a lightweight confirmation step between name entry and active
recording: name confirmed -> a calm "ready to record — start when you are"
screen with a single primary start action. Must not regress the funnel
beacons (scanned/onboarding stages report via existing hooks — see
ParticipantOnboardingCards/ParticipantStart) or the skipOnboarding QR
parameter (skip flows keep skipping straight to recording).

## QA gates

- cd echo/frontend && npx tsc --noEmit
- biome lint (repo convention)
- lingui extract + compile after ANY user-facing string change (raw
message-id hashes in the UI is the named failure)
- vitest for the cadence-label derivation and the chunk-anchor scroll hook
- Report -> echo/docs/plans/smart-loop-briefs/wave29-REPORT.md with a
file list, gate output summary, and screenshots if a local run is
feasible (do not block on the full podman stack).
6 changes: 5 additions & 1 deletion echo/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"format": "biome format --write .",
"format:check": "biome format .",
"lint": "biome lint . --diagnostic-level=error",
"test": "vitest",
"lint:fix": "biome lint --write .",
"check": "biome check .",
"fix": "biome check --write .",
Expand Down Expand Up @@ -107,6 +108,7 @@
"@lingui/vite-plugin": "^5.3.3",
"@playwright/test": "^1.61.0",
"@tailwindcss/typography": "^0.5.16",
"@testing-library/react": "^16.3.2",
"@types/d3-array": "^3.2.2",
"@types/d3-scale": "^4.0.9",
"@types/d3-selection": "^3.0.11",
Expand All @@ -121,11 +123,13 @@
"autoprefixer": "^10.4.21",
"babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206",
"debug": "^4.4.0",
"jsdom": "^29.1.1",
"postcss": "^8.5.3",
"postcss-preset-mantine": "^1.17.0",
"postcss-simple-vars": "^7.0.1",
"tailwindcss": "^3.4.17",
"typescript": "^5.8.2",
"vite": "^6.4.3"
"vite": "^6.4.3",
"vitest": "^4.1.9"
}
}
Loading
Loading