An Activity node ({node}/_Activity/{id}) is the record of one run: a script, an import, a sync.
Its page is ActivityViews.Overview in MeshWeaver.Graph.Views, and the code cell's output pane
is the sibling Progress area built from the same pieces.
What was wrong
A script that sent a mail and returned a dictionary rendered as:
- the title System, although a person had started it — a script run records no
ActivityLog.User; - a chip reading
ScriptExecution · Succeeded, an enum pair; started 10/03/2026 07:55 · ended 10/03/2026 07:55— an ambiguous date, no duration;- the headline
System.Collections.Generic.Dictionary2[System.String,System.Object]above✓ Done`, and the same type name again as the last log line; - nothing at all of what the run returned (recipients, sent, the link to the message);
- an accent Re-run button as the page's only call to action — on a run that had sent mail.
The type name had one cause: the kernel logged returnValue.ToString() for every result that was
not a control, and the page's headline was "the latest log line".
The page now
In the order a reader asks:
- Header — status chip in the shared vocabulary (
StatusGlyph: ✓ Done / ✗ Failed / …), what ran in words (Humanize(category)), then who · when · how long. Who falls back from the log's user to the node's creator before it says "System". The time is the viewer's zone, writtenyyyy-MM-dd HH:mm. - Origin — a link to the hub that ran it (
ActivityLog.HubPath). - Status line — only while running (the live bar) or when the run did not succeed (the loud headline). A succeeded run says so once, in the chip.
- Result — the returned control when the kernel still holds it; otherwise
BuildResult(ActivityLog.ReturnValue): one row per property, names in words, a URL as a link named by its host, booleans as ✓ / ✗, empty values omitted, long opaque values cut atResultValueLimit, at mostResultRowLimitrows. A scalar renders nothing here — its log line is the output. - Log — one row per message with the time it was logged. A line that is nothing but a CLR
type name (
IsTypeNameNoise) is dropped, so runs recorded before the kernel fix read cleanly too. - Re-run / Cancel — Re-run is a plain button: re-running repeats the run's side effects.
The code cell's output pane (Progress) gets the same result rows, without the header and the
per-line time.
The rule
A returned value is rendered from ActivityLog.ReturnValue, never from ToString(). The
kernel (KernelExecutor.OutputLine, platform) logs a return value only when it describes itself —
a scalar, a string, a record — and logs nothing for a value whose ToString() is its type name.
A script that wants its result on the page returns an object with named properties, or a control.
Every builder named above is a pure function of the ActivityLog, pinned in
ActivityProgressViewTest without a layout host.