Skip to content

Release 0.4.0: notes that file themselves, checked end to end, with or without AI - #162

Merged
Braydenh563 merged 1579 commits into
mainfrom
claude/notes-flow-rebuild
Oct 6, 2026
Merged

Braydenh563 merged 1579 commits into
mainfrom
claude/notes-flow-rebuild

Conversation

@Braydenh563

@Braydenh563 Braydenh563 commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

What & why

Release 0.4.0. This branch started as the notes-flow rebuild (INBOX 432: creating, filing, sorting and managing notes) after 0.3.32 shipped with note capture and filing broken, and grew into a full release round: every main feature checked end to end, polish, security hardening, packaging, docs and a new landing site. The release highlights are the ## [0.4.0] section of CHANGELOG.md; in short:

  • Capture and filing, checked end to end. A note typed in Capture is saved, filed and findable after a reload, with or without a model. 49 Playwright browser tests (tests-e2e/) now run in CI on every push; the same specs fail 20 of 45 against v0.3.32.
  • Works fully with no AI model. Filing by the notebook's own words (now also files on a clear lead), search, Ask with cited sources, reminders from plain words; a crawl of 187 controls across 11 surfaces found no dead button, error or endless spinner.
  • Trustworthy filing certainty. A model's pick never reads 100%, drops when the notebook's words disagree or the category is small, and offers other categories when unsure.
  • Nothing lost. Unsaved note and document edits survive a reload or closed window and are offered back; expected situations show a plain notice, real faults keep "Report this".
  • Mind maps and boards. A real hierarchy by default with four looks and per-level styles, an emoji and icon library (1,530 icons, 476 emoji) as stickers and in the editors, drag to delete with Undo, links that follow a turning item, a fixed map rail and curve undo.
  • Interface. The Writing room, chat progress phases, refreshed Atlas avatars and AI-off status, Interface animations (with its own switch), editor current-line highlight and whole-line copy/cut, a rendered Back/Forward list, opaque timeline headers, phone width fixes.
  • Security. HTTPS for other devices, password rules, private notes kept out of answers, backups and the index, consent before any update check, ReDoS fixes in imports and agent mode, release workflow input injection fixed.
  • Windows. Installer and packaged app audited (17 fixes plus 4 follow-ups); CI builds, installs, upgrades over the last release and uninstalls on every push.
  • Docs and site. A static GitHub Pages landing page, fresh README screenshots, a shorter README top, and a correctness pass over every user and contributor document.

Moved to the next PR, at the top of docs/ROADMAP.md: OneNote ideas and the meeting notes redesign, the code editor to VS Code standard, and the rest of the Coggle, Miro, Illustrator and Photoshop ideas.

How to test

  1. PYTHONPATH=src python -m uvicorn memorymap.api.app:create_app --factory --port 8000, open it, set a password.
  2. With no model configured: write a few notes in Capture (one per topic), reload, and check each is filed, tagged and searchable; ask a question in Ask and open a cited source.
  3. Edit a note and a document, reload before saving, and accept "Put them back".
  4. Open a mind map: central topic and branches styled by level; add an icon from the picker; drag a topic onto the delete target, then Ctrl+Z.
  5. Settings, Appearance: toggle Interface animations; switch tabs and watch the indicator.
  6. Automated: python -m pytest -n auto tests/, cd tests-e2e && npm ci && npx playwright test.

Checklist

  • pytest passes locally (the suite is fully offline, no Ollama needed): full suite run on the release head, and CI green on every job
  • ruff check . is clean
  • Docs updated if behaviour changed (README, INSTALL, MODELS, PRIVACY, TROUBLESHOOTING, ARCHITECTURE, CONTRIBUTING, DESIGN, the landing page)
  • Stayed offline-first: no new code path sends user data off the machine; the update check asks first and nothing touches the network before

Notes for the reviewer

  • Measured in headless Chromium, not observed on real hardware: the desktop (WebView2) window, real touch screens and Safari or Firefox for the landing page. The Windows installer is exercised in CI only.
  • Filing with a real model was measured once with a small local model (Qwen2.5 1.5B: 9 of 10 notes right); the certainty calibration factors are reasoned, not fitted to many models.
  • Open, none blocking (docs/roadmap/agent-remaining/final-scan-1006.md): four slow regexes reachable only from the user's own notes or a model reply, Python 3.13 CI at 16 of its 25 minute timeout, the Linux release job's smoke test being lighter than the Windows one, and a raw error string in the Background jobs list.
  • After merging: tag v0.4.0 on main; release.yml builds and publishes from the CHANGELOG section.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17

Comment thread tests/test_category_space_integrity.py Fixed
Comment thread src/memorymap/search/search_manager.py Fixed

Copy link
Copy Markdown
Owner Author

The github-advanced-security check fails on every head since c2777c3, and the cause is outside this PR. Its job is the Copilot code-scanning agent ("autofind"). It stops about 6 seconds in with SessionModelError: You have exceeded your monthly quota (HTTP 402, errorCode: quota), before it reads any code. For example, see job 111192354377 on f97fe55. A re-run would hit the same quota, so I have not re-run it. It should pass once the account's Copilot quota resets or is raised.

The CodeQL analysis itself (Analyze (python) and the CodeQL alerts check) is separate. Its one open alert on this PR, 443 (polynomial regex in search_manager.py), is fixed in 1558c50, with a test that times the pattern on 20,000 tabs.


Generated by Claude Code

Comment thread src/memorymap/search/websearch.py Fixed
Comment thread src/memorymap/search/search_manager.py Fixed
Comment thread src/memorymap/ai/model_cards.py Fixed
Comment thread scratchpad/fake_ollama_server.py Fixed
Comment thread scratchpad/fake_ollama_server.py Fixed
Comment thread scratchpad/fake_ollama_server.py Fixed
Comment thread src/memorymap/core/hardware.py Fixed
Comment thread src/memorymap/core/hardware.py Fixed
Comment thread src/memorymap/core/hardware.py Fixed
Comment thread tests/test_job_runs.py Fixed
Comment thread tests/test_job_runs.py Fixed
Comment thread scratchpad/help_inventory.py Fixed
Comment thread scratchpad/help_inventory.py Fixed
Comment thread scratchpad/help_inventory.py Fixed
Comment thread scratchpad/ui-sweeps/pickercmp.py Fixed
Comment thread scratchpad/ui-sweeps/pickercmp.py Fixed
Comment thread scratchpad/ui-sweeps/popupcmp.py Fixed
Comment thread scratchpad/ui-sweeps/popuptab.py Fixed
Comment thread src/memorymap/api/app.py Fixed
Comment thread tests/test_companion_motion.py Fixed
Comment thread scratchpad/ui-sweeps/badgealign.py Fixed
Comment thread src/memorymap/api/routes_models.py Fixed
Comment thread scratchpad/ui-sweeps/timelinetune-sum.py Fixed
Comment thread src/memorymap/entry/query.py Fixed
Comment thread tests/test_note_properties_kg4.py Fixed
Comment thread tests/test_note_properties_kg4.py Fixed
Comment thread tests/test_relation_types_kg3.py Fixed
Comment thread tests/test_relation_types_kg3.py Fixed
Comment thread src/memorymap/api/routes_entries.py Fixed
Comment thread src/memorymap/api/routes_properties.py Fixed
Comment thread src/memorymap/core/database.py Fixed
Comment thread tests/test_model_json_deep_nesting.py Fixed
Comment thread src/memorymap/core/egress.py Fixed
Comment thread src/memorymap/core/egress.py Fixed
Comment thread src/memorymap/core/egress.py Fixed
Comment thread src/memorymap/core/jobstore.py Fixed
Comment thread src/memorymap/core/jobstore.py Fixed
Comment thread src/memorymap/core/jobstore.py Fixed
Comment thread src/memorymap/__main__.py Fixed
Comment thread tests/test_recycle_bin.py Fixed
Comment thread tests/test_recycle_bin.py Fixed
Comment thread src/memorymap/ai/provider.py Fixed
Comment thread src/memorymap/ai/provider.py Fixed
Comment thread src/memorymap/api/routes_auth.py Fixed
Comment thread tests/test_entries_by_ids.py Fixed
Comment thread tests/test_undo_deletes_1005.py Fixed
Comment thread src/memorymap/ai/when.py Fixed
Comment thread src/memorymap/ai/when.py Fixed
Comment thread src/memorymap/__main__.py Fixed
Comment thread tests/test_usage_ledger.py Fixed
Comment thread src/memorymap/core/usage.py Fixed
Comment thread src/memorymap/api/routes_board_library.py Fixed
Comment thread src/memorymap/ai/ollama_client.py Fixed
Comment thread tests/test_api_contract_b7.py Fixed
Comment thread tests/test_prefs_module.py Fixed
Comment thread tests/test_store_module.py Fixed
Comment thread src/memorymap/ai/tools/contracts.py Fixed
Comment thread src/memorymap/ai/tools/contracts.py Fixed
Comment thread src/memorymap/ai/skill_folder.py Fixed
Comment thread src/memorymap/ai/when.py Fixed
Comment thread tests/test_reminder_targets_15.py Fixed
Comment thread src/memorymap/ai/notebook_stats.py Fixed
Comment thread src/memorymap/ai/stat_charts.py Fixed
Comment thread tests/test_tidy_categories_17.py Fixed
Comment thread tests/test_bin_documents_reminders_row30.py Fixed
Comment thread tests/test_bin_documents_reminders_row30.py Fixed
Comment thread tests/test_bin_documents_reminders_row30.py Fixed
Comment thread tests/test_bin_documents_reminders_row30.py Fixed
Comment thread tests/test_bin_documents_reminders_row30.py Fixed
Comment thread tests/test_one_download_helper.py Fixed
Comment thread tests/test_search_surfaces.py Fixed
Comment thread src/memorymap/core/extras.py Fixed
Comment thread tests/test_extras_bundles.py Fixed
Comment thread tests/test_storage_footprint.py Fixed
Comment thread src/memorymap/core/extras.py Fixed
Comment thread src/memorymap/core/extras.py Fixed
…tatus takes a second argument, edge pan pauses over the delete target

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
Comment thread tests/test_docs_site.py Fixed
claude and others added 25 commits October 6, 2026 03:34
…out closing tags (CodeQL bad HTML filtering regexp)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…e list over Save either; the note form marks the field until the next key or press

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…e tag list fixes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…es on (CodeQL bad HTML filtering regexp, second form)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
… small categories

A small model's own number is not a probability (dentist note filed under
Work as 100% sure). Low-certainty picks now offer the other categories.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
Five quadratic regexes (py/polynomial-redos) on uploaded exports, 2-10 s on 20-180 KB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
… by you

Composer, graph popup, help topic, is:review help, README, CHANGELOGs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
109 error toasts for normal situations now pass "info"; a 4xx refusal shows
plain through toast.refused. tests/test_error_toasts.py pins them.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…hen a stray word splits the share; E2E's focaccia note stayed Uncategorised in CI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…w-rebuild

# Conflicts:
#	CHANGELOG.md
#	docs/CHANGELOG.md
py/polynomial-redos on the chat path: 64,000 chars of a.a. took 61 s, now under 0.5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…last, gate.sh stops naming the deleted touchticks sweep

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
Comments only (provider lenient JSON, agent tool_choice fallback).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
int(1e999) raised OverflowError past _clean_theme/_clean_levels (read on every map open).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…Hub's cap

The awk range ended on its own header (notes always empty); 0.4.0's 278 KB would then fail the 125,000-char body cap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…ed into it

${{ inputs.version }} inside run: is Actions script injection; a test holds every run block to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…tamp; CHANGELOG [0.4.0] - 2026-10-06 with Highlights; HANDOVER Now line

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
…with the full feature list folded into sections

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UvMLdXt2CL6M5pkTvwyV17
@Braydenh563 Braydenh563 changed the title Notes flow: creating, filing, sorting and managing notes (INBOX 432) Release 0.4.0: notes that file themselves, checked end to end, with or without AI Oct 6, 2026
@Braydenh563
Braydenh563 merged commit 872e3f4 into main Oct 6, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants