Investigation: Temporal command coherence: fleet, journal, timeline
Table of Contents
This page documents a formal historical record of an investigation into the compass commands that answer "what happened", "what is happening" and "what was I doing" — and a coherent model unifying them.
Context
While scoping the agile timeline story we noticed compass growing discrete commands that each capture a different slice of temporality:
fleet— what is everyone doing nowjournal— what was I doing (per-worktree session log)timeline(planned) — what was everyone doing, reviewed in detail
plus where/status (sprint in flight), sprint audit (state-drift
snapshot), sprint charts (historical aggregates) and review pending
(recent unattended PR threads). Each picks its own subject, time range,
data sources and output, with no shared vocabulary. Before implementing
timeline we stepped back to ask: is there one coherent model under these,
or are we accreting one-off reports?
Methodology
Read every temporal surface in projects/ores.compass/src/ (compass.py:
cmd_fleet, cmd_journal, cmd_where, cmd_sprint_audit,
cmd_sprint_charts, cmd_bearings; compass_review.py: _cmd_pending)
and ores-dashboard.el, recording for each: what it shows, data sources,
time scope, subject scope, output format. Classified each on two axes —
subject (me ↔ everyone) and time (now ↔ past) — then looked for the
gaps and overlaps.
Survey
What exists today, classified:
| Surface | Subject | Time | Sources | Output |
|---|---|---|---|---|
| fleet | everyone | now | .journal.org × worktrees, git, gh | table |
| journal where | me | now (last) | .journal.org | entry |
| journal log | me | past | .journal.org | entries |
| where / status | sprint | now | org docs, gh | list |
| sprint audit | sprint | now | org docs, gh | violations |
| sprint charts | everyone | past | git log, gh, sprint.org | CSV/PNG aggregates |
| review pending | everyone | recent | gh graphql, worktrees, org docs | grouped list |
| bearings | me+all | mixed | all of the above + env/db | panel |
| timeline (planned) | everyone | past | (to be decided) | curated buckets |
Two observations fall out:
The 2×2 grid is almost full. On the core axes (subject × time):
now past me journal where journal log everyone fleet timeline Timeline is not a new concept — it is the missing quadrant: journal log for the fleet. fleet : journal where :: timeline : journal log. The remaining surfaces are projections (where/audit are sprint-scoped "now" reports; charts are quantitative aggregates over the same past).
- Journals are the live substrate but not a consistent one. fleet
reads each worktree's
.journal.org(plus git branch and gh PR state) — fine for a now view, where approximation is acceptable and liveness matters. They are unsuitable for the timeline: journals are per-worktree files that never merge to main, so an environment doing a fresh checkout cannot see them, and their content is only as good as each session's bookkeeping. The timeline must be reproducible from consistent data: what is on origin/main — the agile documents and their git history — plus the PR record on GitHub. Same grid, two substrates: live-and-approximate for now-views, merged-and-consistent for past-views.
Conclusions
- One model, two substrates: a stream of events — (when,
environment, document, transition, refs). Now-views (
fleet,journal where) read the live substrate: per-worktree journals, branch and PR state — approximate but immediate. Past-views (timeline,sprint charts) must read the consistent substrate: the agile documents on origin/main and their git history, plus the GitHub PR record — so that any environment, from a fresh checkout of main, reconstructs the same timeline. Journals are never an input to the timeline.journal where/log— me; live substrate.fleet— everyone × now; live substrate.timeline generate— everyone × past; consistent substrate: state transitions mined fromgit logoverdoc/agile/, PR events from gh, attribution from the environment stamps in the documents.timeline show— render the curated snapshots.sprint charts— counts over the same consistent substrate.
- Snapshots are materialised views. The
timeline/folder is a cache of LLM-curated narrative over raw events — needed because raw events are too noisy to scan and curation is expensive, so it runs once per bucket and is stored as org (hence flows into graphdata.json for the site). - Environment attribution requires the document stamp. Because journals are out, the environment-stamp task is the timeline's only attribution mechanism: stories/tasks must record which environment started/worked them, merged to main with everything else.
- Each snapshot carries an audit section. Building a bucket from consistent data is exactly the moment to notice bookkeeping that has gone astray (sprint-audit-style findings scoped to the window: states not updated, missing stamps, PRs merged without close-out). The snapshot reports drift instead of silently narrating around it.
Recommendations
- Implement
compass timelineas defined in the story: generate assembles the event stream for a window from the consistent substrate only —git logoverdoc/agile/on origin/main (state transitions, new documents) joined with gh PR events and the in-document environment stamps; show renders the last N snapshots from the sprint'stimeline/folder. Generate must produce identical output from any fresh checkout of main. - Sequence the environment-stamp task before the snapshot skill — it is the attribution mechanism, not a nice-to-have.
- Include an audit section in every snapshot: window-scoped bookkeeping drift (states not updated, missing stamps, merged-but-open tasks), reusing the sprint audit checks.
- Extract a shared
compass_eventsmodule for the consistent substrate;timeline generateandsprint chartsare its consumers.fleetstays on the live substrate by design. - Document the 2×2 grid and the two-substrate rule in the compass component overview so future temporal features are placed on the grid rather than added beside it (done as part of this investigation).
- Bucket sizing stays an experiment per the story decision — event-count-capped windows fit naturally over an event stream.
Recommendations
(Suggest the next steps or new architectural approaches based on these findings. Focus on the high-level strategy rather than implementation-level detail. Identify any follow-up tasks or stories that should be created.)
See also
- Story: Agile timeline: bucketed summaries of recent activity
- Task: Analyse temporal commands end-to-end for conceptual coherence
- https://github.com/OreStudio/OreStudio/blob/main/projects/ores.compass/src/compass.py — fleet, journal, where, sprint, bearings.
- https://github.com/OreStudio/OreStudio/blob/main/projects/ores.compass/src/compass_review.py — review pending.