diff --git a/docs/development/ui-patterns.md b/docs/development/ui-patterns.md
index c0d4dd3..562fc1a 100644
--- a/docs/development/ui-patterns.md
+++ b/docs/development/ui-patterns.md
@@ -98,6 +98,11 @@ timestamps without an offset are UTC; never parse them as browser-local time.
Receipt freshness uses the browser clock and shows Paused or a retry reason
when updates are unavailable. These clocks are not live regions.
+Provisioning detail pages show absolute start and finish times once in the
+summary. Use `OperationTime` for their steps, checks and activity: offsets from
+the operation start (`+m:ss` or `+h:mm:ss`), with negative offsets for earlier
+evidence. Missing timestamps stay **Not recorded**.
+
Use `plural` or `countLabel` from `src/lib/ui/plural.ts` for count-dependent
language, including verbs: `plural(count, 'needs', 'need')`. The helper uses
`Intl.PluralRules`; supply irregular plural forms explicitly. Keep separators
diff --git a/src/lib/ui/components/OperationTime.svelte b/src/lib/ui/components/OperationTime.svelte
new file mode 100644
index 0000000..f1c9840
--- /dev/null
+++ b/src/lib/ui/components/OperationTime.svelte
@@ -0,0 +1,16 @@
+
+
+{#if iso}{:else}{missing}{/if}
+
+
diff --git a/src/lib/ui/components/ProvisioningActivity.svelte b/src/lib/ui/components/ProvisioningActivity.svelte
index 16358e2..2e40bdc 100644
--- a/src/lib/ui/components/ProvisioningActivity.svelte
+++ b/src/lib/ui/components/ProvisioningActivity.svelte
@@ -1,5 +1,5 @@