Skip to content

Phases 5 to 14: ink, pages, tables, search, audio, math, import, intelligence, hardening, release - #16

Open
XrxcGH wants to merge 750 commits into
mainfrom
beta
Open

XrxcGH wants to merge 750 commits into
mainfrom
beta

Conversation

@XrxcGH

@XrxcGH XrxcGH commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Brings Phases 5 to 14 from beta into main, 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

  • 5 Ink: pens, highlighter, stroke and partial erasers, lasso, shapes, and palm rejection.
  • 6 Page views and export: flow, paginated, and canvas views; paper and backgrounds; PDF (WebView2 PrintToPdf), image, and Word export; print; slides; gallery; reading aids.
  • 7 Smart tables and charts, 10 math and the grapher, and tool windows (timers, calculator, Upcoming).
  • 8 Search and links: search panel and index, quick switcher, page links, backlinks, and tags.
  • 9 Audio: recording with time stamps, flags, trim, and system audio, kept as page assets.
  • 11 Import and export: Obsidian, Markdown, Word, HTML, and more, into notebook folders.
  • 12 On-device intelligence: text in pictures, read aloud, summaries, and handwriting to text, each off per person until turned on.
  • 13 Hardening and privacy: crash reports with consent, self-check, feedback file, safe start, and Work offline.
  • 14 Release pipeline: release workflow, signing, SBOM, checksums, and winget (not run: needs the owner's keys).
  • main's Phase 4 fixes and brand work were merged into beta first; main's brand drawings and styles won where both changed.

Quality-of-life features and Connectors

  • Nine lanes built 142 of the 168 inventoried features: ink 21/24, typed notes 18/18, page views 11/11, tables, math, and study 26/28, search and links 9/9, audio 14/16, import and export 13/26, intelligence 9/15, shell 21/21. The 26 not built and 15 that need the owner's accounts or a format decision are listed in the beta notes.
  • The owner's fixes: no date text box on new pages (series pages too), text and text boxes on the rules of lined, grid, and dot paper, and a page area that shrinks with the window.
  • Settings > Connectors: sign-in in the system browser with PKCE, tokens in Windows Credential Manager, scrubbed from logs and feedback. No client IDs ship; docs/CONNECTORS.md explains registration.
  • Four lanes were stopped mid-feature; their work was committed as left (it passed the type check): tables-math-study, search-links, import-export (Share as a file, back end only), and the shell's tree Sort menu.

How it was checked

  • Run once on the merged branch: tokens, typecheck, lint, Prettier, 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.
  • Bundle limits raised to fit: start-up JS 297.4 KB gzipped (limit 300), CSS 21.0 KB (22).
  • Start-up smoke of the release exe on a throwaway profile: setup, a new page with no date text box, both splitters and window sizes from 1500 to 480 px, lined paper with text on the rules, Settings and Connectors, and each main entry point once; no console errors.
  • Not tested by agents: everything past start-up. No Playwright suites, component tests, or real-device tests; 4 timing-sensitive unit tests failed while Cargo was building and were not rerun.

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

  • Start-up bundle grew by about 47 KB; the Tags pane chunk is 157 KB.
  • Ruled paper's print path was checked in code, not printed; text-box width has no upper limit on the canvas.
  • Playwright layout.spec.ts (compact title bar) and page.walk.spec.ts (strict "Table" locator) need updates.
  • A recording's .timeline file is not a core asset; duplicating a page copies the audio but not the timeline.
  • interop.exportPdf stays off: the Export dialog's PDF choice is not wired to the PDF writer yet.
  • Building needs CMake for Opus (the Build Tools copy works).

🤖 Generated with Claude Code

Comment thread app/src/features/citations/bibtex.ts Fixed
Comment thread app/src/features/page/audio/transcripts/model.ts Fixed
Comment thread app/src/features/study/io/ankiNotes.ts Fixed
Comment thread app/src/features/tables/engine/paste/html.ts Fixed
Comment thread app/src/features/tables/engine/paste/html.ts Fixed
Comment thread app/src/features/tables/engine/paste/html.ts Fixed
Comment thread app/src/features/tables/engine/paste/html.ts Fixed
Comment thread app/src/features/tables/smart/smart.test.ts Fixed
Comment thread app/src/features/citations/styles.ts Fixed

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
Comment thread app/src/features/citations/bibtex.ts Fixed
Comment thread app/src/features/tables/engine/paste/html.ts Fixed
Comment thread app/src/features/tables/engine/paste/html.ts Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Fixed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
Comment thread crates/interop/src/lock.rs Dismissed
XrxcGH and others added 24 commits October 8, 2026 06:40
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>
XrxcGH and others added 16 commits October 15, 2026 06:53
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);
XrxcGH and others added 2 commits October 15, 2026 14:16
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();
XrxcGH and others added 10 commits October 15, 2026 14:42
…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>
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.

2 participants