- This task only reads. None of its steps saves anything, so there's
+ This workflow only reads. None of its steps saves anything, so there's
no record to check.
) : plan.writes.length === 0 ? (
- OpenAdapt can't tell yet whether this task saves anything, so it
- won't treat it as a task that only reads.
+ OpenAdapt can't tell yet whether this workflow saves anything, so it
+ won't treat it as a workflow that only reads.
) : (
<>
@@ -886,7 +886,7 @@ export function CheckIt({
{plan.writes.length === 0
? `${plan.unproven.length} step${plan.unproven.length === 1 ? "" : "s"} might change something.`
: `OpenAdapt can't tell yet whether ${plan.unproven.length} other step${plan.unproven.length === 1 ? "" : "s"} change${plan.unproven.length === 1 ? "s" : ""} anything.`}{" "}
- Before you approve the task, say what each one does in Advanced:
+ Before you approve the workflow, say what each one does in Advanced:
exact checks.
@@ -925,7 +925,7 @@ export function CheckIt({
{!step.identityArmed && !step.canArm && (
OpenAdapt didn't see the record's name or ID on the screen
- where it saves. Show the task again with the record's name
+ where it saves. Show the workflow again with the record's name
or ID visible before you save, or set this up in the exact
checks.
@@ -1048,7 +1048,7 @@ export function CheckIt({
state={plan.writes.length === 0 && !plan.practice ? "todo" : plan.practiceState}
>
- OpenAdapt does the task once, start to finish, on a test record you
+ OpenAdapt does the workflow once, start to finish, on a test record you
choose, with every check on. Before it saves, it shows you the
filled form and waits for you to approve. Then it saves for real
in the app, so use a test record. Keep the app where you can see
@@ -1069,12 +1069,12 @@ export function CheckIt({
{plan.drillsState === "not_needed"
? "No drills are needed, because no step saves anything."
- : "OpenAdapt sets up five drills from your practice item when you run it. Each one makes the task go wrong on purpose right before the save, and must stop before saving."}
+ : "OpenAdapt sets up five drills from your practice item when you run it. Each one makes the workflow go wrong on purpose right before the save, and must stop before saving."}
) : (
<>
- Each drill runs the task with your test values and changes one
+ Each drill runs the workflow with your test values and changes one
thing on purpose right before the save. A drill passes only
when OpenAdapt's own check catches the change and stops before
saving. Nothing is saved, and no drill asks you to approve.
diff --git a/packages/desktop/src/screens/Login.tsx b/packages/desktop/src/screens/Login.tsx
index 4f396d9f3..109f38f3d 100644
--- a/packages/desktop/src/screens/Login.tsx
+++ b/packages/desktop/src/screens/Login.tsx
@@ -61,7 +61,7 @@ export function Login({
) : (
<>
@@ -539,16 +539,16 @@ export function RecordReview({
{phase === "compiling" && (
-
+
OpenAdapt is turning your recording into steps it can repeat
exactly. Your recording stays as it was.
@@ -576,7 +576,7 @@ export function RecordReview({
? "Building…"
: phase === "failed"
? "Try building again"
- : "Build the task"}
+ : "Build the workflow"}
void }) {
No results yet
- Run a checked task on a list of items. Each item shows up here, and
+ Run a checked workflow on a list of items. Each item shows up here, and
only items OpenAdapt read back from the record count as done.
@@ -197,12 +197,12 @@ export function Results({ onNeedsYou }: { onNeedsYou: () => void }) {
{switches.length > 0 && }
- By task
+ By workflow
- | Task |
+ Workflow |
Done and checked |
Needed a person |
Prevented |
@@ -264,7 +264,7 @@ export function Results({ onNeedsYou }: { onNeedsYou: () => void }) {
The time saved is an estimate, not a measurement. It multiplies the
items OpenAdapt finished and checked by the minutes each one takes by
- hand. The default is how long your recording of the task took; type
+ hand. The default is how long your recording of the workflow took; type
your team's own number if it's different. Time spent answering Needs
you isn't subtracted.
@@ -345,7 +345,7 @@ function SwitchSection({ switches }: { switches: SwitchSummary[] }) {
const status = switchStatus(entry.state);
return (
- {entry.task_name || "A task"}
+ {entry.task_name || "A workflow"}
{status.word}
diff --git a/packages/desktop/src/screens/RunIt.test.tsx b/packages/desktop/src/screens/RunIt.test.tsx
index da793b11e..425db695f 100644
--- a/packages/desktop/src/screens/RunIt.test.tsx
+++ b/packages/desktop/src/screens/RunIt.test.tsx
@@ -108,13 +108,13 @@ it("stops the list when a save may have gone through", async () => {
expect(screen.getAllByText("Check the record").length).toBeGreaterThan(0);
});
-it("sends an unchecked task to Check it first", async () => {
+it("sends an unchecked workflow to Check it first", async () => {
engine("checking");
const onCheck = vi.fn();
render( {}} onResults={() => {}} />);
await paste("member_id,note\nM-1,Reviewed");
- expect(await screen.findByText("Check this task first")).toBeTruthy();
+ expect(await screen.findByText("Check this workflow first")).toBeTruthy();
expect((screen.getByRole("button", { name: "Run 1 item" }) as HTMLButtonElement).disabled).toBe(true);
fireEvent.click(screen.getByRole("button", { name: "Check it" }));
await waitFor(() => expect(onCheck).toHaveBeenCalledWith("wf-1"));
diff --git a/packages/desktop/src/screens/RunIt.tsx b/packages/desktop/src/screens/RunIt.tsx
index 7f50b27f1..b0d34e78d 100644
--- a/packages/desktop/src/screens/RunIt.tsx
+++ b/packages/desktop/src/screens/RunIt.tsx
@@ -114,7 +114,7 @@ export function RunIt({
setMode(approval && approval.ok ? approval : null);
setWorkflow((Array.isArray(list) ? list : []).find((item) => item.id === workflowId) ?? null);
if (!details.ok) {
- setLoadError(details.error || "Desktop couldn't read this task's inputs.");
+ setLoadError(details.error || "Desktop couldn't read this workflow's inputs.");
setInputs([]);
return;
}
@@ -322,13 +322,13 @@ export function RunIt({
/>
{loadError && (
-
+
{loadError}
)}
{notReady && (
-
- OpenAdapt runs a task on real items only after it's checked and
+
+ OpenAdapt runs a workflow on real items only after it's checked and
approved.
onCheck(workflowId)}>
@@ -369,7 +369,7 @@ export function RunIt({
{source === "paste" && (
{PROVENANCE}
- Now try your own task
+ Now try your own workflow
- Show OpenAdapt a task in the app where you already do it.
+ Show OpenAdapt a workflow in the app where you already do it.
Use a test record.
- Show OpenAdapt your task
+ Show OpenAdapt your workflow
- Back to Tasks
+ Back to Workflows
>
diff --git a/packages/desktop/src/screens/Settings.tsx b/packages/desktop/src/screens/Settings.tsx
index 1924de5de..adc848451 100644
--- a/packages/desktop/src/screens/Settings.tsx
+++ b/packages/desktop/src/screens/Settings.tsx
@@ -202,7 +202,7 @@ export function Settings({
@@ -216,7 +216,7 @@ export function Settings({
{cfg.deployment_lane === "byoc" && (
- OpenAdapt doesn't upload recordings, tasks, or fixes. When a stopped
+ OpenAdapt doesn't upload recordings, workflows, or fixes. When a stopped
run is reported, only a short note about it, with no PHI, goes to
your dashboard. Backup, sync, and security software on this
computer can still copy its files.
diff --git a/packages/desktop/src/screens/Tasks.tsx b/packages/desktop/src/screens/Tasks.tsx
index 9b418961e..8447d3fec 100644
--- a/packages/desktop/src/screens/Tasks.tsx
+++ b/packages/desktop/src/screens/Tasks.tsx
@@ -203,12 +203,12 @@ export function Tasks({
return (
0 ? (
- Show OpenAdapt a new task
+ Record a workflow
) : undefined
}
@@ -218,16 +218,16 @@ export function Tasks({
Loading…
) : tasks.length === 0 ? (
- Hand off your first task
+ Hand off your first workflow
- Show OpenAdapt a task in the app where you already do it.
+ Show OpenAdapt a workflow in the app where you already do it.
OpenAdapt repeats it, checks each saved record, and stops to ask you
when something doesn't match.
diff --git a/packages/desktop/src/screens/WatchRun.test.tsx b/packages/desktop/src/screens/WatchRun.test.tsx
index 6ebfdba98..5114ac668 100644
--- a/packages/desktop/src/screens/WatchRun.test.tsx
+++ b/packages/desktop/src/screens/WatchRun.test.tsx
@@ -304,7 +304,7 @@ it("requires the first user to review the compiled workflow before a supervised
fireEvent.click(
screen.getByRole("checkbox", {
- name: "I reviewed these steps. The task uses test data, and I will keep the target app in view.",
+ name: "I reviewed these steps. The workflow uses test data, and I will keep the target app in view.",
}),
);
expect(runButton.disabled).toBe(false);
diff --git a/packages/desktop/src/screens/WatchRun.tsx b/packages/desktop/src/screens/WatchRun.tsx
index 79c5de889..00926aa4e 100644
--- a/packages/desktop/src/screens/WatchRun.tsx
+++ b/packages/desktop/src/screens/WatchRun.tsx
@@ -478,7 +478,7 @@ export function WatchRun({
}
/>
- I reviewed these steps. The task uses test data, and I will
+ I reviewed these steps. The workflow uses test data, and I will
keep the target app in view.
diff --git a/packages/desktop/src/screens/Welcome.tsx b/packages/desktop/src/screens/Welcome.tsx
index 1b598acc8..61d5e4df1 100644
--- a/packages/desktop/src/screens/Welcome.tsx
+++ b/packages/desktop/src/screens/Welcome.tsx
@@ -6,7 +6,7 @@ import { ChoiceButton } from "../ui/simple";
const STEPS = [
{
title: "Show it",
- body: "Do the task on test data, in the app where you already do it.",
+ body: "Do the workflow on test data, in the app where you already do it.",
},
{
title: "Check it",
@@ -30,7 +30,7 @@ export function Welcome({
return (
- Hand off the last step of a task
+ Hand off the last step of a workflow
OpenAdapt enters approved information into the apps you already use,
like EMRs, payer portals, and desktop or Citrix apps, and checks that
@@ -61,14 +61,14 @@ export function Welcome({
onClick={onSample}
/>
- OpenAdapt doesn't send your recordings or tasks anywhere unless you
+ OpenAdapt doesn't send your recordings or workflows anywhere unless you
choose to share or upload them. Backup, sync, and security software on
this computer can still copy its files.{" "}
diff --git a/packages/desktop/src/styles/app.css b/packages/desktop/src/styles/app.css
index c28832477..0169d160a 100644
--- a/packages/desktop/src/styles/app.css
+++ b/packages/desktop/src/styles/app.css
@@ -46,13 +46,14 @@ table {
margin: 0;
}
-/* Statements in the serif; everything a person operates in the sans. */
+/* Titles use --font-heading (the sans, one face across Desktop, Cloud and
+ the portal). */
h1,
h2 {
font-family: var(--font-heading);
letter-spacing: -0.012em;
color: var(--text-strong);
- font-weight: 430;
+ font-weight: var(--fw-heading);
margin: 0;
line-height: 1.15;
text-wrap: balance;
@@ -848,7 +849,6 @@ a:hover {
border: 1px solid var(--border);
border-radius: var(--radius-2);
padding: var(--space-5);
- box-shadow: var(--shadow-sm);
}
.card + .card {
margin-top: var(--space-4);
@@ -1650,7 +1650,7 @@ select.input:focus {
margin-bottom: var(--space-6);
}
.simple-head h1 {
- font-size: 32px;
+ font-size: 28px;
}
.simple-sub {
margin: var(--space-2) 0 0;
@@ -1918,7 +1918,6 @@ select.input:focus {
border: 1px solid var(--border);
border-radius: var(--radius-2);
background: var(--panel);
- box-shadow: var(--shadow-sm);
}
.task-title-row {
display: flex;
@@ -2442,13 +2441,13 @@ select.input:focus {
.stat-warn .stat-label {
color: var(--pill-warn-fg);
}
-/* A measurement: the serif, with tabular figures. */
+/* A measurement, with tabular figures. */
.stat-value {
color: var(--text-strong);
font-family: var(--font-heading);
font-feature-settings: var(--num-tabular);
font-size: 32px;
- font-weight: 430;
+ font-weight: var(--fw-heading);
letter-spacing: -0.015em;
line-height: 1.05;
}
diff --git a/packages/desktop/src/styles/tokens.css b/packages/desktop/src/styles/tokens.css
index 4d991c0ec..3de06e140 100644
--- a/packages/desktop/src/styles/tokens.css
+++ b/packages/desktop/src/styles/tokens.css
@@ -340,14 +340,16 @@
/* -----------------------------------------------------------------------------
4. TYPOGRAPHY
- Two faces (Clinical Calm). The serif carries what a person reads as a
- statement or a measurement: page titles, the question on a stop, big
- numbers, compared values. The sans carries everything a person operates.
+ One face. The sans carries titles, numbers and everything a person
+ operates, the same as OpenAdapt Cloud and the phone decision portal.
+ --font-heading is the single switch: set it back to var(--font-serif)
+ (and --fw-heading to 430) to restore serif titles.
Monospace is only for run IDs and code inside Technical details.
-------------------------------------------------------------------------- */
:root {
--font-ui: var(--font-sans);
- --font-heading: var(--font-serif);
+ --font-heading: var(--font-sans);
+ --fw-heading: 600;
/* Type scale (px), tuned for dense product UI. Canonical carries a rem scale
sized for editorial layout; this one is a product scale, which is a scale
diff --git a/packages/desktop/src/ui/ApprovalSwitch.tsx b/packages/desktop/src/ui/ApprovalSwitch.tsx
index 9cca8c62f..9d8374082 100644
--- a/packages/desktop/src/ui/ApprovalSwitch.tsx
+++ b/packages/desktop/src/ui/ApprovalSwitch.tsx
@@ -176,7 +176,7 @@ export function ApprovalSwitch({
{confirming ? (
- Turn it off for this task? It applies before the next save, even
+ Turn it off for this workflow? It applies before the next save, even
offline. Turning it on again needs an admin and the privacy contact
in OpenAdapt Cloud, and new items approved one by one.
diff --git a/packages/desktop/src/ui/ItemApproval.tsx b/packages/desktop/src/ui/ItemApproval.tsx
index 4bc5eb313..a5d359038 100644
--- a/packages/desktop/src/ui/ItemApproval.tsx
+++ b/packages/desktop/src/ui/ItemApproval.tsx
@@ -160,7 +160,7 @@ export function ItemApprovalPanel({
))}
) : (
-
This task takes no values.
+
This workflow takes no values.
)}
Next step: {request.step_intent || "the save"}
diff --git a/packages/desktop/src/ui/JudgmentCaseCapture.tsx b/packages/desktop/src/ui/JudgmentCaseCapture.tsx
index 3c3439e64..4f740f8f6 100644
--- a/packages/desktop/src/ui/JudgmentCaseCapture.tsx
+++ b/packages/desktop/src/ui/JudgmentCaseCapture.tsx
@@ -463,7 +463,7 @@ export function JudgmentCaseCapture({
void capture()} data-testid="capture-judgment-case">
{busy ? "Saving…" : "Save reviewed case locally"}
- Flow seals the case into the next qualification revision. This does not create a runtime task.
+ Flow seals the case into the next qualification revision. This does not start a run.
);
diff --git a/packages/desktop/src/ui/ShadowMode.tsx b/packages/desktop/src/ui/ShadowMode.tsx
index e820e1803..fee46e209 100644
--- a/packages/desktop/src/ui/ShadowMode.tsx
+++ b/packages/desktop/src/ui/ShadowMode.tsx
@@ -142,7 +142,7 @@ export function ShadowPromptBanner({
}
return (
-
+
{status.pending.map((prompt) => (
{prompt.body}
@@ -293,7 +293,7 @@ export function ShadowModeCard() {
{!status.known ? (
Checking shadow mode…