Skip to content

Guide: the host's shell explains a page in place, starting with Soubory (F56, DEV-6612) - #501

Merged
immakermatty merged 4 commits into
mainfrom
agent/DEV-6612-guide-engine
Oct 18, 2026
Merged

immakermatty merged 4 commits into
mainfrom
agent/DEV-6612-guide-engine

Conversation

@immakermatty

@immakermatty immakermatty commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Why

People who arrive in Lazurio are confused until they understand a few principles. The Launchpad's pages carry explaining sentences that a person has to read before they can act. Matěj decided on 2026-10-18 (root decision 0180, addendum of 2026-10-18) that a "?" beside a page's heading makes Buddy explain the page in place:

  • the host's shell draws the ring, the character and the card;
  • Buddy's frame may only ask by id;
  • without Buddy, a neutral Lazurio guide explains the same way.

This is slice PR 4 of the DEV-6612 Launchpad lane (plan DEV-6612-produkt-jedna, milestone M3, shaping section 3(c) "„?“ → Buddy na místě"). Variants of an explanation follow #499: they come only from facts the host knows, never from an Organization's name. The reference is the approved wireframe (HumanAndMachine-ai/prototypes-lazurio bebea85, docs/buddy-guide.md).

The decision is recorded as F56 in docs/decisions.md.

What it adds

The guide's engine lives in the shell (src/shell/), so the Launchpad, the Dashboard (by its pin) and the T3 Code and MausBot forks share one engine and one check of who may ask:

  • guide.ts decides what plays and when, over seams, so it is tested without a DOM.
  • guide-layer.ts draws in <lazurio-buddy>'s own shadow root: the ring, the neutral guide's mark (the Lazurio symbol on a white disc), the card, placement, motion with prefers-reduced-motion, Escape and focus.
  • guide-styles.ts is the layer's stylesheet.
  • guide-content.ts holds the six principles in Czech and English: Prostředí, Osobní Prostředí, kam smějí agenti, Soubory, Integrace and Trezor. They use the wireframe's ids and follow the text rules. Kind tokens are filled from the shell's kind facts (automated counts as work), your computer gets its own words, and the Personal Environment gets its own Trezor version.
  • guide-placement.ts is the pure placement rule, moved unchanged from src/launchpad/tour-placement.ts; the Launchpad's tour now uses it from there. The guide adds two things: without an element its card stands centred, and below 768 px the card is a sheet at the foot of the window.
  • Attention arbiter: never two tours at once. While Začínáme wants attention, a "?" plays nothing and draws nothing next to the tour's bubble. Instead the tour's bubble nudges, and assistive technology hears "Nejdřív dokončete Začínáme". While the guide is out, the tour waits.

Additions to interface v1 (permanent, kept as few as possible):

Name Why
<lazurio-buddy lang> The guide's place on a page and its language. The forks already place this element, undefined.
marks: data-guide, data-guide-help A step points at a mark rather than a selector, so an explanation never names the page's structure. The "?" names the explanation it plays.
event lazurio-guide ({type: "started" | "done" | "closed", explainer}) Lets a host follow the guide.
export provideGuides A host hands over the explanations of the page it shows, at runtime. Those explanations belong to the host because they point at its own elements.

Without explanations handed over and without a Buddy origin, <lazurio-buddy> draws nothing, listens to nothing and keeps nothing: no shadow root, no listener, no subscription. So the forks do not change after rollout. The following are not promised:

  • the principles' ids, texts and marks;
  • the shell's own marks;
  • the Launchpad's arbiter guideAttention (not exported by shell.js).

The lazurio.guide.* v1 protocol (src/shell/guide-protocol.ts, pure, with vectors in src/shell/guide-vectors/v1/guide-protocol.json, run through F50's vector runner and format):

  • The frame sends {type: "lazurio.guide.play", v: 1, explainer}.
  • The host accepts it only if all of these hold:
    • it comes from the bubble frame's own window;
    • its origin is exactly Buddy's origin as the shell document names it (https, never taken from the message);
    • its keys are exactly type, v and explainer;
    • v is 1;
    • explainer is a known id, either a principle or an explanation of the current page;
    • nothing is playing and Začínáme does not want attention. If something is playing or Začínáme wants attention, the host answers busy instead.
  • Anything refused is dropped without an answer.
  • Replies are {type: "lazurio.guide.started|done|closed|busy", v: 1, explainer, kind?}, posted to the exact origin, never *.
  • No listener is registered in this release. The receiver (createGuideReceiver) and the vectors ship now, so PR 7 only wires them up once Buddy has an origin (M7).

On the Launchpad, Soubory is the first page with a "?":

  • The "?" sits right after the heading in the breadcrumb and calls the engine directly, not through postMessage.
  • It plays the principle files. In a Team Environment it plays the Launchpad's own files-team, chosen by the kind alone (src/launchpad/guides.ts).
  • New marks: nav-files and files-list.
  • In the same PR, the sentences the "?" replaces are removed. The Launchpad's real Files page never had the prototype's line "S čím pracují vaši agenti."; its counterparts were these, all now gone:
    • the introduction "Složka Dokumenty tohoto Prostředí. Agenti sem ukládají…" / "The Documents folder of … Agents save finished files here…" (the counterpart of "S čím pracují vaši agenti.");
    • the Team note "Toto Týmové Prostředí je sdílené…" / "This Team Environment is shared…" (the counterpart of the prototype's "Celý Team může tyto soubory číst a měnit.", now said by files-team);
    • the empty Documents folder's explanation, now only "Zatím žádné soubory." / "No files yet." (the counterpart of the prototype's "Nahrajte podklady pro agenty.").

What it deliberately does not do yet

  • No Buddy frame, origin or listener, and no Buddy character. Everyone is guided by the neutral guide. That comes with PR 7, after M7.
  • No "?" on other pages. Apps, Integrace, Trezor and every Settings section come in PR 5. The principles other than files cannot be reached from the Launchpad yet, and the host marks they look for come with PR 5.
  • No motion scenes for the principles. Those are PR 6.
  • No change to the column head, the band, "Dokončit nastavení" or the rail, which belong to the T3 Code rebuild thread. The shell's own marks (tab-chat, picker, …) are found by selectors inside those elements without touching their code.
  • No change to the Trezor page content (DEV-6631), and no change to Launchpad: the tour's gear stop for AI is its title alone #475's files.

Verification

  • bun run check:static: lint, typecheck, public check, proof build and smoke.
  • Focused tests: tests/shell-guide-protocol.test.ts, tests/shell-guide.test.ts, tests/launchpad-guide.test.ts, tests/shell-interface.test.ts, tests/launchpad-shell-routes.test.ts, tests/tour-placement.test.ts, tests/first-run.test.ts.
    Together, 230 pass and 0 fail.
  • Full suite: bun test --timeout 30000 gave 4148 pass, 9 skip, 0 fail (4157 tests in 284 files). It ran on the tree just before the unused playGuide export was removed; the run on this exact head is noted in a comment below.
  • Headless Chromium against the hosted scripts/preview-launchpad.ts, on Soubory, in Czech and English, in a Work and a Team Environment, at 1440 and 700 px, and at 1440 px with prefers-reduced-motion:
    • The "?" is named "Jak to funguje?" / "How does it work?". Before any click, <lazurio-buddy> has no shadow root.
    • Work Environment. The "?" plays the principle files. The ring sits exactly on the column head's Chat tab for steps 1–3 and on the Soubory item for step 4. The steps advance with Enter, and the last button reads "Rozumím" / "Got it".
    • Team Environment. The "?" plays files-team. The ring is on the Chat tab, then on the file list.
    • At 700 px the card is a sheet at the window's foot. Steps that point into the folded column show no ring; the list is ringed.
    • Escape closes the guide, and focus returns to #page-help.
    • Reduced motion. The layer is marked still and no animations run.
    • While Začínáme wants attention, the "?" draws nothing: the guide's layer stays hidden, the tour's bubble nudges, the status for assistive technology reads "Nejdřív dokončete Začínáme" / "Finish Getting started first", and focus stays on the "?".
    • Fork-like page. The page loads /.lazurio/shell.js and has <lazurio-rail>, <lazurio-column-head>, <lazurio-buddy> and a data-guide-help button, but no provideGuides. There, <lazurio-buddy> is defined, but after a click on the "?" it has no shadow root, no children and zero height.
    • Console. No errors other than the preview's three fake endpoints (/.lazurio/account/environments 404, /api/update/status 503, /api/content/jobs/latest 404), which answer the same way without this change.
    • Screenshots, 64 in all, are kept locally in the operator's drafts, for example cs-work-1440-1.png, cs-team-1440-2.png, en-team-700-2.png, cs-work-1440-0-busy.png and cs-work-fork-like.png.

Risks

Open questions

  • The English texts of the principles and of files-team were written by the agent. Matěj, please review the wording.
  • Should "?" during Začínáme stay a nudge of the tour's bubble plus a status for assistive technology, or should it say something visible elsewhere? A visible card next to the tour's bubble meant two tours at once in the browser check.
  • "Založte si Buddyho", at the end of the two Buddy principles, leads to the Dashboard's home until the Buddy sign-up page exists (task 994).

Refs: plan DEV-6612 (data/mission-control/plans/2026/09/DEV-6612-produkt-jedna.yaml), root decision 0180 addendum of 2026-10-18, #499.

🤖 Generated with Claude Code

Note

Add shell guide engine that explains pages in place via <lazurio-buddy>, starting with Files

  • Adds a shell-owned guide engine (guide.ts) that plays one localized explanation at a time, rendered inside connected <lazurio-buddy> elements (elements.ts)
  • Pages register explanations through the new provideGuides API; the Launchpad Files page supplies a Team-specific guide and a heading help button, and its former inline intro and shared-folder notes are removed in favor of the guide
  • Includes bilingual principle content, a rendering layer with target rings and card placement (bottom sheet below 768px), a versioned message protocol with strict origin checks, and a busy reply when the onboarding tour owns attention; the tour now yields while a guide plays
  • Adds test suites for guide content, protocol vectors, and page markup, plus the F56 decision record in decisions.md
  • Risk: the Files page no longer renders its introductory and shared-folder paragraphs; any consumer of that copy or the removed shared method in files-panel.ts must be updated

Macroscope summarized 04b363b.

immakermatty and others added 3 commits October 18, 2026 18:41
…1 protocol (F56)

The host's shell now draws the guide of root decision 0180's addendum of
2026-10-18: a "?" (data-guide-help) makes the neutral guide of Lazurio, and
later Buddy, ring a real element and say a few words beside it. guide.ts
decides what plays and when over seams, guide-layer.ts draws it in
<lazurio-buddy>'s own shadow root (ring, mark, card, placement, motion with
prefers-reduced-motion, Escape and focus), guide-content.ts holds the six
principles in Czech and English with the prototype's ids and rules, and
parses what a host hands over with provideGuides. The bubble's placement
rule moves unchanged from src/launchpad/tour-placement.ts to
src/shell/guide-placement.ts, and the tour uses it from there; the tour and
the guide never run at once (guideAttention).

Interface v1 grows by <lazurio-buddy lang>, the marks data-guide and
data-guide-help, the event lazurio-guide and the export provideGuides.
Without explanations handed over and without a Buddy origin the element
draws and listens to nothing, so the forks are unchanged. The pure
protocol for Buddy's frame (guide-protocol.ts) ships with its vectors in
F50's format, but no message listener is registered until Buddy has an
origin (plan DEV-6612 M7).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g sentences (F56)

Soubory is the first page with the shell's guide: a "?" right after its
heading in the breadcrumb plays the principle "files", and in a Team
Environment the Launchpad's own "files-team" (the folder is the Team's),
chosen by the Environment's kind alone (#499). The page hands its
explanations over with provideGuides on every move, places
<lazurio-buddy lang>, and marks the Files item (nav-files) and the list
(files-list). The tour tells the guide whether Začínáme wants attention
and nudges its own bubble when a "?" asks meanwhile; Recovery mode
withdraws the guide.

The sentences the "?" replaces go in the same change: the introduction
("Složka Dokumenty tohoto Prostředí. Agenti sem ukládají…"), the Team note
("Toto Týmové Prostředí je sdílené…"), and the empty Documents folder now
says only "Zatím žádné soubory." / "No files yet.". Every other page gets
its "?" in the next slice of plan DEV-6612.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…part

F56 records root decision 0180's addendum of 2026-10-18 for the Platform:
the engine and the six principles in the shell, a page's explanations in
its host (variant C2), the five additions to interface v1 and why each,
the lazurio.guide.* v1 protocol with its acceptance rules and vectors,
the arbiter with the onboarding tour, Soubory as the first page, the
alternatives, honest limits and how it was verified.
docs/launchpad-development.md describes the modules, how a host takes
part, the Files page without its explaining sentences and the placement
rule's new place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@immakermatty

Copy link
Copy Markdown
Contributor Author

Full suite on this exact head (04b363b, clean tree): bun test --timeout 30000 gave 4147 pass, 9 skip, 1 fail. The one failure is the known load flake #284 (wacli sign-in reads wacli.pid before the fake writes it), which passes 3/3 when its file runs alone; this PR does not touch wacli, src/tools or the server. The earlier full run, on the tree before the unused playGuide export was removed, gave 4148 pass, 9 skip, 0 fail. check:static and the focused suites (230/230) are green on this head.

@agentrozjedemeai agentrozjedemeai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@immakermatty — src/shell/guide.ts:263-271: Detaching the active clears playing without calling the layer’s draw(null, actions). Unlike withdrawal via provide(null), this leaves the layer’s document keydown/resize listeners and 250 ms interval running. On reattachment, the existing layer still considers itself visible; replaying the same explanation skips first-show setup (including focus and URL snapshot), so a later tick can close the new guide against the old URL. I reproduced the lifecycle on this exact head: attach → provide([]) → play("files") → detach produced only draw(show), no draw(null); reattach → play produced show, show. Close the active layer on detach and cover detach/reattach with a regression test before merge. Local: 151 focused tests pass, check:static passes; CI green; diff --check clean.

…r end does, clearing its layer

Pablo's review of #501: detaching the element that drew an explanation
cleared `playing` without telling its layer to draw nothing, so the
layer's document listeners and 250 ms timer kept running, and a
reattached element skipped the first-show setup (focus, URL snapshot).
`detach` now ends the explanation through `end("closed")`, the same path
`provide(null)` takes. A regression test covers detach and reattach; it
fails on the previous code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@agentrozjedemeai agentrozjedemeai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@immakermatty — Re-review of b1d6f22: the detach path now calls end("closed"), which clears the active layer through draw(null, actions), removes the layer listeners/timer, announces closed, and notifies attention listeners. The detach/reattach regression passes and the new behavior matches the prior finding; no remaining defect found in this fix. Local detached checkout: 152 focused tests passed, check:static passed, diff --check clean. Exact-head CI checks succeeded and unresolved review threads: 0. Approved for this head only.

@immakermatty
immakermatty merged commit 8d1ae57 into main Oct 18, 2026
7 checks passed
immakermatty added a commit that referenced this pull request Oct 18, 2026
…ining sentences (F56 addendum, DEV-6612) (#502)

* Shell: the guide engine, its six principles and the lazurio.guide.* v1 protocol (F56)

The host's shell now draws the guide of root decision 0180's addendum of
2026-10-18: a "?" (data-guide-help) makes the neutral guide of Lazurio, and
later Buddy, ring a real element and say a few words beside it. guide.ts
decides what plays and when over seams, guide-layer.ts draws it in
<lazurio-buddy>'s own shadow root (ring, mark, card, placement, motion with
prefers-reduced-motion, Escape and focus), guide-content.ts holds the six
principles in Czech and English with the prototype's ids and rules, and
parses what a host hands over with provideGuides. The bubble's placement
rule moves unchanged from src/launchpad/tour-placement.ts to
src/shell/guide-placement.ts, and the tour uses it from there; the tour and
the guide never run at once (guideAttention).

Interface v1 grows by <lazurio-buddy lang>, the marks data-guide and
data-guide-help, the event lazurio-guide and the export provideGuides.
Without explanations handed over and without a Buddy origin the element
draws and listens to nothing, so the forks are unchanged. The pure
protocol for Buddy's frame (guide-protocol.ts) ships with its vectors in
F50's format, but no message listener is registered until Buddy has an
origin (plan DEV-6612 M7).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Launchpad: Soubory explains itself with a "?" and loses its explaining sentences (F56)

Soubory is the first page with the shell's guide: a "?" right after its
heading in the breadcrumb plays the principle "files", and in a Team
Environment the Launchpad's own "files-team" (the folder is the Team's),
chosen by the Environment's kind alone (#499). The page hands its
explanations over with provideGuides on every move, places
<lazurio-buddy lang>, and marks the Files item (nav-files) and the list
(files-list). The tour tells the guide whether Začínáme wants attention
and nudges its own bubble when a "?" asks meanwhile; Recovery mode
withdraws the guide.

The sentences the "?" replaces go in the same change: the introduction
("Složka Dokumenty tohoto Prostředí. Agenti sem ukládají…"), the Team note
("Toto Týmové Prostředí je sdílené…"), and the empty Documents folder now
says only "Zatím žádné soubory." / "No files yet.". Every other page gets
its "?" in the next slice of plan DEV-6612.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56, the guide drawn by the host's shell, and how a host takes part

F56 records root decision 0180's addendum of 2026-10-18 for the Platform:
the engine and the six principles in the shell, a page's explanations in
its host (variant C2), the five additions to interface v1 and why each,
the lazurio.guide.* v1 protocol with its acceptance rules and vectors,
the arbiter with the onboarding tour, Soubory as the first page, the
alternatives, honest limits and how it was verified.
docs/launchpad-development.md describes the modules, how a host takes
part, the Files page without its explaining sentences and the placement
rule's new place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Guide: a <lazurio-buddy> detached mid-explanation ends it as any other end does, clearing its layer

Pablo's review of #501: detaching the element that drew an explanation
cleared `playing` without telling its layer to draw nothing, so the
layer's document listeners and 250 ms timer kept running, and a
reattached element skipped the first-show setup (focus, URL snapshot).
`detach` now ends the explanation through `end("closed")`, the same path
`provide(null)` takes. A regression test covers detach and reattach; it
fails on the previous code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Guide: the card links an explanation's documentation at its last step (F56 addendum)

The approved wireframe's guide card has a quiet "Dokumentace" link at an
explanation's last step, where a page's link to its documentation went;
F56's engine had no place for it, and Integrace's "Jak to funguje" is to
move from the page's corner into the card. An explanation now carries
`docs`: the principle "integrations" has the documentation of Integrace in
each language, and a host may hand one over with an explanation, only as an
https address with a host and no credentials (else the entry is left out).
The layer draws it at the last step, in a new tab ("Dokumentace" /
"Documentation"). provideGuides' explanation grows by one optional member,
additive within interface v1.

The rules of a text no longer count "MCP server", the precise name of a
thing, as the forbidden "server".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Launchpad: Apps, Integrace and Trezor explain themselves with a "?" and lose their explaining sentences (F56 addendum)

Every page of the Apps column now has one "?" right after its heading
(pageHelpOf): the Apps home plays the principle "environment"; Integrace
the principle "integrations", where Composio is allowed the Launchpad's
"integrations-composio" and on Vlastní "integrations-custom", each with the
page's documentation in the card; Trezor what is true of this
Environment's vault, chosen only from facts the page has (#499): the
principle "vault" in a Personal Environment, the Launchpad's "vault-agents"
where nobody who enters is added to the vault (a Team or Automated
Environment, a vault without the Lazurio sign-in yet) and while that is not
known, and the approved video "vault-overview" in place where the person is
in the vault or the Environment has none (page-help.ts).

Removed in both languages: Integrace's line under the title and its
corner's "Jak to funguje", Trezor's rule and the section of an Environment
without a vault, whose video the "?" now opens. The vault page's model
lost the two members that drew them and reports what it read; the pages
carry the marks the principles look for (browser, nav-integrations,
nav-vault, vault-row, vault-open, composio-apps) and Integrace draws its
own (integration-on, integration-connect, mcp-list, mcp-add).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56 addendum, every page of the Apps column has its "?" and loses its explaining sentences

Records what Apps, Integrace and Trezor play, the card's documentation
link, how Trezor's variant is chosen from the vault core's answer, the
person's place in the vault and the kind (#499), why its approved video
plays in the page rather than in the card, exactly what changed on the
vault page, and the limits; launchpad-development.md describes the page
help, its marks and the browser check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Trezor: the connect lead says it naturally, and the Czech guard forbids "jen vám" and "jen pro vás"

The DEV-6631 vault lead's review of #502: the lead of a Personal
Environment's Bitwarden connection said "Ten váš zůstane jen pro vás.",
the phrasing Matěj banned on 2026-10-17 as unnatural Czech. It now says
"Agenti dostanou vlastní účet a do toho vašeho nevidí." / "Your agents
get their own account and can't see into yours." (the vault lead's words).

The Czech guard of tests/environment-wording.test.ts allowed "jen vám" by
the rule of 2026-10-14 and never matched "jen pro vás"; both are
forbidden now, so the phrase cannot come back. vaultHelp's comment also
names the fault reasons, which play the video too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Trezor: the "?" waits for the vault's state in every kind, and plays the video only for a member

Pablo's review of #502. vaultHelp returned "vault" for a Personal
Environment before it checked whether GET /api/vault had answered, so the
Personal Trezor's "?" showed before the page knew its state; the unread
guard now comes first, in every kind. And any known membership, a person
removed in the vault included, played the approved video, whose story is
sharing from one's own Bitwarden into the vault: only a member does that
now; no account or no master password yet, removed, and every other
non-member state hear "vault-agents".

What each "?" shows is now pure (pageHelpStates), and ui.ts sets it on the
buttons, so the page's transition is tested where it is decided: every "?"
hidden while the vault is unread, the header's playing "vault" once it
answered, the video for a member, "vault-agents" for a removed person.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Settings: Escape closes the guide's explanation and the page stays

Pablo's review of #502. Escape leaves Settings for the Apps home, and the
shell's listener is registered when the page loads, before the guide's,
which is added only when an explanation opens; so the guide's
preventDefault came too late and Escape on a Settings section with an
explanation open navigated home. The shell now asks the guide first
(createShell's `guiding`, the arbiter's `playing`), through the pure
escapeLeavesSettings, which the regression test covers with the guide
open, a dialog, a field being typed in and every other view.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56 addendum, Trezor's "?" waits in every kind, the video only for a member, Escape is the guide's

Records the three corrections of Pablo's review of #502 in the addendum
and launchpad-development.md: the unread guard before the kind, only a
member hears the approved video, and Escape on Settings closes an open
explanation (escapeLeavesSettings, pageHelpStates).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Settings: escapeLeavesSettings stands above the frame's comment

The previous commit put the function between createShell and the
comment that describes it; the comment is createShell's again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
immakermatty added a commit that referenced this pull request Oct 18, 2026
…ntences (F56 addendum, DEV-6612) (#503)

* Shell: the guide engine, its six principles and the lazurio.guide.* v1 protocol (F56)

The host's shell now draws the guide of root decision 0180's addendum of
2026-10-18: a "?" (data-guide-help) makes the neutral guide of Lazurio, and
later Buddy, ring a real element and say a few words beside it. guide.ts
decides what plays and when over seams, guide-layer.ts draws it in
<lazurio-buddy>'s own shadow root (ring, mark, card, placement, motion with
prefers-reduced-motion, Escape and focus), guide-content.ts holds the six
principles in Czech and English with the prototype's ids and rules, and
parses what a host hands over with provideGuides. The bubble's placement
rule moves unchanged from src/launchpad/tour-placement.ts to
src/shell/guide-placement.ts, and the tour uses it from there; the tour and
the guide never run at once (guideAttention).

Interface v1 grows by <lazurio-buddy lang>, the marks data-guide and
data-guide-help, the event lazurio-guide and the export provideGuides.
Without explanations handed over and without a Buddy origin the element
draws and listens to nothing, so the forks are unchanged. The pure
protocol for Buddy's frame (guide-protocol.ts) ships with its vectors in
F50's format, but no message listener is registered until Buddy has an
origin (plan DEV-6612 M7).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Launchpad: Soubory explains itself with a "?" and loses its explaining sentences (F56)

Soubory is the first page with the shell's guide: a "?" right after its
heading in the breadcrumb plays the principle "files", and in a Team
Environment the Launchpad's own "files-team" (the folder is the Team's),
chosen by the Environment's kind alone (#499). The page hands its
explanations over with provideGuides on every move, places
<lazurio-buddy lang>, and marks the Files item (nav-files) and the list
(files-list). The tour tells the guide whether Začínáme wants attention
and nudges its own bubble when a "?" asks meanwhile; Recovery mode
withdraws the guide.

The sentences the "?" replaces go in the same change: the introduction
("Složka Dokumenty tohoto Prostředí. Agenti sem ukládají…"), the Team note
("Toto Týmové Prostředí je sdílené…"), and the empty Documents folder now
says only "Zatím žádné soubory." / "No files yet.". Every other page gets
its "?" in the next slice of plan DEV-6612.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56, the guide drawn by the host's shell, and how a host takes part

F56 records root decision 0180's addendum of 2026-10-18 for the Platform:
the engine and the six principles in the shell, a page's explanations in
its host (variant C2), the five additions to interface v1 and why each,
the lazurio.guide.* v1 protocol with its acceptance rules and vectors,
the arbiter with the onboarding tour, Soubory as the first page, the
alternatives, honest limits and how it was verified.
docs/launchpad-development.md describes the modules, how a host takes
part, the Files page without its explaining sentences and the placement
rule's new place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Guide: a <lazurio-buddy> detached mid-explanation ends it as any other end does, clearing its layer

Pablo's review of #501: detaching the element that drew an explanation
cleared `playing` without telling its layer to draw nothing, so the
layer's document listeners and 250 ms timer kept running, and a
reattached element skipped the first-show setup (focus, URL snapshot).
`detach` now ends the explanation through `end("closed")`, the same path
`provide(null)` takes. A regression test covers detach and reattach; it
fails on the previous code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Guide: the card links an explanation's documentation at its last step (F56 addendum)

The approved wireframe's guide card has a quiet "Dokumentace" link at an
explanation's last step, where a page's link to its documentation went;
F56's engine had no place for it, and Integrace's "Jak to funguje" is to
move from the page's corner into the card. An explanation now carries
`docs`: the principle "integrations" has the documentation of Integrace in
each language, and a host may hand one over with an explanation, only as an
https address with a host and no credentials (else the entry is left out).
The layer draws it at the last step, in a new tab ("Dokumentace" /
"Documentation"). provideGuides' explanation grows by one optional member,
additive within interface v1.

The rules of a text no longer count "MCP server", the precise name of a
thing, as the forbidden "server".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Launchpad: Apps, Integrace and Trezor explain themselves with a "?" and lose their explaining sentences (F56 addendum)

Every page of the Apps column now has one "?" right after its heading
(pageHelpOf): the Apps home plays the principle "environment"; Integrace
the principle "integrations", where Composio is allowed the Launchpad's
"integrations-composio" and on Vlastní "integrations-custom", each with the
page's documentation in the card; Trezor what is true of this
Environment's vault, chosen only from facts the page has (#499): the
principle "vault" in a Personal Environment, the Launchpad's "vault-agents"
where nobody who enters is added to the vault (a Team or Automated
Environment, a vault without the Lazurio sign-in yet) and while that is not
known, and the approved video "vault-overview" in place where the person is
in the vault or the Environment has none (page-help.ts).

Removed in both languages: Integrace's line under the title and its
corner's "Jak to funguje", Trezor's rule and the section of an Environment
without a vault, whose video the "?" now opens. The vault page's model
lost the two members that drew them and reports what it read; the pages
carry the marks the principles look for (browser, nav-integrations,
nav-vault, vault-row, vault-open, composio-apps) and Integrace draws its
own (integration-on, integration-connect, mcp-list, mcp-add).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56 addendum, every page of the Apps column has its "?" and loses its explaining sentences

Records what Apps, Integrace and Trezor play, the card's documentation
link, how Trezor's variant is chosen from the vault core's answer, the
person's place in the vault and the kind (#499), why its approved video
plays in the page rather than in the card, exactly what changed on the
vault page, and the limits; launchpad-development.md describes the page
help, its marks and the browser check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Launchpad: every section of Settings explains itself with a "?" and loses its explaining sentences (F56 addendum)

Začínáme (only where it has the basics), Obecné, Komunikace agentů, Toto
<kind> Prostředí, Nástroje, the devices section and Obnova now each have
the header's "?" right after their heading, playing the Launchpad's
explanation: the wireframe's settings-* where it has the section, a Team
Environment's own for Komunikace, Nástroje and the devices, and on your
computer its own words for Toto Prostředí. Their marks are on the page or
drawn by the panels once read (the AI and GitHub steps, the first sign-in
and "Používají agenti", the recovery result and checks).

Removed in both languages: Začínáme's GitHub line and the Composio and
Bitwarden rows' lines, Obecné's four row descriptions, Komunikace's
introduction, Team line and hint, Nástroje's "Zjištěno v", tier notes, Team
note and custom MCP line, the devices section's introduction, Team note,
prompt note and computer note, and Obnova's explanations of the repair
agent, the evidence and the issue. Escape closes an explanation on a
Settings section instead of leaving Settings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56 addendum (2), every section of Settings has its "?" and loses its explaining sentences

Records what each section plays, what was removed and what was kept and
why, the marks, and Escape's new owner while the guide explains;
launchpad-development.md lists the sections' explanations and marks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Trezor: the connect lead says it naturally, and the Czech guard forbids "jen vám" and "jen pro vás"

The DEV-6631 vault lead's review of #502: the lead of a Personal
Environment's Bitwarden connection said "Ten váš zůstane jen pro vás.",
the phrasing Matěj banned on 2026-10-17 as unnatural Czech. It now says
"Agenti dostanou vlastní účet a do toho vašeho nevidí." / "Your agents
get their own account and can't see into yours." (the vault lead's words).

The Czech guard of tests/environment-wording.test.ts allowed "jen vám" by
the rule of 2026-10-14 and never matched "jen pro vás"; both are
forbidden now, so the phrase cannot come back. vaultHelp's comment also
names the fault reasons, which play the video too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Trezor: the "?" waits for the vault's state in every kind, and plays the video only for a member

Pablo's review of #502. vaultHelp returned "vault" for a Personal
Environment before it checked whether GET /api/vault had answered, so the
Personal Trezor's "?" showed before the page knew its state; the unread
guard now comes first, in every kind. And any known membership, a person
removed in the vault included, played the approved video, whose story is
sharing from one's own Bitwarden into the vault: only a member does that
now; no account or no master password yet, removed, and every other
non-member state hear "vault-agents".

What each "?" shows is now pure (pageHelpStates), and ui.ts sets it on the
buttons, so the page's transition is tested where it is decided: every "?"
hidden while the vault is unread, the header's playing "vault" once it
answered, the video for a member, "vault-agents" for a removed person.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Settings: Escape closes the guide's explanation and the page stays

Pablo's review of #502. Escape leaves Settings for the Apps home, and the
shell's listener is registered when the page loads, before the guide's,
which is added only when an explanation opens; so the guide's
preventDefault came too late and Escape on a Settings section with an
explanation open navigated home. The shell now asks the guide first
(createShell's `guiding`, the arbiter's `playing`), through the pure
escapeLeavesSettings, which the regression test covers with the guide
open, a dialog, a field being typed in and every other view.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56 addendum, Trezor's "?" waits in every kind, the video only for a member, Escape is the guide's

Records the three corrections of Pablo's review of #502 in the addendum
and launchpad-development.md: the unread guard before the kind, only a
member hears the approved video, and Escape on Settings closes an open
explanation (escapeLeavesSettings, pageHelpStates).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Settings: escapeLeavesSettings stands above the frame's comment

The previous commit put the function between createShell and the
comment that describes it; the comment is createShell's again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Nástroje: the guide's steps on connecting and on the switch always name something the page draws

Pablo's review of #503. "tool-connect" sat only on the first sign-in
button and "tool-agents" only on a switch, so an Environment where every
tool is signed in already (curatedActions offers no sign-in then), and a
Team Environment whose gh works as the Organization's identity, left the
steps on connecting pointing at nothing. toolGuideTargets (tools-view.ts)
now chooses from what the page draws, in its order: the first sign-in or
adding and connecting, else the first connection already made (its line,
never gh of a Team Environment), else a tool's line; the first switch
"Používají agenti", else a required tool's "Vždy zapnuto". The panel puts
the marks on exactly those, and the test covers a sign-in to make, all
signed in, a Team Environment with and without a team account, and the
rows that are no person's sign-in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Settings: what no step of the "?" says stays beside its choice

Pablo's review of #503. Three removed sentences carried meaning no step of
their section's explanation carries, so they are back beside the choice
they explain, in both languages:

- Začínáme's optional rows Composio ("Pošta, kalendář a další aplikace pro
  agenty.") and Trezor v Bitwardenu ("Hesla z Trezoru Prostředí i v Codex
  Desktopu a ve vašem prohlížeči."), as SSH and Codex Desktop kept theirs;
- Obecné's preset hint "Druh tohoto Prostředí.", which settings-general's
  four steps do not name;
- Obnova's evidence note "Jen sanitizovaná strukturovaná pole, přesně jak je
  nese připravené issue.", where a person decides whether to file it to the
  public repository.

A test holds them on the page and in the words, and that Obecné's steps
still leave the preset to its hint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56 addendum (2), what stays beside its choice and where Nástroje's steps point

Records the corrections of Pablo's review of #503: the kept lines of
Začínáme's optional rows, Obecné's preset hint and Obnova's evidence note,
the marks of Nástroje chosen by toolGuideTargets, and that Escape on
Settings came with #502.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Nástroje: the "?" says only what the page can show, never a sign-in where nobody can sign in

Pablo's review of #503 (eab0b19). In a Team Environment with gh alone,
toolGuideTargets fell back to gh's line, so "Přihlašujte se tu týmovými
účty" and "Co přihlásíte, může používat každý z Teamu" pointed at the
Organization's app identity, which signs nobody in. The targets are now
only what a person can use: a sign-in (or adding and connecting) or a
connection someone made, and a switch that moves; never gh of a Team
Environment, a tool the Organization does not allow, a vault's or
Executor's row; null where there is none, and no fallback.

The steps follow those facts, as Trezor's follow the vault: the tools
panel reports its targets through a `drawn` hook (PageGuideFacts.tools),
and toolsGuide leaves out the two steps on connecting where nothing can be
connected and the switch's step where nothing moves, keeping what the
page is and, in a Team Environment, that the Team shares it. Until the
tools are read the "?" stays hidden. Tests render the chain the page uses
(toolGroups, toolGuideTargets, pageGuide) and assert each step's words, its
mark and what the mark is on: a Team Environment with gh alone (one step),
with a team account connected or to connect, a Work Environment with a
sign-in to make, everything connected, and a tool the Organization does
not allow; and the "?" hidden while unread.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Docs: F56 addendum (2), Nástroje's steps follow what its page can show

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Guide: Nástroje's switch step takes the same rows as its connect steps, never the vault's, Executor's or an unoffered tool's

Pablo's review of #503 (round 3): `toolGuideTargets` excluded the vault and
Executor rows and tools not offered here only for `connect`. The switch
step could still land on Trezor v Bitwardenu's row or on a switched-on
tool this Environment does not offer (listed only so it can be switched
off). Both steps now take their rows from one eligible list. The test
renders a Team Environment with gh and the vault row, with an unoffered
switched-on tool, and both, and asserts the targets and the resulting
steps; it fails on the previous code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@immakermatty
immakermatty deleted the agent/DEV-6612-guide-engine branch October 18, 2026 20:29
immakermatty added a commit that referenced this pull request Oct 19, 2026
… in Apps, three kinds of words, the theme

Brings #467 up to date with main (dbee5f6) after the guide F56 (#501-#503,
#509), Apps → Trezor (#495, #500), three kinds of Environment (#497), one
colour theme per Environment (#493) and the tour's gear stop (#475).

One textual conflict, in scripts/preview-launchpad.ts: main's `team` flag
for a hosted Team Environment and this branch's `workspace-tabs` flag sit
side by side; each keeps its own option. The section head keeps main's
accent colour (`--lz-accent`, #493) for its flag and rule.

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