diff --git a/module/docs/plugin-manifest-schema.md b/module/docs/plugin-manifest-schema.md
index 3b0612581..767b4f60f 100644
--- a/module/docs/plugin-manifest-schema.md
+++ b/module/docs/plugin-manifest-schema.md
@@ -97,8 +97,11 @@ has three node kinds:
one metric. These metric-bound widgets are distinct from `ui.widgets`, which
are presentation slots contributed to host surfaces; the two never mix.
-On a registered solution's page the host renders every declared dashboard, and
-each viewer can arrange it for themselves: reorder its declared widgets, remove
+On a registered solution's page the host renders every declared dashboard in a
+**Dashboard** tab beside the solution's own **App** tab, never stacked above
+the solution; the solution stays mounted while the dashboard is open. A
+solution that declares no dashboard gets no tab bar. Each viewer can arrange a
+dashboard for themselves: reorder its declared widgets, remove
them, and re-add the ones they removed. The declared widgets, in declared order,
are where every viewer starts, and a widget declared later reaches viewers who
already rearranged. A viewer's arrangement is a preference (ADR 0007): it never
diff --git a/module/services/frontend/code/package-lock.json b/module/services/frontend/code/package-lock.json
index 44a082097..606968f29 100644
--- a/module/services/frontend/code/package-lock.json
+++ b/module/services/frontend/code/package-lock.json
@@ -14,8 +14,8 @@
"@base-ui/react": "^1.3.0",
"@bufbuild/protobuf": "^2.11.0",
"@codefly-dev/saas-sdk": "0.3.15",
- "@codefly-dev/saas-ui": "0.11.3",
- "@codefly-dev/ui": "0.11.3",
+ "@codefly-dev/saas-ui": "0.11.4",
+ "@codefly-dev/ui": "0.11.4",
"@codefly/saas-plugin-contract": "2.3.0",
"@codefly/saas-plugin-manifest": "0.1.0",
"@codefly/saas-plugin-react": "0.4.1",
@@ -15266,7 +15266,7 @@
},
"packages/codefly-ui": {
"name": "@codefly-dev/ui",
- "version": "0.11.3",
+ "version": "0.11.4",
"license": "Apache-2.0",
"dependencies": {
"@base-ui/react": "^1.3.0",
@@ -15418,7 +15418,7 @@
},
"packages/saas-ui": {
"name": "@codefly-dev/saas-ui",
- "version": "0.11.3",
+ "version": "0.11.4",
"license": "Apache-2.0",
"devDependencies": {
"@bufbuild/protobuf": "^2.11.0",
diff --git a/module/services/frontend/code/package.json b/module/services/frontend/code/package.json
index 6b6676246..e64b5826e 100644
--- a/module/services/frontend/code/package.json
+++ b/module/services/frontend/code/package.json
@@ -37,8 +37,8 @@
"@base-ui/react": "^1.3.0",
"@bufbuild/protobuf": "^2.11.0",
"@codefly-dev/saas-sdk": "0.3.15",
- "@codefly-dev/saas-ui": "0.11.3",
- "@codefly-dev/ui": "0.11.3",
+ "@codefly-dev/saas-ui": "0.11.4",
+ "@codefly-dev/ui": "0.11.4",
"@codefly/saas-plugin-contract": "2.3.0",
"@codefly/saas-plugin-manifest": "0.1.0",
"@codefly/saas-plugin-react": "0.4.1",
diff --git a/module/services/frontend/code/packages/codefly-ui/package.json b/module/services/frontend/code/packages/codefly-ui/package.json
index f541dd943..d86b3edfc 100644
--- a/module/services/frontend/code/packages/codefly-ui/package.json
+++ b/module/services/frontend/code/packages/codefly-ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@codefly-dev/ui",
- "version": "0.11.3",
+ "version": "0.11.4",
"description": "The shared, versioned Codefly SaaS frontend kit: the plugin host and the tokens-as-data skin mechanism, standalone so the host and Module-Federation remotes import and dedupe one copy.",
"repository": {
"type": "git",
diff --git a/module/services/frontend/code/packages/saas-ui/README.md b/module/services/frontend/code/packages/saas-ui/README.md
index 66efcb037..c3a3ec783 100644
--- a/module/services/frontend/code/packages/saas-ui/README.md
+++ b/module/services/frontend/code/packages/saas-ui/README.md
@@ -292,6 +292,19 @@ role via Accounts' registration/grant service paths. Only `admin@acme.com` and
a demo source; other fixture viewers remain ungranted. Reseeding reconverges the
declared grants, so test revocation without restarting the fixture runtime.
+## Audit
+
+`` says when someone last signed in the way a
+person reads it ("Last login · 12 seconds ago"), and keeps it true as time
+passes: it re-says itself every second for the first minute, then every 30
+seconds, then every five minutes. The exact time is on the `