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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,7 @@ node_modules/
/.pnpm-store/
*.tsbuildinfo
/.storybook-build/

# The sample session's mapping holds the original names and paths it replaced: never commit one.
sample-session/*mapping*.json
sample-session/*.table.json
6 changes: 6 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ frontend/ # React sources, unit tests, Storybook stori
│ # (`test/golden/`: fixtures of record, never regenerated)
├── e2e/ # Playwright browser proofs, run on demand by `pnpm test:*:browser`; not required by CI or the pre-PR list
└── build/ dev/ # the packager and the contributor development supervisor
sample-session/ # the anonymized example session behind "Sample session (view only)"; not shipped
│ # (`example-session.jsonl`, `shaping.json`, its README). The page's fixture built from it
│ # is `frontend/src/sample/session.fixture.json`; `scripts/sanitize_session.py`,
│ # `shape_sample_session.py` and `build_sample_fixture.py` make both
scripts/frozen-page/ # the retired page's script parts, outside the plugin: the paused study
│ # binds their digest (`scripts/frozen_page.py` loads them); not shipped
compass-gemini/ # extension root: Gemini CLI (hooks only)
Expand Down Expand Up @@ -102,6 +106,8 @@ shipped skill body, lives in the `sync-docs` skill at `.claude/skills/sync-docs/
| `docs/design-frontend-migration.md` | The React frontend: its boundaries, the recorded answers it is held to, its deviations from the retired page and why, and the retired measurement method and its recorded figures. `scripts/frontend-migration.json` maps the retired page's parts, surfaces, routes, reader state and browser storage to owners and proofs; `scripts/frontend_inventory.py` checks that each row is owned and names proofs that exist. |
| `docs/design-reading-a-session.md` | **Canonical** record of the four rulings that govern what Compass may say about a session against the words a reader typed: the evidence floor and the reader-requested model overlay, whether an assessment may be stored, that Compass never writes into a session, and the seven-rule shape contract a reading must satisfy. The runtime cites its headings, because three of those rules are built into the producer rather than checked after it. |
| [docs/design-adapter-packaging.md](docs/design-adapter-packaging.md) | **Canonical** adapter admission and packaging contract: identity normalizers, hook-shaped mappings, and implementation-language boundaries. |
| `docs/design-sample-session.md` | **Canonical** record of the Sample session (view only): the reserved route, the second shell, the view-only guard, the numbered marks, and what was rejected. |
| `sample-session/README.md` | What the sample session is made from: what is real and what is authored, the one recorded exception to the transcript policy, the checks it passed, and how to regenerate it. User-facing by default. |
| `docs/design-*.md` | Durable design rationale, including alternatives that were tried and rejected. Each links to the architecture owner rather than repeating its module map. |
| `docs/plans/*.md` | Transient plans for unshipped work. Delete a plan once its work ships. |
| `docs/roadmap-burndown/README.md` | The Spacedock workflow the roadmap burndown runs on: its stages, gates, and the measured rules each one earned. Machinery rather than prose — entity state lives on an orphan branch and is gitignored. |
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,11 @@ A session opens under the tab you opened it from, and `Escape` returns there; a
under Sessions. Every other view's `Escape` returns to Sessions. The route lives in the URL fragment
so a reload or a pasted link comes back to the same view.

New to Intent and drift? Open "See a sample session (view only)" above the Sessions list: an
anonymized session that drifted, with its stored reading, the correction Compass composed and numbered
(i) marks that explain each part. Nothing in it is saved, sent or run.
[The design record](docs/design-sample-session.md) says how it works.

See [compass/skills/compass/SKILL.md](compass/skills/compass/SKILL.md) for data sources, session states, options, and troubleshooting.

## 4. Validation
Expand Down
12 changes: 12 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,18 @@ paths are tabled here.
| The answer to an ask | The option you chose, returned to the session that asked, which wrote the options. This is the only path by which what you do in Compass reaches a running session. | `--no-ask` | `test_http_api.AskEndpointTest.test_the_rollback_switch_answers_503_on_all_four_routes`; an answer outside the asker's options is refused: `test_asks.AskRegistryTest.test_answer_refuses_an_out_of_range_index` |
| The hand-off request | Not built. [Hand-off requests](#hand-off-requests-one-verb-into-a-session) states the one shape it may take. | Not applicable | None for the verb itself, because no code sends it. `test_launch_and_send_pins.ThePostRoutesAreTheListedOnesTest` pins the exact set of POST routes, so adding one fails a test and sends its author here. The journey test above adds a check for a Unix-domain socket connection, the path a hand-off would take, on the routes it calls only. |

### The sample session

The page ships one example session, an anonymized Claude Code session with a stored reading, so a new
reader can see what the Session page shows. It is static data bundled in the page and drawn over a
second shell with an in-memory server: it opens no connection, reads no session store, runs no model
and writes nothing, and its own fetch refuses every write with a 403. A press that would edit, save,
allow or run is held in the page before it reaches a handler. The transcript behind it is committed
under `sample-session/`, an exception to the policy against committed transcripts that the owner made
for this one session. It was anonymized by a script, checked for every original value, and reviewed
by readers who held only the anonymized file; the mapping that holds the originals is never committed
and `.gitignore` refuses a mapping file kept in `sample-session/`. [The design record](docs/design-sample-session.md) owns the decisions.

### What the tests do not see, and what a live capture would add

Every pin above runs against Compass's own code, with the call that would leave patched or watched.
Expand Down
3 changes: 3 additions & 0 deletions compass/skills/compass/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ license: Apache-2.0 AND OFL-1.1
Use Intent and drift to compare a session's recorded work with your goal. Open a session, set a
goal and press `Analyze drift`. The `How Intent and drift works` button explains the steps, the
reading's limits and why an expected outcome line is needed for a drift level.
New to it? `See a sample session (view only)`, above the Sessions list, opens an anonymized session
that drifted, with its stored reading, the correction Compass composed and numbered (i) marks that
explain each part. It is static page data: nothing in it is saved, sent or run.

Compass is an agnostic agent cartography and visualization tool: a local web dashboard mapping live coding-agent activity across **ten harnesses** on this machine — Claude Code, Codex, Pi, Gemini CLI, Antigravity CLI, GitHub Copilot CLI, OpenCode, Cursor CLI, Goose, Factory Droid — each row badged with its harness. A "Discovered harnesses" strip at the top shows all supported harnesses; ones with local session data are green/enabled, others gray/disabled. A harness's sessions only appear if its data is discovered. Transcript-backed sessions appear even if they never called TaskCreate; Claude task files may also surface a task-only session when its transcript is unavailable. Per session: a live state badge, what it's doing right now, running subagents (named pills), a current-turn elapsed/ETA estimate with progress bar, a ⚠️ warning (with tooltip) when a request runs or is estimated ≥15 min, one row per tracked task, and the recent token output rate. Fires desktop notifications when a session is blocked waiting on the human — Claude, Codex, Copilot, Cursor, OpenCode and Pi can report waits, within their stated coverage — and when any session registers a question through the ask lane. Sessions, Projects and Attention render the same data three ways — see Dashboard views below.

Expand Down
4 changes: 2 additions & 2 deletions compass/skills/compass/compass_runtime/web/react.html

Large diffs are not rendered by default.

74 changes: 63 additions & 11 deletions compass/skills/compass/compass_runtime/web/react.integrity.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"document": {
"bytes": 1731571,
"bytes": 1843467,
"file": "react.html",
"sha256": "97c4919d35f643d493f4d3552a25db6bf326138bbcfcecec63a9b17681254406"
"sha256": "b5a14fa8590b03b7e4929e8687484e1074474733678d4398d3331690ad7ac31a"
},
"format": 1,
"frontend": "react",
Expand Down Expand Up @@ -539,7 +539,7 @@
},
{
"file": "frontend/src/drift/DriftLevelView.tsx",
"sha256": "d32ae0e3d6a6f0b2e0ed97f61fdf1330ee6280306cdfa7ca8bac96a98fbfd546"
"sha256": "66754e587fb6470c290f378dd5e5eca14f6f70d3492c0bf09b66706bf21e642e"
},
{
"file": "frontend/src/drift/DriftProvider.tsx",
Expand All @@ -551,19 +551,19 @@
},
{
"file": "frontend/src/drift/ReadingControl.tsx",
"sha256": "82adf0533f09bd6e22deffef33c3cbb30b68cf3373b64ad1163ec420c0616360"
"sha256": "6298d3c688a300716c21240e59c4a1e13556f32a665e0fdb63f04837fa867b26"
},
{
"file": "frontend/src/drift/ReadingResult.tsx",
"sha256": "346ab8ec42f0b029588d3a4982c1b1551d9a271aa2981d84729fbce454534b9e"
"sha256": "4930beba198875ea8252cea4b547ca562bbd0d5c5fa84d36be62841b9dc5d4b4"
},
{
"file": "frontend/src/drift/ShowMore.tsx",
"sha256": "fda3710d60d0450f8e040038d0671dcc9b75a5cbefb850d9f57a94e490bdf8ee"
},
{
"file": "frontend/src/drift/SteerBack.tsx",
"sha256": "affc260fc432e15acf7878898ef92ceec23d109e92e8762fbe4b7916a6a23b4a"
"sha256": "520f5b09f48511c1f7db768c1a9bbe1a7d66c9fdf198153eddcf2c62d05d5e87"
},
{
"file": "frontend/src/drift/Why.tsx",
Expand Down Expand Up @@ -703,7 +703,7 @@
},
{
"file": "frontend/src/intent/IntentSection.tsx",
"sha256": "e78e2829dc28448bffa4b109b2e5cac15710997e70768b1209a230ac756a66ef"
"sha256": "0bb273802113de242fee2599e00846c6b1052689971a0c262a0555022d48d312"
},
{
"file": "frontend/src/intent/LiveMonitorSwitch.tsx",
Expand Down Expand Up @@ -989,6 +989,58 @@
"file": "frontend/src/router/testing.ts",
"sha256": "e11d235311c07e4a41aa9d86100e7a00fe3e5aaad0306a888ba66b6c4cabf25b"
},
{
"file": "frontend/src/sample/SampleInvite.tsx",
"sha256": "8d6766fe52eb68b6d670ae1a387cfafa95026d7411e4dbeae974440607134586"
},
{
"file": "frontend/src/sample/SampleMark.tsx",
"sha256": "ec83a7a617f62c040c1c2dfcc1eccfbfc47f1fb631db7c0124121fd89295fc1f"
},
{
"file": "frontend/src/sample/SampleSession.tsx",
"sha256": "603d7daefe10fbfcd769dd96354a7a0fcaf968ba328f1c6c2025fa4d011e28f9"
},
{
"file": "frontend/src/sample/ViewOnly.tsx",
"sha256": "22754b2236f139a7d1b097505f2eb54b3c4b7f75c1cc96da5831749e957ae9c8"
},
{
"file": "frontend/src/sample/fixture.ts",
"sha256": "e741ee6113f9fe544affedf70637ab7967c90e93904df2a4afb435dec3e1dbff"
},
{
"file": "frontend/src/sample/held.ts",
"sha256": "fbf9e8081de62ce63bd6ca3eeba8b81862932b56c00e2e084b49def92c09bf8d"
},
{
"file": "frontend/src/sample/ids.ts",
"sha256": "81cf8dc7d12f9530b5a883fbc901aa797b26344ade5d8b0b74e115dff3f4afd3"
},
{
"file": "frontend/src/sample/memoryBackend.ts",
"sha256": "f6fffafd50677779afb719866ba9aa8d7f3e751146b8fb78f6a0685182e9529b"
},
{
"file": "frontend/src/sample/sampleFetch.ts",
"sha256": "6e4f7d1a320226ddeab2a6241ae4b421d530837474b956f32e73884643d0f676"
},
{
"file": "frontend/src/sample/sampleShell.ts",
"sha256": "1f27944ca8663c907e612629224ba295299c785d53103a61a6df0aa7f2e88df0"
},
{
"file": "frontend/src/sample/session.fixture.json",
"sha256": "01129e1ff17953d86ecc5f7d73fa3e9adea69458561d29ec13d51d41233f4607"
},
{
"file": "frontend/src/sample/tour.ts",
"sha256": "0ae0ddf8798a22725e51507c032a79822c30fd5609e418d7f6eb3365e39f6a1b"
},
{
"file": "frontend/src/sample/tourContext.ts",
"sha256": "989e1e16bed482ebea71c66e6677149d921112da027449c480e2eb6d9ca94fd4"
},
{
"file": "frontend/src/sessions/AnswerBlock.tsx",
"sha256": "5d02659e35cdd715826f779ab27bd35937efc99a0dba2f2cea789054fbefffff"
Expand All @@ -1011,7 +1063,7 @@
},
{
"file": "frontend/src/sessions/SessionDetail.tsx",
"sha256": "eaa1defee80692984a4e6c703b4f992da0ad28ce5f80ea1e3248038c904de2da"
"sha256": "7527120ff3ddfcb1483d346d2d7769b4851cb48bba647322b9c857cff7055cc7"
},
{
"file": "frontend/src/sessions/SessionsView.tsx",
Expand Down Expand Up @@ -1095,7 +1147,7 @@
},
{
"file": "frontend/src/shell/createShell.ts",
"sha256": "6698165382da7eae1a87cb2d4bbb547918472e0bd7728320d79759171e6fa94b"
"sha256": "152a8ec1879499148072494394c0f41c40c2e12b0109f16646fb74660c0c9134"
},
{
"file": "frontend/src/shell/derive.ts",
Expand Down Expand Up @@ -1123,7 +1175,7 @@
},
{
"file": "frontend/src/shell/views.tsx",
"sha256": "4c214a6fa0dccc1bff08206d6ce4250564f43dc7a342082a7aa49a7ff36d4b66"
"sha256": "b72b36a6e06d5f8217956c38df6b71bf8522ae0e892195b241a5b3a463da8743"
},
{
"file": "frontend/src/steering/ProjectDecisions.tsx",
Expand Down Expand Up @@ -1243,7 +1295,7 @@
},
{
"file": "frontend/src/styles/tailwind.css",
"sha256": "70e20dc943fe0082c613ffe95fc6ba39273d046e89af5ebdd04e557aefa4fbd1"
"sha256": "a5c5690715a35bea8f604843ebfba24b821d5faed75d7b572ea7f96d7f9e7214"
},
{
"file": "frontend/src/terminal/TerminalSurface.tsx",
Expand Down
Loading
Loading