feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3) - #1661

Merged
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui
Apr 24, 2026
Merged

feat(amicus): v2 UI wiring — trust footer, study actions, thread surfaces (3/3)#1661
CraigBuckmaster merged 3 commits into
masterfrom
feat/amicus-v2-ui

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Part 3 of 3 — salvaging codex/amicus-auth-access-hardening

UI wiring layer for the Amicus v2 work. Stacks on PR #1660 (foundation).

Base branch: feat/amicus-v2-foundation (not master). The diff shown here is the UI surface only; DB migrations, services, types, queries, and mutations live in the parent PR. Do not merge this before #1660.

Independent of PR #1658 (auth/access hardening) — can merge in either order relative to PR 1.

Critical preservation: #1654

The codex branch was cut before #1654 (stepper bounce-back fix) merged, so the codex version of StudySessionScreen.tsx reverts that fix. The bug makes Scene/Observe/Explore/Synthesize taps appear inert: a naïve useEffect fires on every currentStep change and snaps the user back to initialStep.

This PR re-applies #1654's useRef-guarded one-shot sync, with an inline comment naming the issue so a future rebase or merge resolution doesn't silently regress it. The guard is keyed on sessionId so moving between chapters (which spawns a new session) still applies initialStep once for the new session.

// Preserves #1654. The codex branch (codex/amicus-auth-access-hardening)// was cut before #1654 merged and reverts this guard. Do NOT remove it// without the bounce-back bug returning...constappliedInitialStepForSessionRef=useRef<number|null>(null);useEffect(()=>{if(sessionId==null||!initialStep)return;if(appliedInitialStepForSessionRef.current===sessionId)return;appliedInitialStepForSessionRef.current=sessionId;if(currentStep!==initialStep){voidsetSessionStep(initialStep);}},[currentStep,initialStep,sessionId,setSessionStep]);

What's in

Components

FileStatusWhat it does
components/amicus/TrustFooter.tsxnewRenders summarizeAmicusTrust output: source count, labels, debated-stance chip when citations reference debate_topic content
components/amicus/StudyActionRow.tsxnewRenders buildStudyActionSeeds into a horizontal row of one-tap chapter-aware actions
components/amicus/AmicusFab.tsxmodChapter-aware context, respects useAmicusAccess changes
components/amicus/AmicusPeekSheet.tsxmodWires promotePeekToAmicusThread — promoted peek resumes the right thread if one exists
components/amicus/AssistantMessageBubble.tsxmodRenders TrustFooter below each assistant message

Hooks

FileStatusWhat it does
hooks/useAmicusContext.tsnewShared chapter/session/entry-point context across Amicus surfaces
hooks/useAmicusChapterStudyThread.tsnewResolves "is there an existing study thread for this chapter" for FAB/peek routing
hooks/useAmicusGuidedRouteContext.tsnewExtracts guided-study context from the current route
hooks/useAmicusThread.tsmodThread-context awareness (linked question reopen, guided-step badge)
hooks/usePeekConversation.tsmodPromote-flow integration
hooks/useAmicusChipContext.tsmodExtended context shape

Screens

Navigation

  • navigation/types.tsThread + NewThread params extended with seedGuidedContext, seedChapterRef, promotedMessages for the launch flow.

Tests

  • New: AmicusThreadListScreen, AmicusThreadScreen, MyStudyScreen, useAmicusThread tests
  • Extended: AmicusNewThreadScreen, useAmicusChipContext, usePeekConversation, AmicusPeekSheet, AssistantMessageBubble

Out of scope

Test plan

  • tsc --noEmit + jest via CI
  • Manual smoke (rentamac iOS simulator):
    1. fix(guided-study): stepper taps no longer bounce back to initialStep #1654 regression check — on a Genesis 1 session that's already past "scene", open Study, verify every stepper pill tap lands and stays
    2. FAB → peek → promote to full thread from a chapter; verify the right thread opens (existing if one matches, new otherwise)
    3. Guided study → Synthesize → "Investigate question" / "Trace connection" — verifies launchAmicusStudyThread dedup and seed-query variants
    4. Thread list shows enriched metadata (chapter ref, summary, guided-step indicator, open-question dot)
    5. Assistant message shows TrustFooter when citations present; Debated stance when a debate_topic citation is in the set

Rollback

Revert the single merge. All UI changes disappear; the foundation (PR #1660) stays and the DB tables remain, but nothing reads or writes to them from the UI. Amicus returns to its pre-PR-3 behavior. #1654's fix stays in place via the parallel work on master.

…aces
Part 3 of splitting codex/amicus-auth-access-hardening. This PR stacks
on PR #1660 (v2 foundation) and wires all the UI surfaces that consume
the services, queries, and types that PR ships.
Base: feat/amicus-v2-foundation (NOT master). The GitHub UI should show
only UI diffs; service/type/DB changes live in PR #1660.
## What's in
### Components
- components/amicus/TrustFooter.tsx (new) — renders
summarizeAmicusTrust output in message tails: source count, labels,
debated-stance chip when citations reference debate_topic content.
- components/amicus/StudyActionRow.tsx (new) — renders
buildStudyActionSeeds into a horizontal row of one-tap action
buttons on chapter-aware Amicus surfaces.
- components/amicus/AmicusFab.tsx — respects useAmicusAccess changes
and new chapter-aware context.
- components/amicus/AmicusPeekSheet.tsx — wires promotePeekToAmicusThread
so a promoted peek resumes the right thread if one already exists.
- components/amicus/AssistantMessageBubble.tsx — renders TrustFooter
below each assistant message.
### Hooks
- hooks/useAmicusContext.ts (new) — shared source of chapter/session/
entry-point context across Amicus surfaces.
- hooks/useAmicusChapterStudyThread.ts (new) — resolves 'is there an
existing study thread for this chapter' for FAB/peek routing.
- hooks/useAmicusGuidedRouteContext.ts (new) — extracts guided-study
context from the current route so AmicusNewThreadScreen can seed
the right envelope without prop drilling.
- hooks/useAmicusThread.ts — extended for thread-context awareness
(linked question reopen, guided-step badge).
- hooks/usePeekConversation.ts — promote flow integration.
- hooks/useAmicusChipContext.ts — extended context shape.
- hooks/index.ts — barrel exports.
### Screens
- screens/AmicusThreadScreen.tsx — major rewrite: thread-context
banner (chapter, guided step, linked question status), StudyActionRow,
TrustFooter per assistant message, resolve/reopen linked question
from within the thread, auto-rename via deriveThreadIntelligence.
- screens/AmicusThreadListScreen.tsx — renders the enriched thread
metadata (summary_text, guided_step, linked-question status) from
the LEFT JOIN'd listAmicusThreads query shipped in PR #1660.
- screens/AmicusNewThreadScreen.tsx — seeds from guided-study context
+ StudyActionRow.
- screens/StudySessionScreen.tsx — askAmicus rewritten to use
launchAmicusStudyThread with full context, dedupe to existing
thread by question > session/step, dynamic 'Investigate question /
Trace connection / Help me refine' button label.
- screens/MyStudyScreen.tsx — left at the codex branch's version per
standing direction (see #1652 re-plan).
### Navigation
- navigation/types.ts — Thread + NewThread params extended with
seedGuidedContext, seedChapterRef, promotedMessages for the launch
flow.
## Critical preservation — #1654 in StudySessionScreen
The codex branch was cut before #1654 (stepper bounce-back fix) merged,
so it reverts that fix. The bounce-back bug makes Scene/Observe/
Explore/Synthesize taps appear inert because a naive useEffect fires
on every currentStep change and snaps the user back to initialStep.
This PR re-applies #1654's useRef-guarded one-shot sync, with a comment
in the code explicitly naming the issue so a future rebase or merge
resolution doesn't silently regress it. The guard is keyed on
sessionId so moving between chapters (which spawns a new session)
still applies initialStep once for the new session.
## Test coverage
- __tests__/screens/AmicusThreadListScreen.test.tsx (new)
- __tests__/screens/AmicusThreadScreen.test.tsx (new)
- __tests__/screens/MyStudyScreen.test.tsx (new)
- __tests__/screens/AmicusNewThreadScreen.test.tsx (extended)
- __tests__/hooks/useAmicusChipContext.test.tsx (extended)
- hooks/__tests__/useAmicusThread.test.tsx (new)
- hooks/__tests__/usePeekConversation.test.tsx (extended)
- components/amicus/__tests__/AmicusPeekSheet.test.tsx (extended)
- components/amicus/__tests__/AssistantMessageBubble.test.tsx (extended)
## Out of scope
- MyStudyScreen redesign (#1652)
- Thread-intelligence server-side summaries (future)
- Additional trust-layer signals beyond 'debated' (future)
## Rollback
Revert the single merge. All UI changes disappear; the foundation
(PR #1660) stays and the DB tables remain, but nothing reads or
writes to them from the UI. Amicus returns to its pre-PR-3
behavior. The #1654 guard stays preserved (it's shipped in master
via #1654 — this PR just ensures the codex-branch work wasn't a
silent regression).
Base automatically changed from feat/amicus-v2-foundation to masterApril 24, 2026 21:04
@CraigBuckmaster
CraigBuckmaster merged commit 1857434 into masterApr 24, 2026
1 check passed
@CraigBuckmaster
CraigBuckmaster deleted the feat/amicus-v2-ui branch April 24, 2026 21:04
Sign up for freeto 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.

2 participants

@CraigBuckmaster@claude