Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions GLOSSARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -251,12 +251,15 @@ _Avoid_: init, onboarding, configure

### Logs and records

**Session log**:
The full transcript of one agent session, one per session, a **Resume** and each **Repair** included. Kept with its repository's other logs, named for the session's kind and stamped with the local time its command started, so all of a command's Session logs sort together. The start stamp is a display and grouping fact; distinct Commands have distinct storage ownership even when their stamps agree. Model evidence is kept beside each Session log and belongs to the exact owning **Command**, including across child Runs. It survives an interrupted stream and is replaced by completed retained evidence only when a report is available, even when that report has no observed Models; an absent report leaves the stream evidence intact. Requested **Model** and **Effort** choices are recorded separately from observed Models. A session that ran the code review has its reviewers' reports kept beside its Session log.
_Avoid_: transcript, session file
**Session trace**:
The events and timed work of one agent session, one per session, a **Resume** and each **Repair** included. Each belongs to its owning **Command**'s **Trace**. Kept with its repository's other logs, named for the session's kind and stamped with the local time its command started, so all of a command's Session traces sort together. The start stamp is a display and grouping fact; distinct Commands have distinct storage ownership even when their stamps agree. Model evidence is kept beside each Session trace and belongs to the exact owning **Command**, including across child Runs. It survives an interrupted stream and is replaced by completed retained evidence only when a report is available, even when that report has no observed Models; an absent report leaves the stream evidence intact. Requested **Model** and **Effort** choices are recorded separately from observed Models. A session that ran the code review has its reviewers' reports kept beside its Session trace.
_Avoid_: Session log, transcript, session file

**Trace**:
A **Command**'s whole tree of work, its child **Runs** and all of their **Session traces** included. Their shared identity keeps the tree together across sessions.

**Command log**:
Everything one **Run**, **Spec run**, **Architect run**, **Pickup run** or **Security run** printed, kept in a file of its own with its repository's other logs, stamped like its **Session logs**. The start stamp is for display and grouping; Commands with the same start time still have distinct storage ownership for their Command logs, Session logs and **Command records**. An Architect run's, Pickup run's or Security run's covers the Spec runs or Runs it dispatched, and a Spec run's covers its **Tickets**' Runs, as a Run's covers its **Base fix**: none of those keeps one of its own. It is kept once the command starts work: a Pickup run, Architect run or Security run skipped before doing any work keeps none, and neither does a Run that fails before it starts work, such as on **Origin match**.
Everything one **Run**, **Spec run**, **Architect run**, **Pickup run** or **Security run** printed, kept in a file of its own with its repository's other logs, stamped like its **Session traces**. The start stamp is for display and grouping; Commands with the same start time still have distinct storage ownership for their Command logs, Session traces and **Command records**. An Architect run's, Pickup run's or Security run's covers the Spec runs or Runs it dispatched, and a Spec run's covers its **Tickets**' Runs, as a Run's covers its **Base fix**: none of those keeps one of its own. It is kept once the command starts work: a Pickup run, Architect run or Security run skipped before doing any work keeps none, and neither does a Run that fails before it starts work, such as on **Origin match**.
_Avoid_: cron log, output log, run log (a **Run** is one kind of command)

**Activity log**:
Expand All @@ -268,7 +271,7 @@ What a **Command** keeps on its machine about where it is: its process, its issu
_Avoid_: live record, state file, status file

**Run notification**:
A message thirdshift sends when a **Run**, a **Spec run**, an **Architect run** or a **Security run** ends, whatever its outcome (ready, merged, failed or interrupted; for an Architect run that dispatched nothing, plan published, idea filed, idea already filed or review failed), to the address given with the email flag or the default in the **User config**. Its body tells everything its subject does and names the owning **Command**, so the body alone carries it. Each sends one only when asked to, by the flag or by the User config; a Spec run's notification lists each **Ticket**'s outcome, and a Ticket's **Run** never sends one of its own. After an **Inherited failure** it carries, beside the cause, what the Run says on stderr: where the checks fail on the **Base branch**, and the offer of a **Base fix** if nobody decided against one. An Architect run's notification tells how its **Architecture review** ended, naming the plan or idea issue, and how the Spec run or Run it dispatched ended, which sends none of its own; a skipped one sends none. A **Pickup run** that took a **Ready issue** sends one naming the Pickup run as its Command and the Spec run or Run it dispatched, which sends none of its own; a skipped one sends none. A **Security run**'s notification lists each **Security finding**'s severity, title and private link, never its write-up, since the message passes through a third party. When a Run leaves a reproduced finding unfixed and nobody decided against fixing, it offers both the command and the User config setting that allow fixing; a skipped one sends none. Its Session models section collects Model evidence kept beside each **Session log**, belonging to the exact owning **Command** across child Runs. Stream evidence survives interruption and is replaced by completed retained evidence only when a report is available; a present report with no observed Models is authoritative. Requested **Model** and **Effort** choices remain distinct from observed Models, with requested/default fallback wording when none were reported. Failing to collect evidence or send one never changes the outcome.
A message thirdshift sends when a **Run**, a **Spec run**, an **Architect run** or a **Security run** ends, whatever its outcome (ready, merged, failed or interrupted; for an Architect run that dispatched nothing, plan published, idea filed, idea already filed or review failed), to the address given with the email flag or the default in the **User config**. Its body tells everything its subject does and names the owning **Command**, so the body alone carries it. Each sends one only when asked to, by the flag or by the User config; a Spec run's notification lists each **Ticket**'s outcome, and a Ticket's **Run** never sends one of its own. After an **Inherited failure** it carries, beside the cause, what the Run says on stderr: where the checks fail on the **Base branch**, and the offer of a **Base fix** if nobody decided against one. An Architect run's notification tells how its **Architecture review** ended, naming the plan or idea issue, and how the Spec run or Run it dispatched ended, which sends none of its own; a skipped one sends none. A **Pickup run** that took a **Ready issue** sends one naming the Pickup run as its Command and the Spec run or Run it dispatched, which sends none of its own; a skipped one sends none. A **Security run**'s notification lists each **Security finding**'s severity, title and private link, never its write-up, since the message passes through a third party. When a Run leaves a reproduced finding unfixed and nobody decided against fixing, it offers both the command and the User config setting that allow fixing; a skipped one sends none. Its Session models section collects Model evidence kept beside each **Session trace**, belonging to the exact owning **Command** across child Runs. Stream evidence survives interruption and is replaced by completed retained evidence only when a report is available; a present report with no observed Models is authoritative. Requested **Model** and **Effort** choices remain distinct from observed Models, with requested/default fallback wording when none were reported. Failing to collect evidence or send one never changes the outcome.
_Avoid_: completion email, alert

### Console
Expand Down Expand Up @@ -298,7 +301,7 @@ The **Inbox**'s first group: what won't come right unless the **Day shift** acts
_Avoid_: alerts, attention, triage queue

**Silent**:
A live **Run** whose **Session log** and **Command log** have both stopped growing for longer than the silent time the **User config** sets, 10 minutes unless set: it may be stuck. Stages that wait on something else, such as CI watch, write a line at intervals while they wait, so silence means the same thing in every stage. A stall is silence, not a long stage: a Run that is past its **Usual range** but still logging is **Slow**.
A live **Run** whose **Session trace** and **Command log** have both stopped growing for longer than the silent time the **User config** sets, 10 minutes unless set: it may be stuck. Stages that wait on something else, such as CI watch, write a line at intervals while they wait, so silence means the same thing in every stage. A stall is silence, not a long stage: a Run that is past its **Usual range** but still logging is **Slow**.
_Avoid_: stalled, stuck, hung

**Slow**:
Expand Down Expand Up @@ -364,7 +367,7 @@ The weekly **Command** that evaluates production work. A **Grader** gives **Scor
_Avoid_: grading run, tasting, production monitoring

**Run metrics**:
What a **Run**'s **Command record** and **Session logs** show about how it went, such as its outcome, **Repairs**, CI rounds, **Unaddressed findings**, stage times, tokens and tool errors. Each is kept apart, never combined into one number.
What a **Run**'s **Command record** and **Session traces** show about how it went, such as its outcome, **Repairs**, CI rounds, **Unaddressed findings**, stage times, tokens and tool errors. Each is kept apart, never combined into one number.
_Avoid_: Run score, KPI

**Bug origin**:
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ Run `sudo nginx -t`, then `sudo systemctl restart nginx` on a systemd host. The
- [Machine status](docs/guide.md#machine-status), [showing Commands and reading logs](docs/guide.md#show-and-read-one-command), and [stopping a Command](docs/guide.md#stopping-a-command).
- [The local Console](console/README.md): `thirdshift console --no-sign-in` serves the Inbox on localhost.
- [Building and testing](docs/guide.md#building-from-source) and [releasing](docs/guide.md#releasing).
- [Session traces](docs/guide.md#logs) retain each Harness event and timed work in OTLP JSON Lines, with Model evidence and review reports beside them.
- [Exact prompts](prompts/README.md) and [Factory skills](skills/), also [readable on the site](https://thirdshift.app/prompts/).
- [Domain vocabulary](GLOSSARY.md) and [architectural decisions](docs/adr/).
- [Open issues](https://github.com/JacobStephens2/thirdshift/issues) for known gaps and planned work.
Expand Down
76 changes: 50 additions & 26 deletions console/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ The available pages are Inbox (`1`), Lanes (`2`), Stages (`3`), Waterfall (`4`),
History (`5`), Logs (`6`), Security (`7`) and Cron jobs (`8`). Inbox through Security links
keep the page in `?page=`. History includes every ended Command, including old
logs, and filters by outcome and repository. Security shows retained findings
and Session logs. Older records without finding metadata still show their logs.
and Session traces. Older records without finding metadata still show their logs.

Cron jobs (`/cronjobs`, or `g` then `j`) shows schedules and commands from the
Unix account running the Console's `crontab -l`. The same inventory is available
Expand Down Expand Up @@ -183,27 +183,51 @@ test checks their stage times and Usual ranges against the CLI; the Playwright
time tests check scale in all windows, child selection, live ordering and 390 px.

Waterfall chooses one retained Command with live, died and ended chips, keeping
its exact selection in `command=`. Runs, stages and tool calls share one axis,
including a Spec run's Ticket Runs. It pairs with `show --json` and `logs`:
stage intervals come from the Command record. For a Session trace, each tool
interval uses its span's start and end, including overlapping calls and fractions
of a second. A running call uses its start record and extends to the current time
while its Command is live. A call left open in an ended or died Command retains
its start with “Time unknown” for its duration.
Only sessions with an old Session log and no Session trace use Claude/Codex tool
summaries matched to scoped `HH:MM:SS` Command-log lines in order, across midnight.
Those estimated intervals extend to the next matched call or stage boundary and
include waiting. Unmatched legacy calls stay visible with “Time unknown” and no
bar. Session links open their retained evidence. The Waterfall browser test checks
selection, span times, running calls, scale, unknown times, escaping and phone
layout; Rust checks trace timing, legacy matching and CLI parity.
The retained Spec-review checks are `python3 console/reproductions/waterfall-fractional.py`
and `python3 console/reproductions/waterfall-stage.py` from the repo root after a build.
The Rust router test walks the registered routes and checks their CLI pairs.
The fractional Run/stage boundaries also run in the Rust integration tests.
The retained Session-trace regression is
`python3 console/reproductions/waterfall-trace-axis.py`; it checks that completed
tool spans still draw bars after a Command dies without recording its end.
its exact selection in `command=`. A span tree replaces the old Run sections:
Command → Runs → stages → Sessions → model calls, turns, tools and sub-agents.
Child Runs sit under the stage that started them; reused Sessions appear only
under their first stage. Commands, Runs and stages start expanded, Sessions
folded. Calls enter the DOM only after their Session is expanded.

The same tree and selected span details are available from the CLI:

```sh
thirdshift show widgets#7 --spans --json
thirdshift show widgets#7 --span <span-id> --json
```

The tree uses the recorder's stable Command, Run and stage span IDs. Each row
has its kind, status, duration and bar on a shared axis. Errors carry their
message, running calls extend to now with a hatched bar, and estimated timings
are dotted and marked `*`. Converted Session tools keep the old scoped
Command-log estimates, including unknown times. Commands without traces still
show their Runs and stages.

The open Slowest calls list ranks ten tool and model calls in the timeline's
window; turns and sub-agents are excluded. Selecting a call reveals its row
and summary Peek. Ancestors in the Peek select their own span. The card shows
applicable timing, usage, cost, call and error facts, relative-position bars,
input/output and attributes, plus a conversation link and Copy CLI. Conversation
links open the Session because that reader does not yet anchor individual
records. Command details opens the existing Peek with Stop, logs and the PR.

Zoom fits a parent span or a padded window around a call. The sticky axis keeps
the zoom notice and Zoom out control visible; the slowest calls re-rank within
the window. Folds, selection, zoom and Peek disclosures survive live refresh.
On a phone, labels fill one row, bars and durations the next; revealed rows
stay between the sticky axis and the Peek bottom sheet.

Within the tree, arrows and `j` / `k` move focus, Right expands or enters a
child, Left folds or returns to the parent, Home/End reach either end, and
Enter/Space opens the Peek. Outside the tree, the Console's usual keys apply.

Rust route/CLI parity and timing tests live in `tests/console/spans.rs` and
`tests/console/waterfall.rs`. The Playwright span and Waterfall tests cover
folding at scale, keyboard navigation, Peek, zoom, live refresh, bar geometry,
escaping and 390 px. Retained timing checks also run with
`python3 console/reproductions/waterfall-fractional.py`,
`python3 console/reproductions/waterfall-stage.py`, and
`python3 console/reproductions/waterfall-trace-axis.py` after a build.

`j` / `k` select headings and visible rows, wrapping at either end. `Space`
folds a heading or toggles a row's peek; `Enter` opens that row's full Command
Expand All @@ -216,12 +240,12 @@ beside the list on a wide screen or at the bottom of a phone.

For an exact older Command, `show` and `logs` also accept the absolute record
or Command-log path. The Console adds `::name` to a record path to distinguish
a dispatched Run from its enclosing Command. A retained Session-log path can
a dispatched Run from its enclosing Command. A retained Session-trace path can
select a historical Command without a record; `logs --session` accepts an exact
path from that Command's Session inventory as well as a session kind.
Page 6, `/logs`, lists every Command log and Session log in the current
Page 6, `/logs`, lists every Command log and Session trace in the current
`commands/` layout, including Security logs, and marks the live ones. Every
Command row links to its Run and Session logs, including child Ticket Runs.
Command row links to its Command logs and Session traces, including child Ticket Runs.
Older `sessions/` folders are not linked. The same inventory is available with
`thirdshift logs` or `thirdshift logs --json`; `thirdshift logs --file <id>`
reads an exact listed file and accepts `--follow`.
Expand All @@ -231,7 +255,7 @@ logs as its Console link; the inventory's `owners` field lists those exact IDs.
Command logs are plain text. Session traces from all six Harnesses render their
normalized messages, tool calls and results as conversations with folded tool
groups and Bash, Edit, Read and Grep views. Unfamiliar events stay visible as
plain raw lines. Older Claude and Codex Session logs retain their conversation
plain raw lines. Older Claude and Codex Session traces retain their conversation
rendering and collapsed thinking. A live reader uses its own SSE stream
to append escaped HTML from a byte offset. Reconnecting resumes from the last
event's byte offset; incomplete live lines wait until their newline arrives.
Expand Down
Loading
Loading