Research · Governance Squad

Spike Report: Passive Time Capture

Can a lawyer's billable time be recorded without the lawyer recording it? This report sets out a spike that tested whether on-platform work can be observed reliably enough for time entries to be generated automatically and reviewed by the lawyer: the hypothesis, the method, the results, and one open question to settle before the Tech Plan.

1Background

"We're building time tracking to serve two primary purposes: supporting hourly-rate billing on the minority of matters where time is the invoice input, and giving fixed-fee firms like Woodstock the accurate time data they need to re-price fixed fees/fee shares correctly. Time is captured passively, with Lawrence generating a functional narrative description for each entry automatically; lawyers review and correct and approve, and log off-platform work manually." — Time Tracking PRD

"Passively" sets a high bar. To propose a time entry without the lawyer's involvement, the system must know what was worked on, on which matter, and for how long, in enough detail to write a narrative a lawyer would sign. The lawyer's role changes from recording time to reviewing it: every proposed entry is corrected or approved before it counts, and off-platform work is logged manually.

This page reports a spike that tested whether we can capture that information reliably, and sets out the method so the approach can be assessed on its evidence. It is structured as hypothesis, method, results, and one open question the results surfaced.

2Why existing signals are not sufficient

Two existing sources of activity data were assessed first, and both fall short of the bar above.

The event framework records business events when services write data. Its coverage is incomplete today (when we audited it, most of the write paths behind documents, emails, notes, and messages emitted no events, and events carry no record of who performed the action), but the deeper problem is that backend events can only ever see actions that change data. Much of what a lawyer does makes no backend change at all: reading a contract, moving between documents, composing a reply before sending it. That work is billable, and it is visible only in the front end. Even a completed write-coverage programme, itself a multi-service migration, would miss it.

Active Matter Time, the existing engagement tracker, measures seconds of presence per matter. It deliberately carries no entity context: it can say a lawyer was active on a matter for forty minutes, but not whether they were drafting a contract or scrolling a message thread, and it cannot distinguish reading from editing. It measures duration without content, where a narrative needs both.

What a time entry needs is exactly what is on the lawyer's screen and how they engage with it. The one place that information exists in full is the browser itself, which is where this spike points its instrument.

3Hypothesis

The spike tested two claims:

H1A recording of the lawyer's browser session can be reduced, by deterministic rules, to a compact activity stream: a log in which every action names its matter, the item worked on, and a start and end time.
H2A language model given that activity stream proposes time entries a reviewing lawyer would recognise and approve: correct matter, plausible duration, and a narrative in timesheet register.

4Method

The recorder

The recorder is rrweb, an open-source library used by session-replay tools; the approach of recording the session and deriving activity from it was proposed and first demonstrated by George Gebbett, whose proof of concept this spike builds on. rrweb does not capture video or screenshots. It records the page's underlying structure (the tree of headings, buttons, and text that the browser draws) once at the start, and from then on records only changes: elements appearing or updating, plus clicks, scrolling, and typing.

Each change is a small data record called an event. We added two signals rrweb does not provide: a heartbeat that fires while the page is visible and focused, so quiet reading can be told apart from absence, and an event whenever the lawyer's focus moves between browser tabs or away from the platform. The recorder sends its events to a collector every few seconds; a crash loses at most that interval.

From recording to activity stream

The raw recording is complete but unreadable, and it is large. A component we call the compactor replays the raw events and reduces them, by fixed rules, to the activity stream. The rules are versioned, so when results change between captures we can tell whether the lawyer's behaviour changed or our measurement did. One real burst of typing, at each of the three stages:

1 · The raw recording 255 events · ~60 KB for this one burst

One keystroke: the lawyer typed the letter "s" into a document. rrweb records it as a change to the page structure, referring to page elements by internal numbers. There are 254 more events like this for the rest of the burst.

{"type": 3, "data": {"source": 0, "texts": [], "attributes": [],
  "removes": [{"parentId": 24489, "id": 24490}],
  "adds": [{"parentId": 24489, "nextId": null,
            "node": {"type": 3, "textContent": "s", "id": 25613}}]},
 "timestamp": 1787315398621}
↓ compactor

2 · One activity event 1 event · ~0.4 KB

The 255 raw events become a single fact: 216 characters typed into a named document over twelve seconds, inside the document editor, on a known matter. The "raw" field points back to the raw events it came from, so any suspect line can be audited.

{"verb": "typed",
 "startTs": 1787315398621, "endTs": 1787315410124, "durationMs": 11503,
 "context": {"matterId": "mat_6tmypahftkbnvvm9", "section": "documents",
             "overlay": "Document Editor"},
 "entity": {"kind": "document", "id": "matdoc_ilc8r7i23m360epi",
            "label": "Settlement Agreement"},
 "detail": {"chars": 216},
 "raw": {"from": 3897, "to": 4151}}
↓ the same event, kept in two forms

3a · Stored: the structured stream for software

An array of events like the one above. This is the canonical record: anything that computes over the stream (the duration arithmetic in this spike, any future consumer) reads this form and joins to platform records by id.

[ …,
  {"verb": "typed", "startTs": …, "endTs": …,
   "entity": {"kind": "document", "id": "matdoc_ilc8r7…",
              "label": "Settlement Agreement"}, … },
  … ]

3b · Rendered: one line per event for people

Derived from the structured form for human reading. It is also what the current harness hands to the language model, which reads it as easily as we do.

13:29:58–13:30:10  [p3mhfzn9] typed
  document matdoc_ilc8r7… "Settlement Agreement"
  +216 chars over 12s  (in "Document Editor")
One design rule shaped the whole pipeline: the activity stream records observations; judgements live downstream. The stream states that 216 characters were typed into a named document over twelve seconds. Whether that was drafting, whether it is billable, and how it rounds into units are decisions made later, where they can be reviewed and adjusted. Nothing subjective is baked into the capture layer.

Reading the stream

Every event answers the same six questions, whichever form it is read in: when, in which browser tab, what kind of action, on what kind of item, on which named item, and inside which dialog, if any. The same short glossary given to the language model is all a human reader needs.

Within the events, we use a small set of verbs to say what kind of action happened. There are nine:

VerbMeaning
openedNavigated to a page. The address shows the matter and which tab of the matter (summary, documents, emails, notes, tasks, messages, calls, billing).
viewedA named item came on screen: a document, an email, a note.
readSustained scrolling through something, with how far and for how long.
typedComposed text. The stream records how many characters and for how long, not the text itself.
clickedA discrete action, named by the control that was pressed.
content changedText arrived that the lawyer did not type: a document loading, a paste, or Lawrence writing.
presentOn screen and focused but not interacting. Often reading; at most an upper limit on attention.
idleNo signal at all. Never counted as work.
attentionFocus moved to another tab, or away from the platform.

Where names come from, and what is never captured

Names are resolved from three sources, tried in order:

The privacy properties are enforced in the compaction rules, not left to policy:

Several tabs at once

Every browser tab records its own stream into a shared capture, and changes of focus are recorded as events. The combined timeline therefore knows, at any instant, which tab (and so which matter) had the lawyer's attention. From it we compute, in plain code, the observed active time per matter: time spent on matter B in a second tab is never also credited to matter A.

How each hypothesis was tested

H1 was tested by running scripted sessions of simulated legal work on seeded matters (uploading and drafting documents, reviewing files, emails, notes, tasks, messages, instructing Lawrence, deliberate multi-tab interleaving), reading the resulting stream against what was actually done, and fixing the compaction rules where they misbehaved. Coverage was then checked systematically with an audit of the entire front end: every page, every dialog, every action that affects a named item, every embedded viewer.

H2 was tested with a small harness in a notebook. For each matter with meaningful activity, it sends that matter's lines from the narrative to a language model in a single call, together with the matter's measured active time. The model must reply in a fixed format: a list of work blocks, each with proposed minutes, a client-facing narrative, and a "basis" citing its evidence. Code, not the model, converts minutes into billing units (six-minute units here; the increment is a per-firm setting) and stamps the date. The prompt contains no matter-specific information: it is the verb glossary above, fifteen example narratives that set the expected register, and grounding rules (every block must be supported by evidence in the stream; pure idle time is not recordable; narratives never mention clicks, scrolling, tabs, or the platform itself).

5Results

H1: the activity stream

Below is an excerpt from the capture used throughout this report: a session of simulated work across four matters in three browser tabs. The lawyer opened a matter, created a task, reviewed asset schedules, completed the task, then named and drafted a document. Every line was produced automatically.

activity stream · capture cap_mt2x4kvj · shown exactly as produced
13:21:14           clicked  "Lee & Carter - Prenuptial Agreement (Arizona)"
13:21:37           typed    task "review matter content"  +21 chars  (in "Create Task")
13:22:57           viewed   file matfil_k06tdl… "Schedule C - Jordan Lee (Assets)"
13:24:17           clicked  tab "Schedule A - Alex Carter (Assets)"  (in "Document Editor")
13:25:45           clicked  checkbox "Mark 'review matter content' as complete"
13:27:03           typed    document matdoc_ilc8r7… "Settlement Agreement"  +20 chars
13:29:58–13:30:10  typed    document matdoc_ilc8r7… "Settlement Agreement"  +216 chars over 12s
13:30:11           content changed  document "Settlement Agreement"  ~236 chars
13:22:48–13:36:43  idle     [background tab]  13m55s  (no interaction)
The highlighted line is the lawyer typing a name for a new document, captured as the document's title. The idle line belongs to a second, unattended browser tab.
Show the complete activity stream for this session (291 events, exactly as produced)
13:21:12           [p3mhfzn9] opened  /matters
13:21:12           [udgy31cy] opened  /matters/mat_rhyku0s3vn8va9t8/notes
13:21:12           [udgy31cy] viewed  note matnt_u8zhcc5ireyeg8a9 "Custom fields"
13:21:13           [fsvu2lr4] opened  /matters/mat_gmkxtwazw0di6xrc/summary
13:21:14           [p3mhfzn9] clicked  tbody "Lee & Carter - Prenuptial Agreement (Arizona)"
13:21:14           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/summary
13:21:16           [p3mhfzn9] clicked  section "Client Jordan Lee (31) seeks a prenuptial agreement ahead of marriage to Alex Ca"
13:21:18           [p3mhfzn9] clicked  link "Tasks"
13:21:19           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/tasks
13:21:24           [p3mhfzn9] clicked  button "Add task"
13:21:37           [p3mhfzn9] typed  task "review matter content"  +21 chars  (in "Create Task")
13:21:37           [p3mhfzn9] clicked  button "Add task"  (in "Create Task")
13:21:38           [p3mhfzn9] clicked  button "Add task"
13:21:44           [p3mhfzn9] typed  task "draft document"  +14 chars  (in "Create Task")
13:21:44           [p3mhfzn9] clicked  button "Add task"  (in "Create Task")
13:21:44–13:22:48  [udgy31cy] idle  1m5s  (no interaction)
13:21:46–13:23:36  [fsvu2lr4] idle  1m50s  (no interaction)
13:21:47           [p3mhfzn9] attention  blurred
13:22:22           [p3mhfzn9] attention  focused
13:22:23           [p3mhfzn9] clicked  link "Messages"
13:22:24           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/messages
13:22:27           [p3mhfzn9] clicked  composer "Write your message"
13:22:38           [p3mhfzn9] typed  message "Write your message"  +52 chars
13:22:40           [p3mhfzn9] clicked  button "Send"
13:22:46           [p3mhfzn9] clicked  div "hi 11:48 AM August 21 2026 Good question. Alex's townhouse at 440 N Scottsdale R"
13:22:47           [p3mhfzn9] clicked  link "Email"
13:22:48           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/emails
13:22:48–13:36:43  [udgy31cy] idle  13m55s  (no interaction)
13:22:52           [p3mhfzn9] clicked  link "Calls"
13:22:53           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/calls
13:22:54           [p3mhfzn9] clicked  link "Documents"
13:22:54           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/documents
13:22:56           [p3mhfzn9] clicked  div "Schedule C - Jordan Lee (Assets)"
13:22:57           [p3mhfzn9] clicked  button "Schedule C - Jordan Lee (Assets)"
13:22:57           [p3mhfzn9] viewed  file matfil_k06tdl1xdosgjh "Schedule C - Jordan Lee (Assets)"
13:23:04           [p3mhfzn9] clicked  button "Previous file"  (in "Document Editor")
13:23:04           [p3mhfzn9] viewed  file matfil_esooabcpimnaka
13:23:08           [p3mhfzn9] clicked  button "Previous file"  (in "Document Editor")
13:23:08           [p3mhfzn9] viewed  file matfil_y4tfdrp5xsgjlx
13:23:16           [p3mhfzn9] attention  blurred
13:24:02           [p3mhfzn9] attention  focused
13:24:02           [p3mhfzn9] clicked  button "Previous file"  (in "Document Editor")
13:24:03           [p3mhfzn9] viewed  file matfil_qkhqndzogoftzx
13:24:04           [p3mhfzn9] clicked  button "Previous file"  (in "Document Editor")
13:24:04           [p3mhfzn9] viewed  file matfil_iyu3ot1e01gbtg
13:24:05           [p3mhfzn9] clicked  button "Previous file"  (in "Document Editor")
13:24:05           [p3mhfzn9] viewed  file matfil_jqoafygcri43le
13:24:11           [p3mhfzn9] viewed  file matfil_iyu3ot1e01gbtg "Carr Solicitors - Boundary Dispute Letter - 24th Jan 2022.pdf"
13:24:11           [p3mhfzn9] clicked  tab "Carr Solicitors - Boundary Dispute Letter - 24th Jan 2022.pdf"  (in "Document Editor")
13:24:16           [p3mhfzn9] viewed  file matfil_qkhqndzogoftzx "Client Call Transcript - Jordan Lee"
13:24:16           [p3mhfzn9] clicked  tab "Client Call Transcript - Jordan Lee"  (in "Document Editor")
13:24:17           [p3mhfzn9] clicked  tab "Schedule A - Alex Carter (Assets)"  (in "Document Editor")
13:24:17           [p3mhfzn9] viewed  file matfil_y4tfdrp5xsgjlx "Schedule A - Alex Carter (Assets)"
13:24:18           [p3mhfzn9] viewed  file matfil_esooabcpimnaka "Schedule A - Alex Carter (Assets)"
13:24:18           [p3mhfzn9] clicked  tab "Schedule B - Alex Carter (Debts)"  (in "Document Editor")
13:24:19           [p3mhfzn9] viewed  file matfil_k06tdl1xdosgjh "Schedule C - Jordan Lee (Assets)"
13:24:19           [p3mhfzn9] clicked  tab "Schedule C - Jordan Lee (Assets)"  (in "Document Editor")
13:24:21           [p3mhfzn9] clicked  button "Close"  (in "Document Editor")
13:24:25           [p3mhfzn9] clicked  form "Lawrence Lawrence (TS) Lawrence Mini Fixture Tools Fixture Chat Question Fixture"
13:24:26           [p3mhfzn9] clicked  composer "Lawrence"
13:24:36           [p3mhfzn9] attention  blurred
13:25:03–13:25:07  [p3mhfzn9] read  document "Lawrence sidebar"  scrolled 235px over 3s
13:25:17           [p3mhfzn9] attention  focused
13:25:22           [p3mhfzn9] clicked  link "Notes"
13:25:22           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/notes
13:25:22           [p3mhfzn9] viewed  note matnt_ezhnuzada7m4twe3 "New note"
13:25:24           [p3mhfzn9] clicked  button "New note"
13:25:24–13:25:30  [p3mhfzn9] typed  note  +62 chars over 6s
13:25:32           [p3mhfzn9] clicked  button "Save"
13:25:32           [p3mhfzn9] viewed  note matnt_pcfx8nc5t2ftgpg9
13:25:43           [p3mhfzn9] clicked  link "Tasks"
13:25:43           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/tasks
13:25:45           [p3mhfzn9] clicked  checkbox "Mark "review matter content" as complete"
13:25:50           [p3mhfzn9] clicked  div "Add task July 10th, 2027 Assign July 10th, 2027 Assign Completed today Completed"
13:26:06           [p3mhfzn9] clicked  link "Home"
13:26:06           [p3mhfzn9] opened  /alerts
13:26:11           [p3mhfzn9] clicked  link "Matters"
13:26:11           [p3mhfzn9] opened  /matters
13:26:16           [p3mhfzn9] clicked  tbody "Networked 24/7 strategy"
13:26:16           [p3mhfzn9] opened  /matters/mat_0h7k2cc2hkfyqmga/summary
13:26:19           [p3mhfzn9] clicked  link "Tasks"
13:26:19           [p3mhfzn9] opened  /matters/mat_0h7k2cc2hkfyqmga/tasks
13:26:20           [p3mhfzn9] clicked  link "Email"
13:26:20           [p3mhfzn9] opened  /matters/mat_0h7k2cc2hkfyqmga/emails
13:26:21           [p3mhfzn9] clicked  link "Matters"
13:26:21           [p3mhfzn9] opened  /matters
13:26:22           [p3mhfzn9] clicked  tbody "Optimized dedicated matrices"
13:26:23           [p3mhfzn9] opened  /matters/mat_2hlta4qrc4nxojpr/summary
13:26:24           [p3mhfzn9] clicked  link "Matters"
13:26:24           [p3mhfzn9] opened  /matters
13:26:27           [p3mhfzn9] clicked  tbody "Centralized 24 hour collaboration"
13:26:27           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/summary
13:26:30           [p3mhfzn9] clicked  link "Documents"
13:26:30           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/documents
13:26:32           [p3mhfzn9] clicked  div "02887f8e-ccfb-420a-8c0e-ca645ddd434a-Neighbour_Statement.docx"
13:26:33           [p3mhfzn9] clicked  button "02887f8e-ccfb-420a-8c0e-ca645ddd434a-Neighbour_Statement.docx"
13:26:33           [p3mhfzn9] viewed  file matfil_nvjzf9rpf3fjmn "02887f8e-ccfb-420a-8c0e-ca645ddd434a-Neighbour_Statement.docx"
13:26:35           [p3mhfzn9] clicked  button "Close"  (in "Document Editor")
13:26:36           [p3mhfzn9] clicked  link "Overview"
13:26:36           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/summary
13:26:39           [p3mhfzn9] clicked  link "Documents"
13:26:39           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/documents
13:26:40           [p3mhfzn9] clicked  page
13:26:43           [p3mhfzn9] clicked  menu item "Document from template"
13:26:44           [p3mhfzn9] clicked  button "Close"  (in "Search templates")
13:26:45           [p3mhfzn9] clicked  page
13:26:46           [p3mhfzn9] clicked  menu item "Form from template"
13:26:47           [p3mhfzn9] clicked  button "Close"  (in "Search forms")
13:26:48           [p3mhfzn9] clicked  page
13:26:48           [p3mhfzn9] clicked  menu item "Blank document"
13:26:49           [p3mhfzn9] viewed  document matdoc_ilc8r7i23m360epi "Blank document"
13:26:56           [p3mhfzn9] clicked  button "Untitled document"  (in "Document Editor")
13:27:03           [p3mhfzn9] typed  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  +20 chars
13:27:03           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:27:10           [p3mhfzn9] attention  blurred
13:27:40           [p3mhfzn9] attention  focused
13:27:41           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:27:42–13:27:52  [p3mhfzn9] typed  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  +71 chars over 10s  (in "Document Editor")
13:27:55           [p3mhfzn9] clicked  composer "Lawrence"
13:28:13–13:31:20  [fsvu2lr4] idle  3m7s  (no interaction)
13:28:18           [p3mhfzn9] attention  blurred
13:28:36           [p3mhfzn9] attention  focused
13:29:00           [p3mhfzn9] clicked  aside "lawrence how does employment agreement settlements work in this jurisdiction Loa"
13:29:09           [p3mhfzn9] clicked  composer "Lawrence"
13:29:11           [p3mhfzn9] clicked  span "Texas at-will employment settlement severance agreement consideration"
13:29:11           [p3mhfzn9] clicked  span "Read…"
13:29:12           [p3mhfzn9] clicked  span "severance agreement release employment claims consideration Texas"
13:29:39           [p3mhfzn9] attention  blurred
13:29:55           [p3mhfzn9] attention  focused
13:29:56           [p3mhfzn9] clicked  composer "Lawrence"
13:29:57           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:29:58–13:30:10  [p3mhfzn9] typed  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  +216 chars over 12s  (in "Document Editor")
13:30:11           [p3mhfzn9] content changed  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  ~236 chars  (in "Document Editor")
13:30:11–13:30:13  [p3mhfzn9] read  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  scrolled 1487px over 2s  (in "Document Editor")
13:30:13           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:14           [p3mhfzn9] clicked  page
13:30:15           [p3mhfzn9] clicked  page
13:30:16           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:17           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:18           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:18           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:18           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:22           [p3mhfzn9] clicked  page
13:30:23           [p3mhfzn9] clicked  menu item "Heading 1"
13:30:23           [p3mhfzn9] typed  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  +9 chars  (in "Document Editor")
13:30:25           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:25           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:30:26           [p3mhfzn9] content changed  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  ~630 chars  (in "Document Editor")
13:30:27–13:30:28  [p3mhfzn9] typed  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  +20 chars over 1s  (in "Document Editor")
13:30:29           [p3mhfzn9] clicked  ul "advises the employee in writing to consult an attorney"
13:30:33           [p3mhfzn9] clicked  div "Employment settlements in Texas run on a few different tracks depending on what "
13:30:37           [p3mhfzn9] attention  blurred
13:30:38           [p3mhfzn9] attention  focused
13:30:44           [p3mhfzn9] clicked  link "Littlefield v. Schaefer, 955 S.W.2d 272"
13:30:44           [p3mhfzn9] attention  blurred
13:30:44           [p3mhfzn9] attention  hidden
13:30:46           [p3mhfzn9] attention  visible
13:30:46           [p3mhfzn9] attention  focused
13:30:51           [p3mhfzn9] clicked  ul "is written in plain language understandable to the employee"
13:30:53           [p3mhfzn9] clicked  link "EEOC v. Cosmair, Inc., 821 F.2d 1085"
13:30:53           [p3mhfzn9] attention  blurred
13:30:53           [p3mhfzn9] attention  hidden
13:31:02           [p3mhfzn9] attention  visible
13:31:02           [p3mhfzn9] attention  focused
13:31:02           [p3mhfzn9] attention  blurred
13:31:02           [p3mhfzn9] attention  hidden
13:31:06           [p3mhfzn9] attention  visible
13:31:06           [p3mhfzn9] attention  focused
13:31:09           [p3mhfzn9] clicked  p "Which of these applies depends on what claims your client is actually settling. "
13:31:11           [p3mhfzn9] clicked  composer "Lawrence"
13:31:15           [p3mhfzn9] typed  assistant_chat "Lawrence"  +29 chars
13:31:15           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:31:16           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:31:18           [p3mhfzn9] clicked  composer "Lawrence"
13:31:30           [p3mhfzn9] clicked  composer "Lawrence"
13:31:59           [p3mhfzn9] attention  blurred
13:31:59–13:32:00  [p3mhfzn9] read  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  scrolled 264px over 1s
13:32:10           [p3mhfzn9] attention  focused
13:32:39–13:32:46  [p3mhfzn9] read  document matdoc_ilc8r7i23m360epi "Settlement Agreement"  scrolled 992px over 8s
13:32:47           [p3mhfzn9] viewed  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"
13:32:47–13:32:47  [p3mhfzn9] read  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"  scrolled 976px over 1s
13:32:47           [p3mhfzn9] content changed  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"  ~7478 chars  (in "Document Editor")
13:32:52–13:38:12  [p3mhfzn9] present  document matdoc_z79g33s2cnehsk66  5m20s on screen, no interaction
13:36:43–13:40:35  [udgy31cy] idle  3m52s  (no interaction)
13:38:22           [p3mhfzn9] clicked  ol "Standard confidentiality, non-disparagement, property return, cooperation, gover"
13:38:22–13:38:22  [p3mhfzn9] read  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"  scrolled 975px over 0s
13:38:26           [p3mhfzn9] attention  blurred
13:39:31           [p3mhfzn9] attention  focused
13:39:31           [p3mhfzn9] attention  blurred
13:39:32–13:39:33  [p3mhfzn9] read  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"  scrolled 1349px over 1s
13:39:35           [p3mhfzn9] attention  focused
13:39:35           [p3mhfzn9] clicked  button "Drafting a generic employment settlement agreement template..."
13:39:36           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:39:37–13:39:38  [p3mhfzn9] read  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"  scrolled 2037px over 2s  (in "Document Editor")
13:39:39           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:39:40           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:39:41–13:39:41  [p3mhfzn9] read  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"  scrolled 2037px over 1s  (in "Document Editor")
13:39:42           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:39:46           [p3mhfzn9] attention  blurred
13:40:30           [p3mhfzn9] attention  focused
13:40:30           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:40:32–13:40:32  [p3mhfzn9] read  document matdoc_z79g33s2cnehsk66 "10. Voluntary Agreement"  scrolled 2036px over 1s  (in "Document Editor")
13:40:33           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:40:34           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:40:34           [p3mhfzn9] clicked  composer "Document Editor"  (in "Document Editor")
13:40:36           [p3mhfzn9] clicked  button "Finalize"  (in "Document Editor")
13:40:38           [p3mhfzn9] clicked  page
13:40:39           [p3mhfzn9] clicked  page
13:40:40           [p3mhfzn9] clicked  button "Finalize"  (in "Finalize document")
13:40:42           [p3mhfzn9] clicked  div
13:40:46           [p3mhfzn9] clicked  button "Close"  (in "Document Editor")
13:40:46–13:40:47  [p3mhfzn9] read  document "Lawrence sidebar"  scrolled 1335px over 1s
13:40:50           [p3mhfzn9] clicked  link "Transactions"
13:40:51           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/transactions
13:40:53           [p3mhfzn9] clicked  link "Billing"
13:40:54           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/billing
13:40:57           [p3mhfzn9] clicked  link "Tasks"
13:40:57           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/tasks
13:41:00           [p3mhfzn9] clicked  link "Matters"
13:41:00           [p3mhfzn9] opened  /matters
13:41:09           [p3mhfzn9] clicked  tbody "Adaptive asymmetric time-frame"
13:41:09           [p3mhfzn9] opened  /matters/mat_aeyfnr1w8zcar917/summary
13:41:10           [p3mhfzn9] clicked  link "Notes"
13:41:11           [p3mhfzn9] opened  /matters/mat_aeyfnr1w8zcar917/notes
13:41:11           [p3mhfzn9] viewed  note matnt_uzbzfigo65s7ddet
13:41:11           [p3mhfzn9] clicked  link "Documents"
13:41:11           [p3mhfzn9] opened  /matters/mat_aeyfnr1w8zcar917/documents
13:41:15           [p3mhfzn9] clicked  link "Overview"
13:41:16           [p3mhfzn9] opened  /matters/mat_aeyfnr1w8zcar917/summary
13:41:17           [p3mhfzn9] clicked  link "Tasks"
13:41:17           [p3mhfzn9] opened  /matters/mat_aeyfnr1w8zcar917/tasks
13:41:20           [p3mhfzn9] clicked  link "Email"
13:41:20           [p3mhfzn9] opened  /matters/mat_aeyfnr1w8zcar917/emails
13:41:21           [p3mhfzn9] clicked  link "Matters"
13:41:21           [p3mhfzn9] opened  /matters
13:41:22           [p3mhfzn9] clicked  tbody "Centralized 24 hour collaboration"
13:41:22           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/summary
13:41:25           [p3mhfzn9] clicked  link "Matters"
13:41:25           [p3mhfzn9] opened  /matters
13:41:26           [p3mhfzn9] clicked  tbody "Lee & Carter - Prenuptial Agreement (Arizona)"
13:41:26           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/summary
13:41:34           [p3mhfzn9] clicked  link "Hi, Great call today - thank you for explaining everything so clearly. I feel mu"
13:41:34           [p3mhfzn9] opened  /matters/mat_rhyku0s3vn8va9t8/emails
13:41:34           [p3mhfzn9] viewed  thread nylas_thread_nrdbiwbBaADl4N4mEpQ247Ds "Hi, Great call today - thank you for explaining everything so clearly. I feel mu"
13:41:41           [p3mhfzn9] clicked  link "Matters"
13:41:41           [p3mhfzn9] opened  /matters
13:41:43           [p3mhfzn9] clicked  tbody "Centralized 24 hour collaboration"
13:41:43           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/summary
13:41:44           [p3mhfzn9] clicked  link "Email"
13:41:44           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/emails
13:41:45           [p3mhfzn9] clicked  button "New email"
13:41:46           [p3mhfzn9] clicked  combobox "Add recipients"
13:41:52           [p3mhfzn9] clicked  option "example+Tom.Bashirian@gmail.com"  → email "Add recipients"
13:41:53           [p3mhfzn9] viewed  email msgdraft_lm0x4ymh7cg6y1i7 "example+Tom.Bashirian@gmail.com"
13:41:53           [p3mhfzn9] clicked  form "Subject: Bcc Cc Archibald Frami-Walsh To:"
13:41:54           [p3mhfzn9] clicked  field "Add a subject..."
13:41:56           [p3mhfzn9] typed  email msgdraft_lm0x4ymh7cg6y1i7 "hi client"  +9 chars
13:41:57–13:41:58  [p3mhfzn9] typed  email msgdraft_lm0x4ymh7cg6y1i7 "hi client"  +7 chars over 0s
13:41:59           [p3mhfzn9] clicked  composer
13:42:03           [p3mhfzn9] typed  email msgdraft_lm0x4ymh7cg6y1i7 "RE: Your Matter"  +15 chars
13:42:03           [p3mhfzn9] clicked  composer
13:42:04–13:42:10  [p3mhfzn9] typed  email msgdraft_lm0x4ymh7cg6y1i7 "RE: Your Matter"  +56 chars over 7s
13:42:12           [p3mhfzn9] clicked  field "Add a subject..."
13:42:15           [p3mhfzn9] typed  email msgdraft_lm0x4ymh7cg6y1i7 "RE: Your Matter: Onboarding Support"  +35 chars
13:42:15           [p3mhfzn9] clicked  composer "file drop zone"
13:42:15–13:42:43  [p3mhfzn9] typed  email msgdraft_lm0x4ymh7cg6y1i7 "RE: Your Matter: Onboarding Support"  +193 chars over 27s
13:42:44           [p3mhfzn9] clicked  button "Send"
13:42:52           [p3mhfzn9] clicked  button "Close survey"
13:43:03           [p3mhfzn9] clicked  article "Archibald Frami-Walsh"
13:43:04           [p3mhfzn9] clicked  article "Archibald Frami-Walsh"
13:43:06           [p3mhfzn9] clicked  button "Sent"
13:43:07           [p3mhfzn9] clicked  button "Inbox"
13:43:09           [p3mhfzn9] clicked  button "Drafts"
13:43:11           [p3mhfzn9] clicked  button "New email"
13:43:11           [p3mhfzn9] clicked  combobox "Add recipients"
13:43:14           [p3mhfzn9] clicked  composer "file drop zone"
13:43:15           [p3mhfzn9] clicked  link "Overview"
13:43:15           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/summary
13:43:17           [p3mhfzn9] clicked  link "Notes"
13:43:17           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/notes
13:43:17           [p3mhfzn9] viewed  note matnt_0j6lzc6dtvvndf
13:43:18           [p3mhfzn9] clicked  link "Tasks"
13:43:19           [p3mhfzn9] opened  /matters/mat_6tmypahftkbnvvm9/tasks
13:43:20           [p3mhfzn9] clicked  button "Add key date"
13:43:21           [p3mhfzn9] clicked  div
13:43:21           [p3mhfzn9] clicked  page
13:43:22           [p3mhfzn9] clicked  button "Add task"
13:43:29           [p3mhfzn9] typed  task "Check-in with client"  +20 chars  (in "Create Task")
13:43:29           [p3mhfzn9] clicked  button "Today"  (in "Create Task")
13:43:31           [p3mhfzn9] clicked  button "24"
13:43:32           [p3mhfzn9] clicked  button "Add task"  (in "Create Task")
15.7 MB → 22 KB
raw recording → readable narrative for the 22-minute session (748:1)
7,726 → 291
raw events → activity events, same session
~1 KB / minute
durable size of the stream; small enough to give a model a whole session at once

Multi-tab attribution held (the PRD's first open question). The session's active time resolved to 588 seconds on one matter, 56 on a second, and 13 and 1 on two matters that were only glanced at, with interruptions never credited to the interrupted matter. Naming also held across surfaces: tasks, documents, files, email subjects, and Lawrence conversations all resolved to the correct item, and reviewing the stream against what was actually done required no knowledge of the system to interpret.

The coverage audit found four boundaries, each with a stated fallback:

  1. PDF viewing and AI form review. PDFs, including court forms filled by Lawrence and reviewed by the lawyer, are displayed by a third-party viewer that renders inside a sealed-off region of the page which outside scripts cannot inspect, so scrolling and field navigation inside it are invisible. Still captured: edits to form fields (those signals escape the sealed region) and how long the viewer was on screen, so "worked in form X for 12 minutes, edited 9 fields" is available today. Field-level detail would need a small integration with the viewer's own programming interface.
  2. Email reading depth. For safety, received email bodies render inside an isolated frame the recorder cannot see into. We know which email is open, its subject, and for how long; not how far it was read. Time on screen is the billing-relevant quantity, so we propose accepting this boundary.
  3. Off-platform work is out of scope. Phone calls, work in Word, and court time happen outside the browser session and are not capturable without installing software on the lawyer's machine, which we do not envisage doing any time soon. This matches the product design: off-platform work is logged manually, and the review screen should show the gaps honestly rather than papering over them.
  4. A few unlabelled controls. A small number of actions in the product are icon-only buttons with no text naming what they act on, invisible to the recorder and to screen readers alike. These are pre-existing accessibility gaps; one-line label fixes close both problems.

H2: proposed entries

The notebook harness produced seven entries across the session's two worked matters. The largest is shown below; the rest expand beneath it. All are unedited model output. The matter glanced at for 13 seconds correctly produced no entries.

2 units · 12 minmat_6tmypa… · 21 Aug 2026

Drafting and reviewing employment settlement agreement; researching Texas settlement, release, confidentiality, and related provisions before finalizing the agreement.

BasisCreated and drafted a document titled "Settlement Agreement" from 13:26:48–13:32:47, including approximately 630 characters of document changes and further drafting. Researched Texas employment settlement and release requirements through 13:31:15, then reviewed and finalized a 7,478-character agreement from 13:32:47–13:40:46.
Show the remaining six proposed entries (unedited model output)
1 unit · 2 minmat_6tmypa…

Corresponding with client regarding matter onboarding support; preparing and sending a responsive email.

BasisFrom 13:41:44–13:42:44, addressed an email to the client, entered the subject "RE: Your Matter: Onboarding Support," composed approximately 300 characters, and sent the email.
1 unit · 1 minmat_6tmypa…

Attending to matter administration; reviewing the matter note and creating a client check-in task for a future date.

BasisViewed the matter note and opened the task area at 13:43:17–13:43:19, then created a task titled "Check-in with client" and set its date at 13:43:22–13:43:32.
1 unit · 1 minmat_rhyku0…

Attending to matter administration; creating tasks for review of matter content and preparation of the draft document.

Basis13:21:24–13:21:44: created and saved two matter tasks, including "review matter content" and "draft document."
1 unit · 1 minmat_rhyku0…

Corresponding with the client regarding the matter and providing a written response through the client communication channel.

Basis13:22:27–13:22:40: composed a 52-character client message and sent it.
1 unit · 1 minmat_rhyku0…

Reviewing matter documents, including the parties' asset and debt schedules and the client call transcript, in preparation for further work on the prenuptial agreement.

Basis13:22:56–13:24:21: reviewed multiple matter files, including Schedule A, Schedule B, Schedule C, and the Client Call Transcript.
1 unit · 1 minmat_rhyku0…

Preparing and saving a matter note recording the work undertaken and relevant matter information.

Basis13:25:22–13:25:32: opened a new matter note, entered 62 characters, and saved it.

Three observations from the output:

  1. The "basis" field worked as an audit trail. Each entry cites the timestamps supporting it, and those citations check out against the stream.
  2. On units (the PRD's second open question): distinct pieces of work became separate blocks, each rounded up to the firm's increment in code. The settings a firm would control fall out directly: the unit size, a floor for scraps (a 52-character client message became a 1-unit entry), and whether small same-day touches on one matter should consolidate into a single entry.
  3. On durations: the model proposed 15 minutes against 9.8 measured active minutes on the first matter, within the roughly 17 minutes the matter demonstrably spent in front of the lawyer. That gap between measured and proposed time is not a bug to fix but a decision to make, and it is the subject of the next section.

6Open question: what may bound a proposed duration

The ethics come first, because they set the frame. On billing time, the American Bar Association's Formal Opinion 93-379 ("Billing for Professional Fees, Disbursements and Other Expenses") states:

"In matters where the client has agreed to have the fee determined with reference to the time expended by the lawyer, a lawyer may not bill more time than she actually spends on a matter, except to the extent that she rounds up to minimum time periods (such as one-quarter or one-tenth of an hour)." — ABA Formal Opinion 93-379

Two things follow for our design. First, some bound on proposed durations is not merely prudent but ethically required: a system that routinely proposes more time than was actually spent, relying on the reviewing lawyer to catch it, is a system built to produce over-billing whenever review is inattentive. Second, and pulling the other way, the standard is time actually spent, and our measured interaction time is evidence of time spent, not its definition. Reading and thinking are time actually spent that barely register as interaction, so the strictest available bound is not ethically mandated either; it would systematically bill less than the truth.

The capture layer produces three quantities any rule could use: measured active time (interaction-credited seconds), the attended envelope (the time a matter demonstrably spent in front of the lawyer, excluding other matters and idle), and per-block evidence spans (the timestamps each proposed block cites). The options, from strictest to loosest:

O1Strict cap. Total proposed minutes may not exceed measured active time. Maximum safety and trivially defensible, but it reproduces the failure lawyers resent in legacy tools: the timesheet only counts typing. In the worked session it would cap the drafting matter at 9.8 minutes when the matter demonstrably occupied the lawyer for around 17. Under-billing is not an ethics breach, but it is a product failure and a revenue leak for the firm.
O2Envelope cap. Total proposed minutes may not exceed the attended envelope. The bound is factual (nothing can be billed beyond the matter's actual time on screen), reading and thinking count, and the model keeps full freedom to divide the envelope between blocks of work. The residual risk is passive inflation: time a matter merely sat in front of an inattentive lawyer can be dressed as work, up to the envelope. Aligns naturally with 93-379, since attended on-screen time is a defensible account of time actually spent on-platform.
O3Checked citations. Every block must cite the start and end times of its evidence, and code verifies the citations: the cited ranges exist in the stream, do not overlap between blocks, and cover the claimed minutes, with the envelope as an outer bound. This is the strongest audit position, because the "basis" becomes a machine-verified citation rather than persuasive prose, and double-counting between blocks becomes structurally impossible. Costs one extra field in the output format and a small validation step.
O4Flag, never bound. No hard limit; entries whose totals exceed the envelope are flagged for the reviewing lawyer rather than altered. This preserves the model's judgement fully and surfaces disagreement instead of hiding it, but it is the hardest position to defend under 93-379: the system knowingly forwards proposals it cannot support, and the safeguard is exactly the reviewer attention that 93-379's drafters knew to distrust.

The spike's harness currently implements none of these: the model is told that measured time is instrumentation rather than truth and asked to propose what a lawyer can fairly record, grounded in the stream's timestamps. That was the right setting for finding out what the model does with freedom; it is not a production posture. Any of the four options is cheap to implement. Choosing between them is an open question about risk appetite and the review experience, to be discussed and settled before the Tech Plan is locked in; this spike deliberately does not decide it. Under every option, the lawyer's review remains the final safeguard, and rounding into minimum billing units (which 93-379 expressly permits) stays in code.

Recommendation. We recommend Option 2, the envelope cap: it is the only bound that is both factual (nothing can be billed beyond the matter's actual time in front of the lawyer) and fair to the work (reading and thinking count). Note that the cap applies to the model's proposal, not to the rounding that follows in code: a three-minute piece of work still rounds up to a six-minute entry if that is the firm's increment, exactly as 93-379 permits. Option 3's checked citations can be layered on top later as audit hardening without changing the bound. The final call belongs to that discussion.

7Conclusions

8Beyond time tracking

The activity stream was built for time entries, but nothing about it is specific to billing: it is a compact, structured record of how legal work is actually done, joined to platform records by their real ids. The immediate wins are close at hand. Lawrence can be grounded in a lawyer's recent work ("you were drafting the Settlement Agreement this morning") without any search, and suggested prompts can be conditioned on what the lawyer just did rather than on a matter's static state.

The larger point is where this data leads. Our long-term ambition for Lawrence is a digital colleague that anticipates: one that reviews new information as it arrives, prepares drafts before the lawyer asks, guides attention to the cases that need it, and adapts to how each lawyer practises. Anticipation has a prerequisite: knowing what a lawyer is doing now, and what lawyers normally do next at this stage of this kind of matter. That knowledge has never existed as data, in this industry or anywhere else; it lives in the habits of practitioners. The activity stream is that data, and once this system ships we start capturing it as a side effect of a billing feature: every session recorded is another observation of how matters actually progress, from which anticipating behaviour can eventually be learned. This is the data we have always needed, and it is why the structured events, not just their readable rendering, deserve durable storage.

9Carried into the Tech Plan

Three things are handed to the Tech Plan, in decreasing order of consequence:

  1. The duration bound. The section 6 question, to be settled in discussion before the Tech Plan is locked in; our recommendation is stated above.
  2. The production pipeline for recordings. The spike wrote everything to local files, which was right for an experiment and is not a production shape. The Tech Plan needs to design the real pipeline, which comes down to a chain of questions:
    • Whether and how raw events are cached in the browser before leaving it, and how often they are flushed to durable storage (for example S3, our file store).
    • When the compactor runs over the stored recordings, and when the resulting activity streams are derived and written.
    • When time entries are proposed from the streams: as work happens, when a matter goes quiet, or on a daily schedule.
    • What rrweb should capture in the first place. Much of the raw payload, all of the styling information for instance, tells us nothing about what the lawyer did, and dropping it shrinks the recording substantially.
    • Where activity streams live long-term, how long raw recordings are retained before deletion, and the matter-scoped permissions on both.
  3. Per-firm billing settings. Each of these is a policy choice rather than an engineering one, and each should be configurable per firm:
    • The billing increment: whether time rounds up to six-minute units, fifteen-minute units, or some other period. The system does not care which; the firm chooses.
    • The episode boundary: how long a matter must sit quiet before a block of work on it is considered finished and ready to become an entry.
    • The minimum worth recording: whether a very small amount of activity, such as thirty seconds of glancing at a matter, should ever produce an entry at all.
    • Consolidation: whether several small entries on the same matter in one day are merged into a single entry. Merging bills less than rounding each entry up separately, so this choice has a direct revenue consequence.