Repository navigation
Conversation
There was a problem hiding this comment.
CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.
XrxcGH
added a commit
that referenced
this pull request
Oct 4, 2026
Rewrite the status text around pull request #16 and the hand tests still pending. List what the app does by area, each with its help page, and show six real screenshots. Add a Try the beta section (build, SmartScreen, a throwaway profile, the hand test checklist), refresh the repository map with the strings, help, screens, and testing folders, and add the new docs to the documentation table. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
CI's checks on the pull request raised what the lane's own files owed: the bridge had grown past the 800-line limit, rustfmt wanted eight of the lane's files reflowed, and seven comments were too long or missed a serial comma. The constants, the door, the guard, the holder and the watchdog now live in core_bridge/held.rs, which reads as one thing: how a command takes the core, how long it waits, and who says when one holds it too long. The bridge keeps the commands. The lane's files are formatted as CI's rustfmt wants them, and the comments say the same in shorter sentences. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
moveSlide answers -1 on a deck with no slides, which showed "0 / 1" in the player. Clamp the index at 0 (T1-10). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A long link or folder path widened the grid past the dialog edge, giving a horizontal scroll bar and clipped buttons. Let the column shrink and break anywhere (T3-7). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The equation panel's buttons were reachable only by mouse. Ctrl+K now has Simplify and Solve for the selected, preceding or last-edited equation. UI tests cover the panel being hit-testable, Tab reaching its buttons, typed $x$ and $$x$$ rules, and currency staying text. The checklist and help now say there is no choice column type; Board groups repeating text. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A stale window could resurrect a deck deleted in another window, and review history was overwritten between windows. Deletions are now remembered, reviews merge with saved history and sync on storage events, and decks plus history are mirrored into the profile's qol.json and restored when web view storage is empty. Generating with no cards kept no longer leaves an empty deck. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…cape Drop a palm-sized touch's click however long it rested while the pen was in use; ask to turn handwriting on when the writing pen is chosen so no stroke meets the dialog; log deep-link launches; narrow multi-line right-click to the clicked line for link and tag commands; close Properties on Escape anywhere. Add tests for each and document that fingers beside the writing hand are held. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Convert four CRLF files to LF, wrap the density comment under the line limit, and keep the ImportDialog waiver the earlier commit dropped. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
drop_moved_removals now has tests for a move to an earlier and to a later notebook. A canceled pen contact no longer leaves its start point in the sheet-add map, the stale palm-settings comment is corrected, and a compact app bar test covers a resize from a wide layout. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Every window was built without a navigation handler, so a file dropped outside a page made the WebView load file:// and replace the app. Windows now refuse any address that isn't the app's own, and the page cancels the browser's file-drop handling. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The migration moved the snapshot into the backup before any notebook existed, so a stop part way lost the tree. It now copies it, keeps a marker naming the backup and each notebook made, and runs again from the backup at the next start. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Restore moved the library entry back before the notebook opened, so a missing folder dropped the item from Trash and left a ghost entry. The entry now goes back to Trash when the open fails. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The scheduled backup called the exit flush, which closed every journal, wrote exit versions and marked the device stopped while the app ran. Core::save_all saves dirty pages and leaves those alone. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Only page.json was watched. An edited page.md is now noticed (also when the page opens), planned against the page, and offered as 'Bring in the text', applied as one undo step. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Naming a notebook with no sections right after making it left its folder as Untitled notebook. The folder is renamed to the title, and the library entry follows. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Cover a restore whose folder is gone (it stays in Trash) and a new notebook named right after it was made. Also apply rustfmt to a connectors line an earlier commit left unformatted. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…cuts An image whose blob could not be read never counted as a failure, so the media indexer retried it every 10 s forever. It now counts like an empty OCR read and stops after 3. Adds tests for Ctrl+N/T/Alt+Shift+N with the caret in page text and for Pin page, and trims comments that tripped the length checks. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Split export_tables into collect and plan steps, wrap over-long lines and one long sentence, and fix a serial comma, so checks/cli.ts reports 0 errors against origin/beta. No behavior change. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
snapshotPage read each text block's markdown from the layer, which holds the last acknowledged copy, so a slide deck or export made right after typing came out empty or stale. Read the live text from the block view and test it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A short edit session left Page history empty because the first-edit version was only kept when another device wrote the page. Keep it always, so there is something to restore; tests cover it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Covers the T2-7 fix that let new-page shortcuts fire from text. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…gain A second export of the same page, format and folder made "name (2).docx" because only the Update button passed the recorded copy path as the file to replace. Export now looks up the recorded copy and replaces it. Also add the freeform page test for slides, which the stale-text fix already makes pass. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The decode path printed TIMING lines to stderr on every window; they were left over from tuning and are gone, and the attention loop is split into a helper. The hub now has submit, cancel and update tests, a file name in them that does not name the process (the no-network source check bans that), and check_language and corrected_lines are exported for the cloud job to share the same vocabulary handling. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Setup's Custom step offers, for each smart feature, this device or a cloud service with the person's own key. Keys stay in Credential Manager, the Privacy panel lists what is sent where, and Recommended claims transcription only when an engine exists. A cloud transcription or summary waits while Work offline is on. Also fixes the transcribe command's lifetime so the app crate compiles, and adds a test for the smart features step. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # Cargo.lock # app/src-tauri/src/core_bridge.rs # app/src-tauri/src/lib.rs # app/src/features/integrations/flags.ts # app/src/features/search/deeplink/install.ts # docs/FEATURES.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # app/src-tauri/Cargo.toml # app/src-tauri/src/core_bridge.rs # app/src-tauri/src/notes/mod.rs # app/src-tauri/src/notes/tests.rs # app/src-tauri/src/notes/trash.rs # app/src-tauri/src/notes/tree.rs # app/src-tauri/src/shellqol/external.rs # app/src-tauri/src/shellqol/mod.rs # app/src/features/page/registrations/qolStudy.ts # app/src/features/qol/ExternalNotice.tsx # app/src/features/qol/externalStore.ts # app/src/features/study/deck/library.ts # app/src/services/notes/types.ts # crates/core/src/format/readable.rs # crates/core/src/session/notes.rs # crates/core/tests/history_parts.rs # crates/core/tests/session_external.rs # docs/FEATURES.md # docs/adr/README.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # app/src-tauri/src/interop/commands.rs # app/src/features/intel/background/imageText.ts # app/src/features/interop/ImportDialog.tsx # app/src/features/interop/text.ts # app/src/strings/en/index.ts # crates/interop/src/import/sheet.rs # docs/FEATURES.md # docs/help/import-and-export.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # .github/workflows/release.yml # app/src-tauri/Cargo.toml # app/src-tauri/src/command_list.rs # app/src-tauri/src/intel/models.rs # app/src/editor/extensions/math.ts # app/src/features/intel/index.ts # app/src/features/intel/lifecycle.ts # app/src/features/intel/meaning/engine.ts # app/src/features/page/blocks/blocks.module.css # app/src/features/page/index.ts # app/src/features/search/media/indexer.ts # app/src/platform/intel.ts # app/src/services/intel/ext.ts # app/src/services/intel/extFake.ts # app/src/services/intel/fake.ts # app/src/strings/en/index.ts # checks.config.json # docs/FEATURES.md # docs/help/on-device-intelligence.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # app/src/features/ink/flags.ts # app/src/features/ink/view/gridTable.ts # app/src/features/page/chrome/menu.ts # app/src/strings/en/ink.ts # crates/search/tests/model.rs # docs/FEATURES.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # .gitignore # app/src-tauri/capabilities/default.json # app/src-tauri/src/command_list.rs # app/src-tauri/src/lib.rs # app/src/features/interop/ImportDialog.tsx # app/src/features/interop/index.ts # app/src/features/pages/index.ts # app/src/features/tools/index.ts # app/src/features/tools/ui/UpcomingTool.tsx # app/src/strings/en/index.ts # docs/FEATURES.md # docs/help/import-and-export.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # app/src-tauri/src/lib.rs # app/src-tauri/src/page_extras/attach.rs # app/src/features/interop/ExportDialog.tsx # app/src/features/interop/register.ts # app/src/features/page/attachments/saveBack.ts # app/src/features/page/index.ts # app/src/features/pages/index.ts # app/src/features/search/deeplink/install.ts # app/src/features/search/index.ts # app/src/features/tree/TreeRow.tsx # app/src/features/tree/qolActions.ts # app/src/platform/tauri/invoke.ts # app/src/platform/tauri/pageExtras.ts # app/src/platform/types.ts # app/src/platform/web/pageExtras.ts # crates/search/tests/model.rs # docs/FEATURES.md # docs/help/typed-notes.md # tests/ui/behavior/search.spec.ts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # app/src-tauri/src/tool_windows.rs # app/src/features/diagnostics/PrivacySection.tsx # app/src/features/page/index.ts # app/src/features/pages/export/blocks.ts # app/src/features/pages/index.ts # app/src/features/pages/ui/exportCommands.tsx # app/src/features/tools/index.ts # app/src/features/tools/ui/TimersTool.tsx # app/src/features/tools/ui/UpcomingTool.tsx # app/src/features/tools/ui/upcomingStores.ts # docs/FEATURES.md # docs/help/study-tools.md # tests/ui/behavior/privacy.spec.ts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # .gitignore # app/src-tauri/src/updater/worker.rs # app/src-tauri/tauri.conf.json # app/src/app/flags.test.ts # app/src/app/flags.ts # app/src/features/connectors/index.ts # app/src/features/ink/flags.ts # app/src/features/intel/flags.ts # app/src/features/interop/flags.ts # app/src/features/pages/export/README.md # app/src/features/pages/export/blocks.ts # app/src/features/pages/export/source.ts # app/src/features/search/SearchPanel.tsx # crates/updater/src/fetch.rs # crates/updater/src/stage.rs # docs/FEATURES.md # docs/help/math-and-graphs.md # package.json
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # Cargo.lock # app/src-tauri/src/lib.rs # app/src/features/pages/ui/PrintDialog.tsx # app/src/features/pages/ui/pagesUi.test.tsx
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # Cargo.lock # Cargo.toml # THIRD_PARTY_NOTICES.md # crates/interop/src/import/pptx.rs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # app/src-tauri/capabilities/default.json # app/src-tauri/src/command_list.rs # app/src-tauri/src/lib.rs # app/src/features/citations/store.ts # app/src/features/citations/ui/CitationsPanel.tsx # docs/FEATURES.md # docs/help/study-tools.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # .github/workflows/nightly.yml # Cargo.toml # app/src-tauri/src/interop/commands.rs # app/src/app/flags.ts # app/src/features/interop/flags.ts # app/src/features/interop/importFlow.ts # app/src/platform/interop.ts # app/src/platform/web/interop.ts # checks.config.json # crates/interop/Cargo.toml # crates/interop/fuzz/Cargo.toml # crates/interop/src/detect.rs # crates/interop/src/import/xlsx.rs # crates/interop/src/lib.rs # docs/FEATURES.md # docs/help/import-and-export.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # .gitignore # THIRD_PARTY_NOTICES.md # checks.config.json # docs/FEATURES.md
- Imported PDF pages (new pages and pages inserted into a page) get the ink lane's locked bottom layer through importedLayerEdit/importedLayerPatch. - Slides (and any page picture the interop page builder adds) get the same imported layer in the page view, matching the interface's layer shape. - flagUsage: the seven flags whose lanes have now merged leave WAITING. - onenote ids: values only the test writer uses no longer warn in builds without the testing feature. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment on lines
+8
to
+12
| return html | ||
| .replace(/<(script|style)[\s\S]*?<\/\1>/gi, '') | ||
| .replace(/<br\s*\/?>|<\/(p|div|li|tr|h[1-6])>/gi, '\n') | ||
| .replace(/<li[^>]*>/gi, '- ') | ||
| .replace(/<[^>]+>/g, '') |
Comment on lines
+8
to
+9
| return html | ||
| .replace(/<(script|style)[\s\S]*?<\/\1>/gi, '') |
Comment on lines
+214
to
+215
| clean(cell.children.map((one) => inline(one, cx)).join('')) | ||
| .replace(/\|/g, '\\|') |
Comment on lines
+16
to
+17
| text | ||
| .replace(/<[^>]*>/g, '') |
| const { html } = exportHtml(page, { player: plan }); | ||
| expect(html).toContain(`script-src 'sha256-${sha256Base64(PLAYER_SCRIPT)}'`); | ||
| expect(html).toContain("media-src 'self' file:"); | ||
| expect(html.match(/<script>/g)).toHaveLength(1); |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "correct horse").unwrap(); |
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "correct horse").unwrap(); |
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "pw").unwrap(); |
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "pw").unwrap(); |
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "pw").unwrap(); |
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "pw").unwrap(); |
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "pw").unwrap(); |
| let page = page_id(); | ||
| let dir = plain_section(&mem, &page); | ||
| let fs = sealed_on(&mem); | ||
| fs.protect(&dir, "S1", "pw").unwrap(); |
| #[test] | ||
| fn a_hostile_header_cost_is_refused_before_any_work() { | ||
| let content = crypto::new_key().unwrap(); | ||
| let mut header = crypto::new_header("S1", &content, "pw").unwrap(); |
| #[test] | ||
| fn a_protected_section_keeps_no_plain_text_anywhere_and_opens_only_with_its_password() { | ||
| let f = fixture(); | ||
| f.core.protect_section(&f.root, f.section, "correct horse").unwrap(); |
…to golden files The generator measured Segoe UI and Cambria; the layout check measures Atkinson Hyperlegible Next and Literata. Each width is now the wider of the two. Golden pen outlines compare byte for byte, so the checks skip them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… NAS, attribution rows Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ases and plural variants Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… for large units Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…editor side, unsupported import example Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ngs, nav, intel switches, lasso actions Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…thumbnail command and grant, stale readable copy after a crash, alias on a returning page, PDF export count Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brings Phases 5 to 14 from
betaintomain, as beta 4 (0.1.0-beta.4). Phases 5 to 12 are built and in beta testing; 13 and 14 are built but not complete (the beta period, code signing, and the update key are the owner's).What each phase adds
betafirst; main's brand drawings and styles won where both changed.Quality-of-life features and Connectors
How it was checked
npm test,cargo fmt,cargo clippy -D warnings,cargo test --workspace(2577 passed, 0 failed),app:build, and the bundle budget. Merge fallout was fixed in its own commits: a duplicate flag-id type, feature-boundary imports, a Ctrl+H clash in the OneNote set, arrow keys in floating text boxes, clippy findings, and a snake-case field.Owner's checklist
docs/testing/beta-4-checklist.md starts with running on a throwaway profile, then goes riskiest first: save and restart, ink with the palm on the screen, export, and recording.
Known problems
layout.spec.ts(compact title bar) andpage.walk.spec.ts(strict "Table" locator) need updates..timelinefile is not a core asset; duplicating a page copies the audio but not the timeline.interop.exportPdfstays off: the Export dialog's PDF choice is not wired to the PDF writer yet.🤖 Generated with Claude Code