diff --git a/packages/desktop/src/screens/CheckIt.test.tsx b/packages/desktop/src/screens/CheckIt.test.tsx
index 3ce0ced31..9bdbb716a 100644
--- a/packages/desktop/src/screens/CheckIt.test.tsx
+++ b/packages/desktop/src/screens/CheckIt.test.tsx
@@ -312,7 +312,7 @@ it("approves, locks the version, and offers Run it", async () => {
const onRun = vi.fn();
render( {}} onRun={onRun} />);
- fireEvent.click(await screen.findByRole("button", { name: "Approve for use" }));
+ fireEvent.click(await screen.findByRole("button", { name: "Approve this workflow" }));
expect(await screen.findByText("Approved and locked")).toBeTruthy();
fireEvent.click(screen.getByRole("button", { name: "Run it" }));
@@ -322,7 +322,7 @@ it("approves, locks the version, and offers Run it", async () => {
it("keeps approval off until the practice item passed", async () => {
engine(project());
render( {}} onRun={() => {}} />);
- const approve = await screen.findByRole("button", { name: "Approve for use" });
+ const approve = await screen.findByRole("button", { name: "Approve this workflow" });
expect((approve as HTMLButtonElement).disabled).toBe(true);
});
diff --git a/packages/desktop/src/screens/CheckIt.tsx b/packages/desktop/src/screens/CheckIt.tsx
index 9c42c1495..86dfaed55 100644
--- a/packages/desktop/src/screens/CheckIt.tsx
+++ b/packages/desktop/src/screens/CheckIt.tsx
@@ -118,11 +118,25 @@ function CheckSection({
>
-
-
{title}
- {stateWord(state, doneWord)}
-
- {children}
+ {/* A finished part folds to its title so the open question stands out;
+ the last part keeps its Run button in view. */}
+ {state === "done" && index < 6 ? (
+
+
+
);
@@ -301,6 +315,18 @@ function EffectQuestion({
);
}
+/** Armed saving steps grouped by their identical sentence, in first-seen order. */
+function armedIdentityGroups(
+ writes: T[],
+): { text: string; count: number }[] {
+ const groups = new Map();
+ for (const step of writes) {
+ if (!step.identityArmed) continue;
+ groups.set(step.identityText, (groups.get(step.identityText) ?? 0) + 1);
+ }
+ return [...groups].map(([text, count]) => ({ text, count }));
+}
+
export function CheckIt({
workflowId,
onExactChecks,
@@ -914,7 +940,16 @@ export function CheckIt({
it asks how to recognize the right record.
)}
- {plan.writes.map((step) => (
+ {/* Saving steps that check the record the same way say it once. */}
+ {armedIdentityGroups(plan.writes).map((group) => (
+
This version is checked, approved, and encrypted on this
- computer. It's ready to run on real items.
+ computer. It’s ready to run on real items, and it stops
+ to ask you only when something doesn’t match.
@@ -309,7 +309,9 @@ export function Results({ onNeedsYou }: { onNeedsYou: () => void }) {
Only items that OpenAdapt saved and then read back from the record
count as done and checked. Items a person finished or confirmed count
under Needed a person. “No person” marks an item saved with every
- check passed while “{SWITCH_LABEL}” was on.
+ check passed while “{SWITCH_LABEL}” was on. OpenAdapt doesn't send
+ these results anywhere. If you turn on the hosted runner, it reports
+ only a PHI-free outcome for each Cloud job it runs.
diff --git a/packages/desktop/src/screens/WatchRun.test.tsx b/packages/desktop/src/screens/WatchRun.test.tsx
index 5114ac668..ccf6651d9 100644
--- a/packages/desktop/src/screens/WatchRun.test.tsx
+++ b/packages/desktop/src/screens/WatchRun.test.tsx
@@ -118,19 +118,19 @@ it("clears prior terminal evidence while a new run is in flight", async () => {
onTeach={() => {}}
/>,
);
- await screen.findByText("Outcome evidence");
+ await screen.findByText("What was checked");
- fireEvent.click(screen.getByRole("button", { name: "Run with safety gates" }));
+ fireEvent.click(screen.getByRole("button", { name: "Run it" }));
await waitFor(() =>
- expect(screen.queryByText("Outcome evidence")).toBeNull(),
+ expect(screen.queryByText("What was checked")).toBeNull(),
);
await act(async () => {
finishRun(verified);
await pendingRun;
});
- expect(await screen.findByText("Outcome evidence")).toBeTruthy();
+ expect(await screen.findByText("What was checked")).toBeTruthy();
});
it("keeps a report visible while local history is retried", async () => {
@@ -174,7 +174,7 @@ it("keeps a report visible while local history is retried", async () => {
await waitFor(() =>
expect(screen.queryByText("Local run history needs attention")).toBeNull(),
);
- expect(screen.getByText("Outcome evidence")).toBeTruthy();
+ expect(screen.getByText("What was checked")).toBeTruthy();
});
function firstWorkflowReview(
diff --git a/packages/desktop/src/screens/WatchRun.tsx b/packages/desktop/src/screens/WatchRun.tsx
index 00926aa4e..516634997 100644
--- a/packages/desktop/src/screens/WatchRun.tsx
+++ b/packages/desktop/src/screens/WatchRun.tsx
@@ -54,10 +54,10 @@ function issueForReport(report: RunReport): RunIssue | null {
}
const CONTRACT_LABELS = {
- authorization: "Authorization",
- identity: "Identity",
- postcondition: "Postcondition",
- effect: "Business effect",
+ authorization: "Allowed to act",
+ identity: "Right record",
+ postcondition: "Screen checks",
+ effect: "Read-back",
} as const;
function reviewRisk(
@@ -385,9 +385,7 @@ export function WatchRun({
{firstWorkflow
? "Review the workflow, then watch it run"
@@ -397,14 +395,14 @@ export function WatchRun({
{!firstWorkflow && (
)}
@@ -413,8 +411,7 @@ export function WatchRun({
{firstWorkflow && (
{reviewReady && currentReview ? (
@@ -522,7 +519,6 @@ export function WatchRun({
{!firstWorkflow &&
- Advanced deployment details
+ Settings for the person who sets this up
- {report.outcome.replaceAll("_", " ").toLowerCase()}
+ {resultCopy(plainResultForReport(report)).label}
+
+
+ {report.outcome_details.execution_completed
+ ? "Ran to the end"
+ : "Stopped before the end"}
- {report.outcome_details.profile && (
- {report.outcome_details.profile}
- )}
{report.outcome_details.production_eligible
- ? "production eligible"
- : "not production eligible"}
-
-
- {report.outcome_details.execution_completed
- ? "execution completed"
- : "execution stopped"}
+ ? "Ready for real items"
+ : "Not ready for real items yet"}
+ {report.outcome_details.profile && (
+
+ {report.outcome_details.profile}
+
+ )}