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
58 changes: 58 additions & 0 deletions docs/ross-030-verification.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# ROSS-030 authenticated application rebrand verification

Date: 2026-07-16

Branch: `agent/ross-030-authenticated-app-rebrand`

## Scope

ROSS-030 replaces user-facing Mike identity in the inherited authenticated
Next.js application with the approved ROSS identity. It does not change routes,
API endpoints, database tables, authentication, authorization, document
storage, legal-source providers, model providers, workflows, or application
data.

## Included

- ROSS metadata, favicon, application logo, status icon, social card, sidebar,
sign-up links, support copy, account copy, export filenames, MFA device names,
prompts, and error-page title.
- Central product configuration integration for the application name, URLs,
beta statement, terms, and privacy links.
- An explicit CourtListener description as an optional inherited U.S. provider;
no Ontario source integration is claimed to be live.
- Upstream Mike workflow attribution and links remain visible where the app
still integrates with `Open-Legal-Products/mike-workflows`.

## Deliberately preserved compatibility identifiers

The following inherited internal identifiers remain unchanged because renaming
them could invalidate existing browser state, drag-and-drop contracts, events,
or imports:

- `mike.selectedModel`
- `mike:mfa-verified-at`
- `mike:close-row-actions`
- `application/mike-doc`
- `application/mike-folder`
- `mikeApi.ts` and its existing imports
- `mike-icon.tsx` as a compatibility re-export of the new `RossIcon`

These identifiers are not presented as product branding.

## Verification result

| Check | Result | Notes |
|---|---|---|
| ROSS branding contracts | Pass | 5 ROSS-030 contracts pass within the 23-test baseline suite |
| Authenticated frontend production build | Pass | Next.js production build completed; all inherited application routes remain present |
| Preserved repository baseline | Pass | 23/23 baseline tests pass; inherited lint ceiling remains 25 errors and 42 warnings |
| Full repository gate | Pass | Backend, authenticated frontend, public website, lint, and website route tests pass via `npm run check` |
| GitHub Actions | Pending | Runs after browser upload and pull-request creation |

## Boundaries

- This package does not enable Ontario legal-source integrations.
- Placeholder `.invalid` URLs remain production blockers.
- No hosted authenticated application, authentication configuration, or real
user data is created by this package.
2 changes: 1 addition & 1 deletion frontend/bun.lock

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

11 changes: 10 additions & 1 deletion frontend/next.config.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
import type { NextConfig } from "next";
import path from "node:path";
import { fileURLToPath } from "node:url";

const repositoryRoot = path.resolve(
path.dirname(fileURLToPath(import.meta.url)),
"..",
);

const nextConfig: NextConfig = {
/* config options here */
reactCompiler: true,
turbopack: {
root: repositoryRoot,
},
async rewrites() {
return [
{
Expand Down
4 changes: 2 additions & 2 deletions frontend/package-lock.json

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

2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "mike",
"name": "ross-app",
"version": "0.1.0",
"private": true,
"scripts": {
Expand Down
Binary file removed frontend/public/link-image.jpg
Binary file not shown.
Binary file added frontend/public/ross-social-card.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions frontend/public/ross-social-card.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions frontend/src/app/(pages)/account/api-keys/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const OTHER_API_KEY_FIELDS = [
label: "CourtListener API Key",
placeholder: "Token...",
description:
"Add a CourtListener API key if you want the latest CourtListener data. Otherwise, Mike will use the bulk data hosted by us.",
"Add a CourtListener API key for optional inherited U.S. case-law research. Otherwise, ROSS uses the inherited bulk CourtListener dataset when configured by the operator.",
},
] as const;

Expand All @@ -59,7 +59,7 @@ export default function ApiKeysPage() {
<p className="text-sm text-gray-500 mb-4">
You must provide your own API keys for the app to work or add
your API keys into the .env file if you are running your own
instance of Mike. All API keys are encrypted in storage.
instance of ROSS. All API keys are encrypted in storage.
</p>
<AccountSection>
{MODEL_API_KEY_FIELDS.map((field, index) => (
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/app/(pages)/account/privacy-data/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ export default function PrivacyDataPage() {
return;
}
const { blob, filename } = await exportAccountData();
downloadBlob(blob, filename ?? "mike-account-export.json");
downloadBlob(blob, filename ?? "ross-account-export.json");
} catch (error) {
devLog("[privacy-data/mfa] export account failed", {
isMfaRequired: isMfaRequiredError(error),
Expand All @@ -115,7 +115,7 @@ export default function PrivacyDataPage() {
return;
}
const { blob, filename } = await exportChatData();
downloadBlob(blob, filename ?? "mike-chat-export.json");
downloadBlob(blob, filename ?? "ross-chat-export.json");
} catch (error) {
devLog("[privacy-data/mfa] export chats failed", {
isMfaRequired: isMfaRequiredError(error),
Expand All @@ -140,7 +140,7 @@ export default function PrivacyDataPage() {
return;
}
const { blob, filename } = await exportTabularReviewsData();
downloadBlob(blob, filename ?? "mike-tabular-reviews-export.json");
downloadBlob(blob, filename ?? "ross-tabular-reviews-export.json");
} catch (error) {
devLog("[privacy-data/mfa] export tabular reviews failed", {
isMfaRequired: isMfaRequiredError(error),
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/app/(pages)/account/security/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -253,15 +253,15 @@ export default function SecurityPage() {

let { data, error } = await supabase.auth.mfa.enroll({
factorType: "totp",
friendlyName: "Mike",
friendlyName: "ROSS",
});
if (error && isDuplicateFriendlyNameError(error)) {
traceMfa("[security/mfa] retrying enrollment with unique name", {
error: error.message,
});
const retry = await supabase.auth.mfa.enroll({
factorType: "totp",
friendlyName: `Mike ${Date.now()}`,
friendlyName: `ROSS ${Date.now()}`,
});
data = retry.data;
error = retry.error;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ import { PdfView } from "@/app/components/shared/views/PdfView";
import { SpreadsheetView } from "@/app/components/shared/views/SpreadsheetView";
import { OwnerOnlyPopup } from "@/app/components/popups/OwnerOnlyPopup";
import { DocxView } from "@/app/components/shared/views/DocxView";
import { MikeIcon } from "@/app/components/chat/mike-icon";
import { RossIcon } from "@/app/components/chat/ross-icon";
import { useAuth } from "@/app/contexts/AuthContext";
import { useUserProfile } from "@/app/contexts/UserProfileContext";
import { useSidebar } from "@/app/contexts/SidebarContext";
Expand Down Expand Up @@ -132,7 +132,7 @@ function AssistantGreeting({ username }: { username: string }) {
"transform 900ms cubic-bezier(0.25, 0.46, 0.45, 0.94)",
}}
>
<MikeIcon size={ICON_SIZE} />
<RossIcon size={ICON_SIZE} />
</div>
<h1
ref={textRef}
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/app/components/assistant/AskInputPopup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ export function AskInputPopup({
if (item.skipped) return `${index + 1}. Skipped document request.`;
return `${index + 1}. Documents attached: ${item.filenames.join(", ")}`;
});
return `Responses to Mike's questions:\n${lines.join("\n\n")}`;
return `Responses to ROSS's questions:\n${lines.join("\n\n")}`;
};

const submit = () => {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/app/components/assistant/AssistantMessage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ interface Props {
events?: AssistantEvent[];
isStreaming?: boolean;
isError?: boolean;
/** Human-readable error text rendered alongside the red Mike icon. */
/** Human-readable error text rendered alongside the red ROSS icon. */
errorMessage?: string;
citations?: Citation[];
citationStatus?: "started" | "partial" | "final";
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/app/components/assistant/CaseLawPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
Download,
ExternalLink,
} from "lucide-react";
import { MikeIcon } from "@/app/components/chat/mike-icon";
import { RossIcon } from "@/app/components/chat/ross-icon";
import type { CaseCitationQuote } from "../shared/types";
import {
clearDocxQuoteHighlights,
Expand Down Expand Up @@ -492,7 +492,7 @@ export function CaseLawPanel({
{loading && (
<div className={cn("h-full min-h-0 rounded-lg border border-gray-200", opinionSurfaceClassName)}>
<div className="flex h-full items-center justify-center p-5">
<MikeIcon spin mike size={28} />
<RossIcon spin size={28} />
</div>
</div>
)}
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/app/components/assistant/InitialView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { useEffect, useLayoutEffect, useRef, useState } from "react";
import { useAuth } from "@/app/contexts/AuthContext";
import { useUserProfile } from "@/app/contexts/UserProfileContext";
import { MikeIcon } from "@/app/components/chat/mike-icon";
import { RossIcon } from "@/app/components/chat/ross-icon";
import { ChatInput } from "./ChatInput";
import { SelectAssistantProjectModal } from "./SelectAssistantProjectModal";
import type { Message } from "../shared/types";
Expand Down Expand Up @@ -56,7 +56,7 @@ export function InitialView({ onSubmit }: InitialViewProps) {
"transform 900ms cubic-bezier(0.25, 0.46, 0.45, 0.94)",
}}
>
<MikeIcon size={ICON_SIZE} />
<RossIcon size={ICON_SIZE} />
</div>
<h1
ref={textRef}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useEffect, useRef, useState } from "react";
import { MikeIcon } from "@/app/components/chat/mike-icon";
import { RossIcon } from "@/app/components/chat/ross-icon";

export type StatusState = "active" | "error" | null;

Expand Down Expand Up @@ -41,11 +41,10 @@ export function ResponseStatus({ status }: { status: StatusState }) {

return (
<div className="w-full h-9 flex items-center mb-2">
<MikeIcon
<RossIcon
spin={isActive}
done={showDone && doneVisible}
error={isError}
mike={!isError && !(showDone && doneVisible)}
size={22}
/>
</div>
Expand Down
Loading
Loading