How it works
Conventions, not configuration
sitrep is a state layer on top of the markdown your AI agents already generate. It does not define a format - it recognizes the shapes that agents and humans already use, and turns them into cross-project state.
1. Indexing: from a disk to a corpus
You point sitrep at the folders where your projects live. That is the whole setup. There is no import step, no vault, and nothing is copied or moved - it reads your files where they are.
Real workspaces are mostly noise, and not just node_modules and build output: the bulk is machine-shaped markdown that real work accumulates - issue-tracker exports, archived records, vendored docs, files that are markdown only in extension. An exclusion engine separates project documents from all of that - in the corpus sitrep is developed against, roughly 54,900 markdown files narrow to about 730 real docs. What counts as a doc is visible and adjustable, not a black box.
Watching uses kernel file events, never a directory walk, so startup is instant and steady-state work is proportional to what changed - not to how big your corpus is. Editors that save atomically (write a temp file, rename it over the target) are handled; the document updates even though the file system never reported its name.
2. Extraction: the conventions it reads
Agent-written project docs converge on a handful of shapes. sitrep parses those shapes - and only those - into structured state:
- Status lines
- A line like
**Status (2026-08-08):** waiting on reviewbecomes the document's dated status. The vocabulary that maps wording to states (active, blocked, done, ...) is editable data in Settings, never a demand on your files. - Phase headings
- Headings shaped like
## Phase 2 (SHIPPED)become a progress meter per document - which phases exist, which shipped, which are in progress. - Decisions and rulings
- Two shapes only: a list item under a decision/ruling/ADR heading, or a row of a table with a verdict column (
Question | Verdict | Why). Each ruling is tracked as open, blocked, decided or superseded - so "what is still waiting on a decision" is a query, not a re-read. Scanning prose for decision-shaped sentences invents findings, so sitrep deliberately does not. - Due dates
- Convention-shaped due lines surface upcoming and overdue items in the overview.
- What it deliberately ignores
- Checkboxes are QA sign-off in real corpora, not progress - nearly every checklist reads zero ticked, and counting them reports healthy projects as abandoned. Git history is a tag, not the timeline - in a real corpus over a quarter of project docs are gitignored, untracked or dirty, and those are disproportionately the in-progress work. sitrep classifies from the documents themselves.
3. The overview: an email client for project state
The reading surface is deliberately shaped like an email client, not a file tree: newest activity first, pending items surfaced, filters as removable chips. Across every project at once you see what moved, what is stalled, what is waiting on a decision, and what the docs claim beside when they last changed.
Opening a document gives full reading fidelity - GitHub-flavored markdown, syntax-highlighted code with copy buttons, Mermaid diagrams rendered offline and theme-aware, KaTeX, callouts, fast on multi-thousand-line files. Rendering is a floor sitrep meets, not the product it sells.
And nothing takes the page away from you: when a watched file changes, the open document refreshes in place, scroll re-anchored; reload restores your position; Esc peels one layer at a time.
4. Staleness: when the docs lie
The nastiest failure mode of agent-written docs is drift: the agent patches code without updating the plan, and a confident document describes a reality that no longer exists. A stale plan looks exactly like a current one - until something compares the claim against what actually moved. That comparison is what sitrep does.
A document claims work is happening when it carries an active dated status (in progress, planned, blocked) or a phase list that has started but not finished. For every claiming doc, sitrep asks four questions, strongest first, and the first "yes" wins:
- Dead claim
- Has the doc's entire project been silent for over two months while the doc still claims activity? Nobody is doing this work, whatever the document says.
- Plan adrift
- Is this a plan whose own step documents kept moving while the plan stood still? A session told to "update the docs" updates the six files it was pointed at and never revisits the master plan that links them - sitrep follows those links and catches the master the moment its children move two weeks past it.
- Left behind
- Is the project actively moving while this doc sits untouched for over a month? The repo outgrew the plan - this is the drift case.
- Stale claim
- Is the claim's own date more than a week old? The status line needs re-asserting - quiet metadata, not an alarm.
The badge always shows the number that tripped it - "left behind 40d" means your project moved 40 days past this document. And the signal is computed fresh at the moment you ask, never stored, so the staleness flag is the one thing in the system that cannot itself go stale.
The thresholds were measured, not guessed: every flag was read against the real development corpus before the feature shipped, and the intuitive two-week drift threshold would have flagged half of everything - so it is thirty days, a line at which the reviewed false-positive rate on the live corpus was zero. When sitrep is not sure, it stays quiet: a missed stale doc is invisible, but a false "this doc lies" would poison the one promise the feature makes. And because projects have rhythms, the thresholds are settings, not constants: global, per-workspace and per-project granularity, the most specific value winning, your deviations stored as data while the measured defaults stay in code. A fast-moving project can call three days stale while a quarterly one is fine at ninety - and since staleness is computed at read time, a changed threshold is true on the next view, no reindex.
5. The one writing surface
sitrep is a reader with exactly one, narrow writing surface: three convention-shaped operations - set a status, set a due date, mark a ruling superseded - each writing a single line in the document's own convention, behind a server-side preview and a content-hash guard that refuses to touch a file that changed since you looked at it.
No other code path writes to your documents. Sorting, filtering, hidden columns and saved views are local view state with export - they never touch the file. This is a product-level covenant, not an implementation detail.
6. Why you can trust the numbers
Every extraction rule ships only after being measured against the real development corpus - if a heuristic would misread the corpus, it does not ship. Every UI behaviour is verified by driving the real app in headless Chrome: contrast in both themes, scroll restoration, live refresh, the lot. A claim that cannot be measured is not made.