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>
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); |
| 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(); |
|
|
||
| #[test] | ||
| fn a_style_seals_and_opens_with_its_key() { | ||
| let key = [7u8; 32]; |
|
|
||
| #[test] | ||
| fn a_wrong_key_and_damage_both_fail_the_same_way() { | ||
| let sealed = seal(&[1u8; 32], STYLE).expect("sealed"); |
| #[test] | ||
| fn a_wrong_key_and_damage_both_fail_the_same_way() { | ||
| let sealed = seal(&[1u8; 32], STYLE).expect("sealed"); | ||
| assert_eq!(open(&[2u8; 32], &sealed).unwrap_err(), StyleError::Unreadable); |
| for at in [0, MAGIC.len(), HEADER, sealed.len() - 1] { | ||
| let mut damaged = sealed.clone(); | ||
| damaged[at] ^= 1; | ||
| assert_eq!(open(&[1u8; 32], &damaged).unwrap_err(), StyleError::Unreadable); |
| damaged[at] ^= 1; | ||
| assert_eq!(open(&[1u8; 32], &damaged).unwrap_err(), StyleError::Unreadable); | ||
| } | ||
| assert_eq!(open(&[1u8; 32], &sealed[..HEADER]).unwrap_err(), StyleError::Unreadable); |
| assert_eq!(open(&[1u8; 32], &damaged).unwrap_err(), StyleError::Unreadable); | ||
| } | ||
| assert_eq!(open(&[1u8; 32], &sealed[..HEADER]).unwrap_err(), StyleError::Unreadable); | ||
| assert_eq!(open(&[1u8; 32], b"").unwrap_err(), StyleError::Unreadable); |
A help page and a FEATURES.md section for the solvers window, shorter sentences and wrapped lines where the checks asked, and named suppressions for the long messages and the panels that share state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A UI spec inserts a 3D graph and a parametric graph, turns and traces them, and opens the Vectors, Solids of revolution, and Projectile simulator windows. The tool fields keep to their grid cells, and the chosen view shows as pressed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A number column can carry a unit such as kN, MPa, or N·m. Cells typed in another unit of the same kind convert to it, so totals and formulas add like with like, and a unit of the wrong kind is flagged. The column can write values in engineering notation or with SI prefixes. Units, prefixes, and conversions live in core/units, shared with the circuit solver. Set from the table's Format menu or the command palette. On in Beta. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…case Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the browser The window's first height is 720 pixels, the most a tool window may ask for. A Playwright spec opens solvers from the palette, works a volume and a diverging Newton run, and runs the accessibility checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sizes The measure gets a keyboard crosshair: arrows move it, Enter marks each point. The compass sweeps with [ and ], and Enter draws the arc. A hint under the needle says whether a press sweeps or resizes. Unit tests cover the ruler's straight edge and length readout, its moves by pen, touch, mouse and keys, and that unchosen tools add no work to a pen contact. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rcs in the app Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A selected equation shows a Graph button beside it, and the equation panel has one too. It opens a popover beside the equation with the grapher: 2D for y = f(x) or an expression in x, 3D for z = f(x, y) or an expression in x and y, and both sides for an equation in one letter so the answer is where they cross. Insert graph adds a live graph block after the equation's block; Insert as picture adds a PNG. Lassoed ink offers Graph in its selection bar, which reads the handwriting as math on this device first. Graph equation is in the palette, the Insert tab, the text context menu, and on Alt+Shift+G. Behind math.graphPopup, on in Beta. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s, and pass the repo checks Number this equation acts on the equation nearest the caret and finds the last editor after the palette takes focus. Practice mode, the formula sheet, and the figure exporter read the shown page as the page view holds it. Adds UI and component tests, a unit test for the equation commands, and a Rust test of Word-path numbering. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UI specs add the free-body diagram, beam, truss, and circuit blocks from the slash menu and the palette, check their answers, and give a table column a unit. An a11y spec runs axe on a page with one of each, which moved the result headings into table captions and the result regions into groups so several blocks on a page stay valid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tighten the series bound Newton's method on a repeated root no longer stops as a cycle: a cycle now needs real steps, and a linear order of convergence adds a note that the root is likely repeated. The projectile simulator accepts a straight-up launch. The Lagrange bound refines the largest derivative instead of padding it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the LaTeX command tools.latex Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reading the 3D flag in exportGraph pulled app/flags, and with it lazily loaded modules, into the single-file print bundle, which then could not be built. A 3D graph's text now always prints in 3D. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…trices The equation panel has Steps: a derivative names each rule from the outside in (sum, constant multiple, product, quotient, power, chain, and the usual functions) with that part's derivative, and an integral works through a table of rules (sum, constant multiple, power, 1/x, sin, cos, exp, and linear insides) and gives a definite integral's value, by Simpson's rule when the integrand is not in the table. Solve now solves systems of linear equations (cases, aligned, or rows split by \ or semicolons) by elimination, and a matrix's determinant, inverse, and transpose. The calculator writes answers in normal, scientific, or engineering notation with a chosen number of significant figures, or the fewest typed. Show steps is in the palette. Behind math.steps, on in Beta. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The walk to the storage step checked whether Get started was visible without waiting, so on a slower runner it skipped the click, then looked for Continue on the welcome step and timed out. Waiting for the heading first removes the race. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
It depends on when the status line shows during the sweep, and the old list allowed it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Fix layout in dialogs, gallery, present bar and ink overlay
Round the first visit to an arrow tip
…a scroll bar The overlay frame is inset by the measured scroll bar width, but its width only subtracted the dock offset, so on a 420 px window it overflowed the left edge by 15 px on CI. Subtract the same width. The 1100 px overlay test measured the page's own scroll bar, which an empty page does not have; it now reads the variable the host sets, as the panel does. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…n More Opening Settings pressed Ctrl+Comma and took the first level-one heading, which was still the page that was open, so the section link was never clicked; all the Settings screens timed out. They now press again until the list of sections shows (tests/ui/settingsOpen.ts). The Home screen looked for a command named Home, which is now Go home. At the medium width the safe mode notice moves into the title bar's More menu, where using the chip closed the menu and took its popover with it. In More a notice is now drawn open in the list. The safe start screen settles before it opens the menu, so late chunks do not close it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Taken by the update-screenshots workflow on this branch (run 40135160731): the Settings screens, Home, the safe start notice, and the screens the merged lanes changed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Keep tool windows, panes, menus and toasts in the window and clear
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The status line's place in a sweep depends on timing, so these two show on CI runners and not on every machine. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The audit counted text scrolled half under the status line as overlapping it, and blamed a dialog for rows a scrolling list simply had not scrolled to; both now measure only the part that shows, and a full-window layer (the present view) no longer counts as covering a scroll bar. Real fixes: the Properties chip stays left of a Reading order or Contents drawer instead of sitting on it; a callout's hidden fold button no longer takes a 44 px box over the type button; touch targets now follow density (44 px) in the properties header, solvers, vectors, solids, lab tabs, diagram, mind map, graph inputs, collections, code cell, circuit and canvas fields, math fields and the block actions; the inline math toggle clears its actions. known.json shrinks from 132 entries to 23 plus 6 timing-dependent ones, and each now says why it cannot be fixed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… UI tests Settings now shows in the geometry walk, which found that tabbing to the last link of the section list scrolled it flush to the list's edge and cut its focus ring by 4 px. The list now has scroll padding. The recording trim test pressed Record before the page's text was mounted, which answers with 'Open a page first'; it waits for the text as the other tests effectively did by being slower. The ruled-paper box test used the free canvas, whose background menu is off, so it switches to the document flow first. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The branch's rewrite of this test expected a different 3D graph (a function count and a turn readout) than beta draws, and dropped the SVG and PNG save test. Keep beta's test and its expectations; only pick the item by click, since Enter takes whichever item sorts first while the typed words arrive. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Taken by the update-screenshots workflow on this branch (run 40144116034): the tool windows, the flashcard deck, and the tree toast and Trash screens, which the panel layout lane changed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Fix clipping and overlap in the page editor and blocks
The test read the status the moment the error text showed in the output; the status line follows by a tick, which the CI runners show. It now waits for the status as it waits for the output. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The sign-in retry test gave its second attempt the same 200 ms that made the first one give up, so a loaded runner timed it out. The second attempt now has 30 s. A syntax highlight that takes over 20 ms is dropped as too slow to trust, which the first one on a slow runner is; the highlight tests that want colors now run on a clock that stands still, as the ones about slowness already set their own. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The first backup saves the page, and the journal thread writes behind that save. On the Linux runner the second backup found the file it touched and counted it as changed. The test now flushes the journals between the two backups, as it already does before the first. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Run the ui-web suite as four shards
Keeps beta's button styles in the math panel and its properties chip padding; known.json stays in the object form with reasons and is refreshed from a new audit. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The inline math popover lies over text by design; the search results gap was seen in one cell only, so it is listed as timing-dependent. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Fix the layout audit's false findings and touch targets
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 6 (0.1.0-beta.6). 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