Repository navigation
Make row decorations unselectable; de-slop residual machine-voice strings - #243
Merged
Merged
Conversation
…-voice strings Copying values out of the HUD is a core workflow, but a native selection (double-click / drag / select-all) captured row decorations along with the value (why lines, mark glyphs, kind tags, affordance labels). Every decoration span is now user-select:none so a selection yields the bare value only; value text (entity/moment/summary/todo/draft/transcript/field text) stays selectable. A vnode-level regression test derives the non-selectable classes from the actual stylesheet and asserts a selection across representative rows extracts the bare value, with a by-construction negative probe. Also removes residual machine-voice from user-visible strings: banned end-user vocabulary and an internal lane name in two block labels; roadmap-phase and tracker references in placeholder/diagnostics copy; a raw chunk ordinal in the citations line; a raw exception painted under the chat box (now a calm line with the machine reason behind the hover title); and a live copy control on degraded summary rows whose payload was an empty string. Refs #242
…ocabulary
The prepared-drafts why-line rendered "from N distillates + M moments" —
"distillate" is banned end-user vocabulary (hud-voice §2). Reworded to the human
word "summary/summaries" ("from N summaries + M moments"), with an explicit
plural form since the source noun does not take a naive +s.
Refs #242
This was referenced Jul 17, 2026
Closed
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.
Closes #242
Why
Copying values out of the HUD is a core workflow. A native selection (double-click, drag, select-all) was capturing row decorations along with the value — e.g. a summary line yielding
<value>.<why-line>. Copy must yield the fully realized value and nothing else.A. Selection hygiene (headline)
The block renderer already isolates every decoration in its own classed span; the only
user-select:nonerule was the.hudtopdrag handle. This addsuser-select:none(+-webkit-prefix) to every decoration class acrossstyles.tsandpanel-styles.ts(why lines, mark glyphs, kind/ext tags, micro-state dot, moment time/glyph, unanswered tag, block/section headers, live-transcript chrome, citations/role/status/attachment lines, glyph + clarify + session-control + notetaker-nav affordances). Value text stays selectable by inheriting the default (entity/moment/summary/todo/draft/transcript/field text, chat messages, transcript utterances). The separating space inrelevant-now/pinned-doctitles moved inside the non-selectable.extspan so a selection has no trailing separator.Regression test (
selection-hygiene.test.ts): a vnode-level test that DERIVES the non-selectable classes from the actual stylesheet string (not a hardcoded list), walks a rendered relevant-now / todos / distillates row collecting the text a selection would keep, and asserts it equals the bare value. Includes explicit contract assertions on the relied-on classes and a by-construction negative probe (drop the.whysuppression → the why line rejoins the selection).B. Voice-slop strings (before → after)
Transcript · distillate stream→Transcript; row whydistilled from capture→from what was captured(banned "distillate/distilled" vocabulary)Fields · fast→Fields(internal lane/tier name)ask this context — recall path P3→ask about what is here(roadmap phase)sandboxed custom block — P6→a self-contained custom block(roadmap phase)…ephemeral fast-path (#58); the durable stream is the distillate block→…ephemeral fast-path; the durable stream lives in the Transcript block(tracker ref + banned vocabulary)error.messageunder the input → calm lineCouldn't answer — the engine returned an error.with the raw message on the hover title (same detail-on-inspection pattern ascalmChatStatus)error.message→screen capture did not respond#Nfor pageless sources → the source's human title (deduped); page anchors (p.3) unchangedC. Fully-realized copy value
EntityKindis closed (person | artifact | topic) — there is no link/url entity kind. A link surfaces as anartifactentity whosenameis the model-extracted surface form (index/extract.tstrims it; no URL parsing/normalization), and Entity has no separate canonical-URI field (external.urlexists but no current producer populates it). Sorow.entity.namealready is the value the entity carries — no richer field to prefer; the existingrelevant-nowcopy-payload test still pins it. Genuine URL documents carry the full canonical URI aspin.uri, and thepinned-docblock already copiespin.uri(full) withpin.titleas the display form. Added aurl-kind pinned-doc test pinning copy = the full canonical URL (scheme + host + path + query), negative-guarding the display title, decoration, and a bare-domain shortening.Gates (Node 22)
pnpm -r buildgreen;pnpm -r testgreen (contracts 114, fixtures 15, client 620, engine 1105); schema regen zero drift (genthengit diffclean undershared/contracts/schemas).Deliberately not changed
hintblock's inline label prefix:.hkand the duplicate.copybarpreview are suppressed, but the inline excerpt (a value) stays selectable; hint ison-matchand rarely shown, and its primary copy path is its button. Left minimal to avoid scope creep.