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
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Review the TypeScript/CSS sources; these bundles retain dependency string bytes.
rightmemory/web/static/pursuit-map.js linguist-generated=true -whitespace
rightmemory/web/static/pursuit-map.css linguist-generated=true
25 changes: 25 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,31 @@ jobs:
python-version: "3.11"
cache: pip

- name: Set up Node on Linux
if: runner.os == 'Linux'
uses: actions/setup-node@v7
with:
node-version: "24"
cache: npm
cache-dependency-path: rightmemory/web/frontend/package-lock.json

- name: Check frontend
if: runner.os == 'Linux'
working-directory: rightmemory/web/frontend
run: |
npm ci
npm run typecheck
npm test
npm run build

- name: Verify committed frontend bundles
if: runner.os == 'Linux'
run: |
git diff --exit-code -- \
rightmemory/web/static/pursuit-map.js \
rightmemory/web/static/pursuit-map.css \
rightmemory/web/static/pursuit-map.LICENSE.txt

- name: Install ripgrep on Linux
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y ripgrep
Expand Down
33 changes: 33 additions & 0 deletions DESIGN_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# RightMemory Design Notes

## Human-Owned Pursuit Map

### Ownership follows the kind of state

Memory preserves reusable context, and Update can judge whether new evidence improves that context. A Pursuit records a different decision: which directions the user wants to keep visible and how to group them. Task progress cannot reliably establish that decision. Keeping those judgments separate prevents incomplete work, transient blockers, and completed experiments from accumulating as a task ledger inside the map.

The human editor and explicitly requested `maintain-pursuit-map` workflow own semantic map changes. Other agents may use the map to understand the user's directions without acquiring authority to reorganize them. Update's bounded tools and accepted write surface enforce this distinction in code. Sync still reconciles already-authorized map state, because safe transport needs the complete graph rather than a second ownership model.

### The tree carries meaning without task fields

A title, ancestry, and optional Markdown note are enough to describe a direction. A shared ancestor can establish a project's starting document or repository without adding fixed project, person, or file fields. Existing graph edges represent real relationships when tree placement is insufficient. Reusable context remains ordinary Memory, and execution detail remains in project artifacts.

Completion is a user decision to remove a direction after considering any independently durable consequence. Git supplies the earlier state. A completed-status collection would turn the map into a work log, while a natural branch such as “Later” already expresses a direction the user wants to retain.

### The visual map is a view of Markdown

`PURSUITS.md` and reachable `PURSUIT_<id>.md` files remain authoritative. The logical tree comes from the canonical graph index, so retrieval, validation, sync, and editing agree about identity and ancestry. There is no second Pursuit database or task registry.

The canvas hides physical heading depth. When a deeper logical branch needs a file boundary, `F#` continues that hierarchy in a detail file. Existing boundaries stay stable to avoid unrelated rewrites. Pan, zoom, folding, and selection belong to browser-local view state and do not alter semantic Markdown.

### A confirmed interaction is the transaction boundary

Typing and pointer movement are local editing activity. Confirming a rename, structural move, note, deletion, or Focus change creates the candidate state. The store checks the expected revision, validates the complete candidate graph, and lands it only while the active root still matches the captured state. Failure leaves the active root unchanged.

This allows immediate canvas editing while preserving an inspectable Git change. Undo and redo create compensating commits and reject stale history; they do not reset the shared branch. Deletion can repair incoming typed edges in Memory, but that mechanical repair is not authority to rewrite Memory meaning.

### Existing data remains readable

Old Pursuit field blocks are retained as body text so existing roots can open before a separate, explicitly approved cleanup. Their old action labels have no current control semantics. This is a narrow reading accommodation, not a second schema or an automatic migration. Installing or opening the editor does not rewrite a user's root.

The [Pursuit rules](rightmemory/reference/PURSUIT_RULES.md) own semantic meaning; the [schema](rightmemory/reference/rightmemory-schema.md) owns representation; the [Pursuit Map guide](docs/PURSUIT_MAP.md) covers use and implementation entry points.
24 changes: 9 additions & 15 deletions PURSUITS.example.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,21 @@
> This starter template is copied into a new RightMemory root during bootstrap.
> Replace the example Pursuit with live intent that should shape later work, and do not
> treat it as user state. <!-- rightmemory:pursuit-example:start -->
> Replace the example through the map editor or an explicit map-maintenance request.
> It is illustrative, not user state. <!-- rightmemory:pursuit-example:start -->

# Pursuits

## Focus

No Pursuit is focused yet.
## Example Application {#sample-pursuit-application}

## Example Release Readiness {#sample-pursuit-release-readiness}
Work starts from the application's repository and its current design document.
The user decides which directions belong in this map. Detailed implementation,
experiments, and test results stay in the repository.

Make the example application's current `staging` candidate ready for an intentional
release to `production`. This sample keeps only the objective and current direction;
detailed test output, commands, and execution history belong in project-local
artifacts.
### Release Confidence {#sample-pursuit-release-confidence}

**State:** The candidate is deployed to `staging`; its release criteria still need
verification. `production` has not been changed.
Understand what makes a release safe and useful to the people using the application.

**Next:**
- `ask` Decide which observable checks define release readiness for the `staging` candidate.

**Done when:** Current evidence supports an explicit release or no-release decision
for moving the candidate to `production`.
### Simpler Onboarding {#sample-pursuit-onboarding}

<!-- rightmemory:pursuit-example:end -->
Loading