Decisions › D18

One activity log on one clock, with an Activity channel and a Raw channel

Decision
D18
Date
2026-10-23
Status
Accepted
Area
logging

Context

Zach asked to model the Activity log on the ROS 2 log view, asked whether the status format could be like the ROS log too, and whether the computer's own logs and the diagnostics belong in one view. He also found the two-column activity screen very busy and hard to read, and asked for one full-width column.

The decision

The Activity view is the device's single event stream on one clock: plugs and kernel port events, status transitions, the fault lifecycle, action runs and a producer's own events. It takes rqt_console's columns and its exclude and highlight filters. Status reports and measurements stay out of it; only a change of level is an event.

The Event record becomes the log record, aligned to ROS's log levels and OpenTelemetry's log record, with a stock projection beside the status one. The fault memory is a read model of the same history, folded onto the event that caused it, so one fact is one row. An entity's scope is the entity and its children, with an optional path to the host, and every entity gets a Raw channel (its kernel lines, its driver's own output), off by default. It is the device's log, not a journal viewer.

Why

“Model the Activity log after the ROS 2 log view”

Zach Yamaoka, chat, 23 Oct 2026

“then logs become a single stream you can read to get an entire picture of the device.”

Zach Yamaoka, chat, 23 Oct 2026

“I like putting everything into logs, so it's the single source of truth, and then adding filters to see only what you want”

Zach Yamaoka, chat, 23 Oct 2026

“possibly we could also support getting its raw log stream?”

Zach Yamaoka, chat, 23 Oct 2026

“I really don't like in the acitvity view how you have these two volumns...”

Zach Yamaoka, notes, 23 Oct 2026

“I would prefer only like 1 activity colum and then you can streght it accross the screen..”

Zach Yamaoka, notes, 23 Oct 2026

“I will take your defaults”

Zach Yamaoka, chat, 24 Oct 2026

Options considered

Weighted score out of 5 against five criteria drawn from his words: one read gives the whole picture (25), calm by default (20), stock interop (15), one fact counts once (15), per-entity scope and raw drill-down (15), a small build on what exists (10). Option C stays first under every single-weight shift of 10 or 20 points; its lowest score in the sweep is 4.33 against a best runner-up of 3.42.

OptionIdeaScore
C One store, Activity and RawCoded events in Activity, uncoded lines in Raw, one append-only store with one clock.4.40
B Everything in one streamEvery report and raw line goes in; filters do the rest. Fails on calm.3.10
D A stock viewer as the viewPublish to /rosout and use Foxglove or Lichtblick. Best as a second view: no USB skeleton, no entity hierarchy, no actions.3.00
A Two views (today)A separate Activity view and fault memory.2.65

Consequences

  • The default order stays newest first. A warn or error transition rides on its fault row; silence gets its own warn row only when no plug event explains it; the rest is debug.
  • The host should keep its own events on disk. The fault memory lives only in RAM, and a reboot at 15:00 on the day of the research wiped it.
  • Measured while writing it: in 44 hours this PC's journal wrote 56,573 lines, and 226 of them were kernel lines about USB (0.4 %). The log carries coded events only.
  • Accepted on 2026-10-24, when Zach took the report's defaults, and built as activity log v1 (io-diagnostics commit 0ad96f2). The defaults: two channels, the transition rule above, fold the fault lifecycle, keep the events on disk, the two pure adapters before any journald or MCAP export, newest first.

Evidence

  • Activity log: one stream, two channelsReport, 2026-10-23. Evidence for this decision.
  • Server API v1Contract doc, 2026-10-22. What the page may rely on: state, activity, plugins, actions and their single-use tokens, history, settings.
  • Diagnostics record v0Contract doc, 2026-10-22. ROS DiagnosticStatus kept whole, plus Entity, Event, Fault and Action. Eight lessons from the field, the rules, and the evidence re-checked.
  • Round 3 briefContract doc, 2026-10-23. What was settled in round 3 (resizable panes, warning colours reserved, quieter utilities) and the three sets of proposals.

Commits in the app's repository (private):

  • 0ad96f2 2026-10-24 Activity log v1 (Zach, 2026-10-24: "I will take your defaults"): one stream, two channels, folded rows, kept on disk, and r4 (runs in the log)
  • de278f2 2026-10-23 Port activity in real time and a live Computer (the log as built today)

← All decisions