Repository navigation
Decisions: 0210 addendum 2026-10-25, Buddy's chat is a plain conversation and Lazurio presets his settings (DEV-6676) - #648
Conversation
…tion and Lazurio presets his settings (DEV-6676) Matěj decided on 2026-10-25 that Buddy's chat offers no model, reasoning effort or access choice, and that Buddy always works with full access. The only choice under the composer is a Normal / Fast switch: Hermes's fast mode answers sooner and uses more of Buddy's subscription. The Lazurio Platform sets the model, effort, context, steps per turn and compression in the three profiles of the 0210 night addendum, point 9. The person switches profiles in Nastavení → Buddy. Every profile uses the current Sol model, today GPT-6.1-Sol, and Lazurio moves Buddy to a newer Sol with a Platform release. Chat and bots keep their own model and effort choice. Co-Authored-By: Claude Opus 5.5 <[email protected]>
… (DEV-6676) Co-Authored-By: Claude Opus 5.5 <[email protected]>
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a2f0ceb31e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
agentrozjedemeai
left a comment
There was a problem hiding this comment.
Exact-head review: a2f0ceb (base at request 13776b5). The decision text itself matches the inline dated addendum pattern, preserves 0210 point 4 and the night addendum points 9/10, leaves 0211 intact, and contains no client Organization or Environment in its added text. The Codex thread claiming the profile contract is absent is incorrect: the three profiles, default Důkladný, settings and Buddy's own ChatGPT sign-in are stated in the 0210 night addendum below the table in manual/decision-register.md:164.
Blocking integration: live main fe4c4d9 has advanced and this head is DIRTY. The exact-head git merge-tree --write-tree fe4c4d9 a2f0ceb exits 1 with a content conflict in manual/decision-register.md (adjacent 0210/0213 changes); GitHub also reports mergeStateStatus=DIRTY. Please integrate current main into the PR branch and retain both the 0210 and 0213 decisions, then rerun checks and request a fresh exact-head review. If Publication is after 2026-10-25, adjust the addendum date in that new head as Matěj specified.
Verification: git diff --check passed; bun run check:docs passed (docs lane and agent-skills Doctor); all six current CI checks are successful. No earlier approval was reused. One unresolved Codex thread remains; it should be adjudicated against the in-repository night addendum before merge. No merge, push or release performed.
…ull request, not a date The root decision register dates an addendum by the day of its Publication. For this one that is no longer 2026-10-25, the day Matěj decided. The comments, the runbook and the contract test now name it by HumanAndMachines/Lazurio#648, so they stay right whatever day it is published. No behaviour changes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…13 and 0214 changes and this PR's 0210 addendum The conflict was adjacent rows only: main extended the 0209 row and this branch the 0210 row. Each side's row is taken whole; nothing else changes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…and names the night addendum it builds on (DEV-6676)
The register dates an addendum by the day of its Publication; Matěj
decided on 2026-10-25, and his quote keeps that date. Points 9 and 10 are
now cited as those of the 0210 addendum of the night of 2026-10-20 and
2026-10-21 ("Buddy koordinuje a jeho pomocníci jsou boti") below the
table, which defines the three profiles and Buddy's own sign-in, so no
reader needs anything outside this repository.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
agentrozjedemeai
left a comment
There was a problem hiding this comment.
@immakermatty — exact-head QA pro #648 na 0cbd075 proti main ba407be. Předchozí jediný blokátor (konflikt s main) je odstraněn.
Ověření: merge commit 2551794 má rodiče a2f0ceb a ba407be; vůči ba407be mění jen manual/decision-register.md a jen řádek 0210. Řádky 0209, 0211, 0213 a 0214 jsou na tomto headu byte-for-byte shodné s main. Konfliktní 0209 odpovídá celý main, 0210 v merge commitu odpovídá celý dřívějšímu PR headu; git merge-tree --write-tree ba407be 0cbd075 uspěl.
Commit 0cbd075 mění pouze vlastní dodatek 0210: datum Publikace je 2026-10-26, citace Matějova rozhodnutí zůstává 2026-10-25. Bod 10 je nově odkázán přes datum 2026-10-20/21 a název nočního dodatku pod tabulkou; body 9 a 10 jsou tam skutečně dostupné. Původní text rozhodnutí 0210 včetně bodu 4 zůstává beze změny, stejně jako noční body 9/10 a 0211. Dodatek zachovává jednoduchý chat bez voleb modelu/úsilí/přístupu, přepínač Normální/Rychlý, profily v Nastavení → Buddy, výchozí Důkladný a samostatné přihlášení Buddyho. V přidaném textu nejsou konkrétní klientské Organizace, citlivé cesty ani secrets.
Lokálně v samostatném čistém klonu: git diff --check origin/main...HEAD i git diff --check PASS; bun run check:docs PASS (docs lane a agent-skills Doctor); bun run pr:preflight -- --json vrací ready_to_push, ahead 4/behind 0. Live CI na tomto SHA: 6/6 SUCCESS; mergeable=MERGEABLE; Codex vlákno je zodpovězené a resolved, 0 unresolved. MergeStateStatus=BLOCKED před tímto review odpovídal mému starému CHANGES_REQUESTED.
APPROVED pro tento exact head. Toto review není merge ani release. Pokud se Publikace přesune za 2026-10-26, aktualizujte datum dodatku v novém commitu a vyžádejte nový exact-head verdict.
…ision 0210's addendum by its pull request Pablo's round 3 found the runbook still dating the model-and-effort rule "dodatek z 2026-10-25". Every mention of root decision 0210's plain-chat addendum in the runbook now names HumanAndMachines/Lazurio#648; the host appearance, which that addendum does not cover, is Matěj's request of 2026-10-25. Row 23 keeps its length, so the table keeps its padding. The LazurioPlatform F60 references stay. No behaviour changes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ull request, not a date The root decision register dates an addendum by the day of its Publication. For this one that is no longer 2026-10-25, the day Matěj decided. The comments, the runbook and the contract test now name it by HumanAndMachines/Lazurio#648, so they stay right whatever day it is published. No behaviour changes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ision 0210's addendum by its pull request Pablo's round 3 found the runbook still dating the model-and-effort rule "dodatek z 2026-10-25". Every mention of root decision 0210's plain-chat addendum in the runbook now names HumanAndMachines/Lazurio#648; the host appearance, which that addendum does not cover, is Matěj's request of 2026-10-25. Row 23 keeps its length, so the table keeps its padding. The LazurioPlatform F60 references stay. No behaviour changes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…n a new tab Root decision 0210's addendum of HumanAndMachines/Lazurio#648 makes Buddy's chat only the conversation, so Buddy's surface now shows no right panel of T3, whatever the thread holds. ChatView reads the thread's panel there as closed and empty (buddyRightPanelState), so neither the panel stored for the thread, nor a link taken into it, nor a page an agent showed opens it, and the chat column never gives way to a maximized panel. The surface does not follow the thread's Environment browser tabs either. A web link in the conversation opens in a new browser tab, without an opener or referrer, never in T3's preview or right panel: Buddy's surface takes the chat's `_blank` http(s) links in the window's capture phase, before the chat's own handler and the Environment browser's. A click with a modifier goes to the browser as on any page. With no right panel on the surface, the previous commit's seams for the panel's terminal tabs, its terminal toggle and Terminal in "+" are moot and gone; the drawer, the thread's terminal state and Run in terminal stay. Outside Buddy's T3 Code nothing changes. Browser tests show a stored open panel drawn in T3 and not in Buddy's surface, and a link in Buddy's reply opened in a new tab while T3's handlers never see the click, against T3's own handling outside the surface. The contract test, the allowlist comment, the runbook and the overlay specification describe the seams. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210's addendum of HumanAndMachines/Lazurio#648 makes Buddy's chat only the conversation, yet Buddy's surface drew T3's terminal drawer under it whenever the thread's stored terminal state was open: after a drawer was opened on Buddy's thread earlier, or after a shell code block's Run in terminal in Buddy's reply, which runs the command in a new shell in Buddy's folder and opens the drawer. Drawing the drawer also attached to the thread's terminal, which starts a shell where none runs. In Buddy's surface the chat now reads the thread's drawer as closed (buddyTerminalUiState), so the composer keeps its focus, and draws no terminal drawer at all, not even one still closing or one of another thread. The right panel shows none of the terminals the thread holds there (buddyPanelSurfaces, with the first tab left in front where a terminal was), no terminal toggle where it puts its controls, and no Terminal to open from "+" or Nová karta's tools. Buddy's replies get no Run in terminal on a shell code block, through the timeline's shared row state. Nothing is closed or stopped: the stored state and the server's shells stay as they are, so a terminal opened elsewhere keeps running on the server. Outside Buddy's T3 Code nothing changes. Browser tests render T3's real drawers, with a stand-in for the emulator, and the real timeline: with the thread's terminal open, Buddy's surface shows no drawer and T3 shows it, and a shell code block offers no Run in terminal in Buddy's reply but keeps it in T3's. The contract test, the allowlist comment and the runbook describe the new seams in ChatView.tsx and MessagesTimeline.tsx. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…n a new tab Root decision 0210's addendum of HumanAndMachines/Lazurio#648 makes Buddy's chat only the conversation, so Buddy's surface now shows no right panel of T3, whatever the thread holds. ChatView reads the thread's panel there as closed and empty (buddyRightPanelState), so neither the panel stored for the thread, nor a link taken into it, nor a page an agent showed opens it, and the chat column never gives way to a maximized panel. The surface does not follow the thread's Environment browser tabs either. A web link in the conversation opens in a new browser tab, without an opener or referrer, never in T3's preview or right panel: Buddy's surface takes the chat's `_blank` http(s) links in the window's capture phase, before the chat's own handler and the Environment browser's. A click with a modifier goes to the browser as on any page. With no right panel on the surface, the previous commit's seams for the panel's terminal tabs, its terminal toggle and Terminal in "+" are moot and gone; the drawer, the thread's terminal state and Run in terminal stay. Outside Buddy's T3 Code nothing changes. Browser tests show a stored open panel drawn in T3 and not in Buddy's surface, and a link in Buddy's reply opened in a new tab while T3's handlers never see the click, against T3's own handling outside the surface. The contract test, the allowlist comment, the runbook and the overlay specification describe the seams. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch; T3 applies no model or effort to Buddy's sessions (AcpT3Selection) and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. - In the bubble the surface wears the host page's appearance, also over a saved single-appearance theme. Outside it, the composer keeps the corner of Buddy's launcher free (index.html, --lazurio-buddy-clearance). The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. T3 no longer re-applies its theme from useTheme's effect (pingdotgg#25007, pingdotgg#25461), so the host-appearance stand-in follows every application of T3's saved theme through subscribeRenderedAppearance; the theme tests apply T3's stored appearance as app start does. The ACP adapter keeps the selection gate beside upstream's flavor hook (pingdotgg#24605). Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. The timeline mask keeps upstream's pending approvals footer, which reads the final rows. useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. The timeline mask keeps upstream's pending approvals footer, which reads the final rows. useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. The timeline mask keeps upstream's pending approvals footer, which reads the final rows. useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
On v0.1.7 the ACP adapter filters T3's options through the flavor's own
options and a runtime-mode ceiling (flatMap); the AcpT3Selection gate is
one more early return there, after the flavor's owned options and before
the ceiling. The runtime notes, which upstream now builds from the active
session setup, stay behind sendsT3Instructions. Effect 4.1.2 dropped
effect/Crypto, so the adapter imports Context beside upstream's
SecureRandom, and the Buddy tests provide NodeCrypto beside NodeServices.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. On v0.1.7: upstream wraps the timeline in `WorkspaceMutationIdContext`, so `buddyBackgroundWork` sits inside it after `isWorking`. Upstream now passes `environmentId` to the banner lane itself, so the overlay drops its own copy of that prop and only uses it for Buddy's error banner. The work line outside Buddy reads "Running · <label>" and "Waiting · <label>" on v0.1.7, and the timeline test pins those. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
On v0.1.7 the ACP adapter filters T3's options through the flavor's own
options and a runtime-mode ceiling (flatMap); the AcpT3Selection gate is
one more early return there, after the flavor's owned options and before
the ceiling. The runtime notes, which upstream now builds from the active
session setup, stay behind sendsT3Instructions. Effect 4.1.2 dropped
effect/Crypto, so the adapter imports Context beside upstream's
SecureRandom, and the Buddy tests provide NodeCrypto beside NodeServices.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. On v0.1.7: upstream wraps the timeline in `WorkspaceMutationIdContext`, so `buddyBackgroundWork` sits inside it after `isWorking`. Upstream now passes `environmentId` to the banner lane itself, so the overlay drops its own copy of that prop and only uses it for Buddy's error banner. The work line outside Buddy reads "Running · <label>" and "Waiting · <label>" on v0.1.7, and the timeline test pins those. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
On v0.1.7 the ACP adapter filters T3's options through the flavor's own
options and a runtime-mode ceiling (flatMap); the AcpT3Selection gate is
one more early return there, after the flavor's owned options and before
the ceiling. The runtime notes, which upstream now builds from the active
session setup, stay behind sendsT3Instructions. Effect 4.1.2 dropped
effect/Crypto, so the adapter imports Context beside upstream's
SecureRandom, and the Buddy tests provide NodeCrypto beside NodeServices.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. On v0.1.7: upstream wraps the timeline in `WorkspaceMutationIdContext`, so `buddyBackgroundWork` sits inside it after `isWorking`. Upstream now passes `environmentId` to the banner lane itself, so the overlay drops its own copy of that prop and only uses it for Buddy's error banner. The work line outside Buddy reads "Running · <label>" and "Waiting · <label>" on v0.1.7, and the timeline test pins those. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
On v0.1.7 the ACP adapter filters T3's options through the flavor's own
options and a runtime-mode ceiling (flatMap); the AcpT3Selection gate is
one more early return there, after the flavor's owned options and before
the ceiling. The runtime notes, which upstream now builds from the active
session setup, stay behind sendsT3Instructions. Effect 4.1.2 dropped
effect/Crypto, so the adapter imports Context beside upstream's
SecureRandom, and the Buddy tests provide NodeCrypto beside NodeServices.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. On v0.1.7: upstream wraps the timeline in `WorkspaceMutationIdContext`, so `buddyBackgroundWork` sits inside it after `isWorking`. Upstream now passes `environmentId` to the banner lane itself, so the overlay drops its own copy of that prop and only uses it for Buddy's error banner. The work line outside Buddy reads "Running · <label>" and "Waiting · <label>" on v0.1.7, and the timeline test pins those. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
On v0.1.7 the ACP adapter filters T3's options through the flavor's own
options and a runtime-mode ceiling (flatMap); the AcpT3Selection gate is
one more early return there, after the flavor's owned options and before
the ceiling. The runtime notes, which upstream now builds from the active
session setup, stay behind sendsT3Instructions. Effect 4.1.2 dropped
effect/Crypto, so the adapter imports Context beside upstream's
SecureRandom, and the Buddy tests provide NodeCrypto beside NodeServices.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. On v0.1.7: upstream wraps the timeline in `WorkspaceMutationIdContext`, so `buddyBackgroundWork` sits inside it after `isWorking`. Upstream now passes `environmentId` to the banner lane itself, so the overlay drops its own copy of that prop and only uses it for Buddy's error banner. The work line outside Buddy reads "Running · <label>" and "Waiting · <label>" on v0.1.7, and the timeline test pins those. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
On v0.1.7 the ACP adapter filters T3's options through the flavor's own
options and a runtime-mode ceiling (flatMap); the AcpT3Selection gate is
one more early return there, after the flavor's owned options and before
the ceiling. The runtime notes, which upstream now builds from the active
session setup, stay behind sendsT3Instructions. Effect 4.1.2 dropped
effect/Crypto, so the adapter imports Context beside upstream's
SecureRandom, and the Buddy tests provide NodeCrypto beside NodeServices.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. On v0.1.7: upstream wraps the timeline in `WorkspaceMutationIdContext`, so `buddyBackgroundWork` sits inside it after `isWorking`. Upstream now passes `environmentId` to the banner lane itself, so the overlay drops its own copy of that prop and only uses it for Buddy's error banner. The work line outside Buddy reads "Running · <label>" and "Waiting · <label>" on v0.1.7, and the timeline test pins those. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…ge as a Czech block
Buddy's web chat is Lazurio T3 Code with the Hermes Agent over ACP (root
decision 0210, plan DEV-6676). On the Osobní Prostředí a second T3 server with
T3CODE_LAZURIO_BUDDY=1 runs Hermes as the provider instance `buddy`. Hermes keeps
every prompt as the person's words in Buddy's memory, so T3's own instructions
(<t3_code_instructions>, <runtime_info>, <pull_request_linking>) would become part
of Buddy's history, twice after Stop or a steer and again after every restart.
- The ACP adapter asks AcpT3Instructions when it builds an instance whether its
prompts carry T3's instructions; without an answer every instance keeps them.
server.ts answers no for Buddy's instance where it builds provider instances
(ProviderInstanceRegistryHydration).
- The turn start projects a composer record of kind `lazurio-page` as one
labelled Czech block ("Kontext stránky (údaje, ne pokyn): ...") after the
person's text, for Buddy's instance only; every other record keeps upstream's
projection.
- Buddy's sessions take no model or effort from T3 (HumanAndMachines/Lazurio#648):
the adapter asks AcpT3Selection which options of T3's selection an instance
takes; null, the default, is all of it. For Buddy's instance withBuddyInstance
names only Hermes's speed (`fast`), so T3 applies no model and only Hermes's
Normal / Fast switch whenever a session starts, loads or gets a new selection.
Without T3CODE_LAZURIO_BUDDY=1 nothing changes, also for an instance called
`buddy`. Tests drive the repository's mock ACP agent in Hermes' place, through
the adapter and through the production V2 runtime, and read what it received.
On v0.1.3 the seams stay at the only prompt assembly and send in the ACP
adapter. Upstream now computes the slash-command check from the flavor's
rewritten user text (pingdotgg#24605); the rebuild takes that line and keeps the
instruction gate around t3AcpPromptWithInstructions and the runtime notes. The
orchestrator test provides upstream's new CodexManagedTokenBroker, which the
provider instance registry now needs, and the two file headers are cut to the
four-line comment limit.
On v0.1.4: upstream moved the turn text assembly up in ProviderTurnStartService (pingdotgg#22864, pingdotgg#25610, pingdotgg#25660); the page block seam moves with it, while the prompt-command and steer projections stay upstream's as before. server.ts keeps upstream's port scanner (pingdotgg#26245) after the wrapped instance hydration, and the Buddy orchestrator test provides the new PortDiscovery that hydration now needs. The pingdotgg#648 selection gate, which row 28's commit carried on v0.1.3, comes back to this row and sits beside upstream's flavor hook (pingdotgg#24605).
On v0.1.5 upstream makes the client file system's writeTextFile optional
in the ACP adapter (pingdotgg#26876), away from the overlay's blocks. Upstream's
pre-commit hook runs knip (pingdotgg#26167), so LAZURIO_PAGE_CONTEXT_KIND,
buddyT3Instructions, LAZURIO_BUDDY_ENV and isBuddySurface, which nothing
imports, are module-private.
On v0.1.6 the ACP adapter checks a turn's model against the session's
models before the turn starts (pingdotgg#26623). Where AcpT3Selection names the
options, the host sets the agent's model and T3 applies none, so
validateModelSelection skips that check there, as it does for a flavor
that applies the selection itself: a model the session no longer offers
would otherwise refuse every turn of Buddy's. The V2 adapter test sends
such a model and the turn runs. The adapter test imports upstream's
acpPerTurnPromptUsage beside AcpT3Selection.
On v0.1.7 the ACP adapter filters T3's options through the flavor's own
options and a runtime-mode ceiling (flatMap); the AcpT3Selection gate is
one more early return there, after the flavor's owned options and before
the ceiling. The runtime notes, which upstream now builds from the active
session setup, stay behind sendsT3Instructions. Effect 4.1.2 dropped
effect/Crypto, so the adapter imports Context beside upstream's
SecureRandom, and the Buddy tests provide NodeCrypto beside NodeServices.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root decision 0210, addendum of 2026-10-22, point 1, and its plain-chat addendum (HumanAndMachines/Lazurio#648; plan DEV-6676, row 28): the person sees and hears only what Buddy writes in human words. In Buddy's surface (lazurioBuddy) only: - The timeline keeps the messages and what the person acts on; T3's record of the work stays out. While a turn runs, or work still runs after it, one quiet static line says "Buddy na tom pracuje…" / "Buddy is on it…". A failed turn shows one human line, and the thread's error banner says "Něco se nepovedlo. Zkuste to prosím znovu." instead of T3's text. - None of the turn's work shows at the end of the timeline, and Buddy's queue holds and counts only the person's own messages, never an agent's such as Delegace's wake. - The composer is a message box ("Napište Buddymu…") whose only choice is Hermes's Normal / Fast switch, the one option row 23's AcpT3Selection lets through, and Buddy's thread keeps full access, which the server guard also holds. - The surface never shows T3's terminal or right panel, their keys stay the browser's, and a link in the conversation opens in a new browser tab. The terminal and right-panel states are read inside the store selectors, so the React Compiler keeps ChatView's panel presence values memoized (chatViewPanelPresence.test.ts guards it, #134). On v0.1.3 upstream moved the work banners and the queue to the end of the timeline and removed the composer's task list (pingdotgg#25401). The work items (childInputNow, goalNow, backgroundWorkNow) are masked on Buddy's surface with inline conditionals in ChatView's body, where hasThreadNow, ThreadNow and the scroll button's summary read them, so no plain function wraps a hook result in render. buddyBackgroundWork is whether backgroundWorkNow exists. useBuddyQueuedRunCount drops an agent's queued message from the footer's count, which upstream's getUserQueuedThreadRuns keeps, and buddyWorkBanners and the task-list seam are gone. useBuddyChatShortcuts takes upstream's `!backgroundThread` condition (pingdotgg#24847), ChatTerminalDrawers lost focusRequestId (pingdotgg#25009), the placeholder falls back to DEFAULT_COMPOSER_PLACEHOLDER, and ReopenClosedViewShortcut stays off on the slimmer root. Effects carry justified react-effect-budget suppressions and comments are cut to the four-line limit. The error banner asks about the thread's own Environment (ChatBannerLane passes it), so a thread of another Environment keeps T3's own text. On v0.1.4: upstream dropped the resting composer's control strip, so Buddy's composer hook only gives the placeholder and hasControls is gone; Buddy's controls still replace T3's in ComposerControlsBar ahead of upstream's controls ownership. Upstream shows an approval on its own row (pingdotgg#26255); Buddy's mask leaves no work rows, so the approval falls to upstream's footer for unmatched approvals, and a browser test shows a pending approval there with Approve and Decline and no work row or quiet line. The link_request card stays off Buddy's surface, where link requests are refused (row 25). useChatShortcuts no longer exports its input type, so the overlay takes it from the hook. The tests follow upstream's props and labels: no activeTurnInProgress or onRollbackCheckpoint, the queue's "1 queued message", background work rows with turn items and "Running …" / "Waiting on …" titles, and a single subagent as a [data-v2-item-type=subagent] row. Effect suppressions use the renamed no-unreasoned-state-sync rule. Row 23's AcpT3Selection, row 25's host appearance and row 7's launcher clearance, which this commit carried on v0.1.3, are back in their rows. On v0.1.6 useThreadLifecycle returns attentionNow, which is the run's Stop once it went unanswered (Force stop, pingdotgg#27252) and the child's question otherwise, and workNow, which is the Stop while it is under way and the background work otherwise; backgroundWorkNow is gone. The inline mask hides the child's question, the work and the goal on Buddy's surface, while an unanswered Stop still shows there, so the person can force it; the contract test pins every mask line, including that one, and useThreadLifecycle's return. buddyBackgroundWork is whether workNow exists. Upstream's provider traits menu content (renderProviderTraitsMenuContent, pingdotgg#28057 and pingdotgg#28076) is not needed in ComposerControlsBar, which on Buddy's surface returns BuddyComposerControls before it. A side chat (pingdotgg#26901) renders ChatView embedded, so the thread tabs and terminal drawers are off for it as they are on Buddy's surface. On v0.1.7: upstream wraps the timeline in `WorkspaceMutationIdContext`, so `buddyBackgroundWork` sits inside it after `isWorking`. Upstream now passes `environmentId` to the banner lane itself, so the overlay drops its own copy of that prop and only uses it for Buddy's error banner. The work line outside Buddy reads "Running · <label>" and "Waiting · <label>" on v0.1.7, and the timeline test pins those. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Motivation
Matěj (Organization Admin) reviewed Buddy's chat on a Personal Environment on 2026-10-25. Under the composer the chat showed a model picker with long entries that look the same, a reasoning-effort list up to "ultra (sends max on this route)", and an access list (Supervised … Full access).
His decision: Buddy's promise is a preset Hermes whose settings work. People should not choose a model, an effort or an access mode there. Model and effort choice makes sense in Chat and for bots, not in Buddy's chat.
What the addendum says (root decision 0210, inline at the end of its row, dated 2026-10-26)
What this PR does not do
It changes only the decision text. The implementation comes in separate pull requests in their owning repos:
Verification
bun run check:docsandbun run pr:preflight(ready_to_push against main ba407be) pass.Risks and follow-ups
🤖 Generated with Claude Code