Drafting and reviewing employment settlement agreement; researching Texas settlement, release, confidentiality, and related provisions before finalizing the agreement.
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:
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}
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}}
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")
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:
| Verb | Meaning |
|---|---|
| opened | Navigated to a page. The address shows the matter and which tab of the matter (summary, documents, emails, notes, tasks, messages, calls, billing). |
| viewed | A named item came on screen: a document, an email, a note. |
| read | Sustained scrolling through something, with how far and for how long. |
| typed | Composed text. The stream records how many characters and for how long, not the text itself. |
| clicked | A discrete action, named by the control that was pressed. |
| content changed | Text arrived that the lawyer did not type: a document loading, a paste, or Lawrence writing. |
| present | On screen and focused but not interacting. Often reading; at most an upper limit on attention. |
| idle | No signal at all. Never counted as work. |
| attention | Focus 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 web address. The platform records what is open on screen in the page's address: the matter, the section, and a reference to the open item. This is the most reliable source, because it is the platform's own statement of what the lawyer is looking at.
- The page itself. Where the address gives an id but no human name, the name is usually visible on screen: the row the lawyer clicked to open the item, or a dialog's title. A name learned once is remembered against the item's id; renaming an item updates it.
- One deliberate exception. Typed content is counted, never stored, with one exception made by explicit decision: the first ~80 characters of an instruction sent to Lawrence, because what was asked identifies the legal task being done. (The platform also generates a title for each Lawrence conversation after the first message; the stream captures it like any other on-screen name, and if it proves sufficient to identify the task, the typed sample may become unnecessary. That is untested.)
The privacy properties are enforced in the compaction rules, not left to policy:
- Document text, note contents, and client message bodies never enter the activity stream; only character counts and durations do.
- The names that do appear (document titles, email subjects, task names) are the same strings visible in any matter list, and would be protected in production exactly like the records they name.
- Every event carries the platform id of the content it touches, so a consumer that legitimately needs more than the stream holds (the document itself, the full email) can look it up through the platform's authenticated routes, subject to the same permissions as any other access. The stream does not need to carry sensitive detail to enable detailed downstream use.
- The raw recording, which does contain page content, is treated as temporary working data: it exists to be compacted and debugged against, then discarded. Only the activity stream would be kept.
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.
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)
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")
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:
- 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.
- 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.
- 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.
- 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.
Show the remaining six proposed entries (unedited model output)
Corresponding with client regarding matter onboarding support; preparing and sending a responsive email.
Attending to matter administration; reviewing the matter note and creating a client check-in task for a future date.
Attending to matter administration; creating tasks for review of matter content and preparation of the draft document.
Corresponding with the client regarding the matter and providing a written response through the client communication channel.
Reviewing matter documents, including the parties' asset and debt schedules and the client call transcript, in preparation for further work on the prenuptial agreement.
Preparing and saving a matter note recording the work undertaken and relevant matter information.
Three observations from the output:
- The "basis" field worked as an audit trail. Each entry cites the timestamps supporting it, and those citations check out against the stream.
- 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.
- 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:
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.
7Conclusions
- H1 is supported. A browser recording reduces, by fixed rules, to an activity stream that names the matter, the item, and the timespan of each action, at roughly one durable kilobyte per active minute. The boundaries are known and enumerated: the PDF viewer's interior, email reading depth, off-platform work, and a handful of unlabelled controls, each with a stated fallback.
- H2 is supported on the evidence so far. From a prompt containing no matter-specific information, the model produced entries with recognisable timesheet language, correct matter attribution, cited evidence, and a correct refusal to invent work for a matter that was only glanced at. The evidence is one session of simulated work, judged against the recollection of the person who performed it. Evaluation continues with a test cohort of lawyers, and once in production the measures are direct: the rate at which proposed entries are accepted, and how far narratives are edited before approval.
- The PRD's open questions resolve differently. Multi-tasking attribution is answered by the capture design and held in testing. Fragmentation into units resolves into per-firm settings (unit size, a floor for scraps, consolidation) plus the one genuine decision set out in section 6.
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:
- The duration bound. The section 6 question, to be settled in discussion before the Tech Plan is locked in; our recommendation is stated above.
- 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.
- 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.