Fixed
- YouTube videos you save now keep their description and length, so search can find them, even when YouTube refuses to hand over a transcript.
Reconciler on every Huey job invocation, so its every-10th-tick wal_checkpoint(TRUNCATE) self-heal (built for GH #382/#406/#537) never fired from that path — a fresh instance's own tick counter never advances past 1. Confirmed in prod: the primary tenant's -wal file had grown to 204 MB (main DB 755 MB) while idle tenants sat at 0 bytes, and /api/pulse hit 20.4s. run_reconciler_tick_job now seeds each fresh Reconciler with a persisted per-tenant tick count (Reconciler(db, initial_ticks=...), keyed by DB path in job_tasks_governance._RECONCILER_TICK_COUNTS) so the checkpoint cadence survives across ticks without one tenant's ticks resetting another's. GH #844.src/frontend/modules/reader-helpers.ts: a line is a removal candidate only when tokenizing it leaves nothing but tag tokens and whitespace — any prose character anywhere on the line disqualifies the whole line from any tag-related processing. A qualifying line is removed only when every tag on it is in the known layout/table-structural vocabulary (READER_LAYOUT_TAG_NAMES); a qualifying line with an unknown/custom tag is preserved. This makes every round 1–6 finding class (JSX examples, CLI/doc placeholders, quoted attribute values, code-span content) structurally unreachable rather than individually patched. Cost: the PR's own motivating cases (…All</td></tr><tr><td>ICO<sup>1</sup>…, a mid-attribute <picture>, an attribute-bearing mid-sentence <div>) are mid-prose and are now consciously out of scope — they render as literal escaped markup. Also fixed: the code-span/image-token placeholder restore used a per-invocation random nonce (verified absent from the input) instead of a fixed, guessable placeholder name, closing a restore-can-corrupt-content bug (round 6, finding P3) where the fixed placeholder text could itself occur in the source.km upload sends files from your computer directly to a hosted Knowmarks account, including chosen projects and notes. It preserves the original file name, supports replacing an existing document, and can return a machine-readable save receipt for batch work. Failed or incomplete saves are clearly reported.km upload-status after disconnecting; repeated receipt IDs do not create another save or replay a document replacement.km doctor now shows which models get low-effort reasoning by default, so you can confirm the setting that keeps summaries and explanations from coming back blank.km config show and km config get now recognize the fast- and deep-tier fallback model settings, so they're no longer missing from the listing or reported as an unknown key.km doctor now reports tester-comms configuration. A new "Tester Comms" section shows whether the comms gate is on or off, and — when it's on — whether the invite-email and onboarding-push channels are actually configured. It never prints key values, only presence.km doctor compares recent captured Briefs and reports aggregate novelty for their references and wording. This is an informational baseline only: it does not yet label the result healthy or unhealthy, or change Brief generation or cadence.km doctor explains when the sample is still too small and what activity will make it useful.km doctor, including connectors that failed before their first successful sync.km doctor now watches your search quality. It flags a rising rate of empty searches or results you have to scroll for, using the search and click signals Knowmarks already records locally.km doctor now tells you if the background worker has stopped, and enrichment follow-up work now writes logged errors instead of disappearing silently.km doctor now finds vectors whose stored dimensions do not match their model stamp.km jobs status and km doctor now recognize the real worker heartbeat, and Spaces Integrity no longer treats unrelated collection or project activity as proof that automation rules recently ran.km note edit now check whether the note changed since it was opened, and km doctor now flags a note whose .md file and database body disagree.km doctor now shows a Backups row and turns red if the newest backup is missing or too old, so a broken backup routine is visible instead of silent.<table>, <tr>, and <td> tags into the page — the layout flattens and the heading and text render as prose. Placeholder text an author writes in angle brackets, like <rule-id> or <name> in usage examples, still shows exactly as written.km import raindrop.manual in km connector list.km doctor stops crying wolf about your AI provider. The health check was flagging your language-model and embedding provider as "unreachable" even when the connection was perfectly fine — a false alarm from a bug inside the check itself, not your setup. It now reports the true status.-blockchain) now also drops results that are *about* that topic even when they don't contain the exact word — excluding a subject actually excludes it.IMG_1234.jpg, Screenshot 2026-…, a pasted-image or random-looking name — and the title now describes what the picture actually shows, drawn from the text and caption the image was already read for. A name you chose yourself (like q3-revenue-chart) is always kept, and an image saved with nothing to read keeps its filename. There's also a one-time cleanup you can run to give the same treatment to images you saved earlier.-term. You can now subtract keywords from any search or collection — for example vintage ring -repos keeps the jewelry results and drops code repositories. Put a minus sign in front of any word (or a content kind like -repos, -video, -pdf) to leave it out, in both the search box and a collection's keywords.km tool now exit with an error when they actually fail, instead of printing the error but reporting success — so scripts and scheduled jobs can tell the difference.[object Object]. When something failed — for example creating a Space while the database was briefly busy — the pop-up sometimes showed a cryptic [object Object] instead of the reason. Notifications across the app now show the real message.[[link]] you write in a note used to come alive only in the editor — when you opened the note to read it, the link sat there dead. Now those links resolve as you read: a link that points to a real note or space lights up and takes you there on click, and a link that doesn’t match anything stays quietly inert instead of doing anything unexpected.<!-- --> markers or <br> tags. Some project pages tuck layout notes and line breaks into their README as raw markup, and they used to show through as literal <!-- LOGO --> or <br> text in the reader. Those are now cleared away, so the README reads as intended.// instead of the full https://. Those saves used to show no image at all, even with images turned on — now the cover picture shows up the way it does for every other source.<p> or <br> clutter. Comment threads, recipe ingredients and steps, product descriptions, and video descriptions now render as proper paragraphs, links, and lists.< and & in the middle of sentences instead of the real < and &. The reader now displays the actual characters, so passages like "kernel width k < n" read the way they were written.[[wikilink]] syntax — it's a clean one-line excerpt. (Opening the note still shows it fully formatted, as before.)<!-- image --> clutter. When the extractor couldn't pull in a picture from a PDF, it left a placeholder that showed up as raw <!-- image --> text scattered through the page. Those placeholders are now removed, so the document reads cleanly start to finish.<p> and <i> mixed into the text. They now render as proper prose — paragraphs break where they should, links and emphasis come through, and the tags are gone.C++, C#, Node.js, anything with quotes or parentheses — used to quietly return nothing because of a query-syntax error; they now return real results. Multi-word searches no longer come up empty just because one of the words is rare. Short queries and acronyms like Go, AI, and ML are no longer dropped on the floor. And when an item's title is exactly what you typed, it now ranks at the top where you'd expect it. (The underlying ranking weights are unchanged — these are recall and precision fixes, not a re-tuning.)km doctor tells worker-idle from worker-stuck at a glance. The Enrichment Health breakdown used to lump everything still being processed into one "awaiting flush" number. It now separates items waiting in the queue from items actively in flight (2 awaiting flush · 5 in flight), so when something's backed up you can see whether the worker is idle or stuck without dropping into the raw details.$9.32 instead of the raw usd 9.32 some sites publish. Common currencies (USD, EUR, GBP, JPY) render as their symbol; anything else shows the currency code in capitals.km stale all read the same way, with the meaning spelled out right there. The raw number is still available on hover if you want it.<em> tags around the text.' instead of the apostrophe). New saves store the clean name, and items you've already saved render correctly too.km import knowmarks <archive> and everything is restored — already-present items are skipped, so importing twice is safe. km export <path> does the same export from the command line.asterisks around item names.> to run a command: create a note, save a link, import bookmarks, ask the Companion something, or jump to any screen. Paste a link and the palette offers to save it, with a Space picker right there so the save lands where you want it. It works on every screen, and the "Search or run…" row at the top of the sidebar opens it with a click or a tap — no keyboard shortcut needed./ to open it, paste a copied link on any screen (⌘V) to save it without opening anything first, and use two-key jumps — G then P for Pulse, G then S for Spaces, G then N for Notes.], and still remembers your choice.</a> into the reading view — the text stays, the markup goes.[removed] token, and pages that publish placeholder author names (like "Fallback-author") no longer show them in the byline.] shortcut) are how you open the Companion now.km doctor now also cover stored page snapshots and the extraction retry pipeline, so you can see at a glance whether anything is stuck.km doctor. The dashboard finally has the full set of integrity checks the CLI does.km doctor gains a new Radar Rules section reporting the RSSHub discovery-rules cache (domain count, size, freshness). The cache file has lived on disk for cycles, but only the JSON diagnostics endpoint surfaced it — now km doctor does too.km doctor for a while; the dashboard finally has them too, so you can spot a missing note file, a citation pointing at a removed passage, or a Space-substrate drift without dropping to the terminal.km doctor.km doctor and the Settings → Diagnostics card now report cause-tagged reasons when an enrichment job fails — you can tell at a glance whether a stuck save is waiting on a different model, needs a fetch retry, or is hitting a configuration problem, instead of seeing a generic "error" row.km doctor again (it had briefly been showing as literal [yellow]…[/yellow] debug text — a rendering escape introduced during the doctor refactor and caught in the chunk-3 review).durable retention class that have drifted or broken are now treated as workflow signal, not a problem — the Settings → Diagnostics card no longer paints the Citations Integrity card yellow just because a re-verify pass is overdue. External health checks polling the dashboard JSON for extras.citations_integrity.status no longer flap on naturally aging citations.citations table is missing from the database — it now surfaces a single "Check skipped: citations table not present" row so the schema gap is obvious instead of hidden.mynote.md.md as orphans. Backup tools that append .md to filenames, or a Finder hide-extension save-as mistake, no longer turn the section red.LLM_BASE_URL (empty, or pointing at an obviously wrong host) no longer takes down the entire Diagnostics card. Each section reports its own outcome independently, so one bad provider can't blank the rest of the panel.review: field in the note's .md frontmatter — 90d, 6mo, 1y, or never — and Knowmarks surfaces the note in stale items when it's overdue. New notes default to 90 days; existing notes start at no cadence so nothing in your library gets flagged retroactively. Use km note review <id-or-slug> to mark a note reviewed without touching its body (the lifecycle counterpart to km save for URLs).km ingest <path> --replace <knowmark-id> (or the optional replace_knowmark_id field on the upload form) keeps the Knowmark id, preserves Space membership, re-extracts content, and re-verifies every citation pointing at the document. The revision counter on the document ticks up so you can see how many times you've refreshed it.km cite open and the MCP cite_open response read · Page N after the surrounding context, and the stored selectors carry W3C PageSelector + BoundingBoxSelector alongside the existing TextQuoteSelector and TextPositionSelector.KNOWMARKS_AGED_DOCUMENT_YEARS).valid; ones that don't drift to drifted cleanly, so a citation you made yesterday doesn't go silently wrong after you fix a typo.kind condition so you can target rules at links, notes, or documents specifically..md file from disk in lockstep — no orphaned files left behind.NOT:term or -term, plus Keyword and Semantic filter chips for narrowing result types.type:, format:, source:, space:, site:, after:, and before: so searches can be narrowed directly from the search box.