Skip to content

lazurio: the managed Folder behaves as upstream without its variable and lives in the overlay folder; overlay cleanup; Czech welcome - #65

Merged
immakermatty merged 14 commits into
mainfrom
agent/DEV-6646-phase-a-folder
Oct 13, 2026
Merged

immakermatty merged 14 commits into
mainfrom
agent/DEV-6646-phase-a-folder

Conversation

@immakermatty

@immakermatty immakermatty commented Oct 13, 2026 •

Copy link
Copy Markdown

Status: ready for review. Phase A, part 2 of plan DEV-6646, on main after #64 (rebase-merged as 35a31c0). Lazurio Fork CI is green on the exact head ffde629 (see Verification). Nothing here is released.

Why

On 2026-10-13 the Admin approved a cleanup of the fork before its next stable releases and the move to upstream v0.0.46. Part 1 (#64) made CI test what the overlay changes and said what the overlay is. This part does what the plan calls A3, A4 and A6, under the approved decisions:

  • D9, the managed Folder (LazurioPlatform F51) now, with its behaviour fix. Without T3CODE_LAZURIO_FOLDER the fork must behave as upstream, and it did not: "Add project" disappeared from the command palette and the sidebar whenever no Environment could take a project, which also removed upstream's way to Settings → Connections. The managed Folder was also the overlay's largest upstream footprint (about 30 upstream files, its web seams mostly re-indentation), the least guarded part (no seam guard, an untested reactor guard), and the reason full vp lint failed on main (Lint fails on main: the managed Folder's engine tests exceed upstream's ManagedRuntime ceiling #63).
  • A4: dead code, duplicated helpers, small faults and stale comments of the Environment browser overlay.
  • D5, the welcome's language: the managed welcome was English only, while the rest of the overlay follows prefersCzech (Czech with formal address, root decision 0199).

Commits

Each commit stands alone and is one release-note line; each was checked on its own (Verification).

  1. fix(web): "Add project" stays unless every Environment is managed — the palette and the sidebar ask one overlay helper, everyEnvironmentManaged: "Add project" leaves only when the web knows at least one Environment and every one is managed (an Environment whose config has not arrived counts as not managed). Without the variable, including with no Environment at all, both behave as upstream, and the palette's "Add project" leads to Settings → Connections again. The runbook no longer lists this as a known deviation.
  2. fix(web): the managed welcome shows only on the welcome route, like the wizard — upstream renders its wizard only while the location is still /welcome, because the root shell can remount the route's pending outlet after the location changes. The managed welcome returned before that guard, so after "Start in Lazurio" it could show again, with an enabled button, while the new chat's route loaded. It now sits behind the same guard; welcome.tsx's seam is one import and two lines.
  3. fix(web): a prepared prompt opens in a managed Environment's Lazurio project — the Launchpad's "+ Nový modul" prompt names <Folder>/organizations/<directory> as its cwd; the prompt overlay added a project there, which a managed Environment refuses, so the prompt failed ("Could not open the prepared prompt") wherever the Folder was managed. In a managed Environment it now opens in the Folder's own project, where every new thread starts anyway, and adds nothing; the prompt text names the Organization. Unchanged without the variable.
  4. refactor(web): the managed Folder's web seams shrink to their real lines — upstream code stays in place and the overlay decides beside it: DraftHeroHeadline.tsx 182 → 7 changed lines, CommandPalette.tsx 81 → 12, FirstRunGate.tsx 63 → 6, useHandleNewThread.ts 16 → 5 (one managedNewThread call; its branch inside resolveDefaultEnvMode was unreachable). managedFirstRunDecision returns only the decision (its persistCompletion was always false).
  5. refactor(server): the managed Folder's server code moves into the overlay folder — t3 lazurio moves verbatim to apps/server/src/lazurio/cli.ts; the Folder's config (T3CODE_LAZURIO_FOLDER, T3CODE_LAZURIO_TOOLS_URL) to managedFolderConfig.ts, which cli/config.ts spreads over its result and which also turns the cwd bootstrap off, so the three autoBootstrapProjectFromCwd && lazurioFolder === undefined checks in startup are upstream's again; one guard in managedFolder.ts for the provider reactor and the VCS service, and one for the engine (3 lines in OrchestrationEngine.ts); ws.ts gives clients the Folder through one helper; reconcileRecommendedModel is optional on the settings service, whose writer takes the function to apply inside its lock, and its pure part moves out of packages/shared into modelRecommendation.ts, so the five upstream test fixtures, the test layer, serverSettings.test.ts and packages/shared/src/serverSettings.ts are upstream's again; one routeAuth.ts for both overlay routes, so http.ts is upstream's again; the wrong "Compare-and-set" comment in packages/contracts/src/settings.ts is gone. New tests: cli.test.ts pins t3 lazurio's output, the Folder config, the guards on a real filesystem with symlinks, the VCS refusal, and the reactor guard (a turn whose workspace no longer resolves to the Folder starts no session). The allowlist drops the files that are upstream's again and adds the reactor's test.
  6. fix(server): the model recommendation route knows the Folder by its canonical path — the route compared the requested folder with the canonical configured Folder as raw strings. The Platform sends realpath(folder), so it matched, but a symlink or a trailing slash got 409. It now resolves the request the way the reactor and the VCS service do.
  7. test(server): the managed Folder's engine tests run on test layers; fork CI lints (#63) — the two managed engine tests added two ManagedRuntime.make runners over upstream's ceiling of five for OrchestrationEngine.test.ts; they now run as @effect/vitest live tests over the engine's test layer, and full pnpm run lint passes. Fork CI now runs upstream's lint script after the formatter, as upstream's vp check does; the release contract keeps the step. Fixes Lint fails on main: the managed Folder's engine tests exceed upstream's ManagedRuntime ceiling #63 (merging closes it).
  8. test: the release contract keeps the managed Folder's seams — the guard every other feature has: it pins each hook in an upstream file (bin.ts, the config spread, the engine's command guard before a command is decided, the reactor's turn guard before a session starts, the VCS guard before a driver runs, the startup adoption, the settings hook, ws.ts, the contract fields; the palette, the sidebar, the hero, the first-run gate, the new-thread hook, the scratch project, the git actions, the welcome behind upstream's route guard) and requires every file to be the overlay's or on the allowlist. Disabling the palette's condition or the reactor's guard fails it.
  9. refactor(lazurio): the overlay drops dead code and keeps one copy of its helpers — server: the snapshot's per-tab view (never read: the web builds <viewOrigin>/t/<tabId> itself since the panel first showed the tabs), DaemonSeams.read, exports without importers (askDaemonSocket, daemonProcessId); letGo now drops what it lets go (three loops merged); one label rule (holderLabel). Web: info.tab and closed.tab of the view's messages; one originOf, panelOf and snapshotOf; upstream's surfaceShortcutTargetsTypingContext instead of a copy; postThreadTab, restoreTabs, runTool and chooseInNewTab are module-private.
  10. fix(web): a tab that ends as the panel's last one closes the panel, like × — the overlay's removal of an ended tab lacked upstream's rule that the panel closes with its last surface. It now matches closeSurface rule for rule, and a test runs upstream's closeSurface and the overlay on the same panels and requires the same result. It stays an automatic update: closeSurface counts as the person's choice, and one during a turn holds back the panel upstream opens by itself when the turn completes.
  11. fix(server): the Environment browser overlay forgets what it no longer needs — a failed lookup of a session's thread was cached for good, so tabs an agent bound after its thread came back (unarchived) never reached the strip (tested); a tab's lock now goes with its last operation, and the host remembers the latest 256 other Environments' tabs instead of all of them; the host's interface ThreadTabs, which shadowed the service module of the same name, is HostThread; foreignView's orphaned JSDoc is back on it.
  12. fix(web): a hold the server keeps failing stops retrying after about a minute — a hold retried a 5xx every 30 s for as long as the tab stayed in the strip. It now tries six more times over about a minute and then ends as a refusal does: the tab stays as the device's own, with the same warning (tested).
  13. chore(lazurio): overlay comments say what the overlay does today — the session name's deleted web copy (in agentBrowserSession.ts and the release contract), the panel's retired own tab, and overlay.ts and server.ts now naming the model recommendation route.
  14. feat(web): the managed welcome speaks Czech where the person's browser does — the same rule as the rest of the overlay, formal address (0199), "Environment" for the place (0170), the Lazurio Folder as the Environment's own pages name it. English text and behaviour unchanged.

What deliberately does not change

  • t3 lazurio capabilities and t3 lazurio model print the same bytes. The command moved without a change; cli.test.ts now pins {"version":1,"managedFolder":true,"modelRecommendation":true}, the metadata reads ({"version":1,"current":…,"lastManaged":…}, nothing created in an empty base directory), the offline refusal ("The T3 service must be running. No settings were changed.") and a live apply through the route. Before/after runs of the real CLI (node apps/server/src/bin.ts lazurio …) are byte-identical, help included.
  • The refusal words merged in fix(server): the managed Folder's refusals say what happens in plain words #61 are the same, each for the same refusal; they now live in apps/server/src/lazurio/managedFolder.ts.
  • What the managed Folder does on a managed Environment: startup adoption, the command and turn guards, the model reconciliation, the welcome's English text.
  • Not in this PR: the C1–C7 duplicates (both browserView.ts, the 32-hex id rules, isViewOf) for task 703, the broker's dead sort terms for phase C, the v2 event branch in threadLifecycle.ts, the README and any "Lazurio T3 Code" naming (phase B), the design system's look, the panel's head row and tab menu.
  • Left on purpose: VersionMismatch.clientVersion in versionSkew.ts is upstream's field, which upstream main still reads; deleting it would add upstream-line deletions to the overlay for a field the overlay only writes. SidebarThreadHeader.tsx keeps its conditional button (6/4 lines): hiding it needs the three lines of the button one level in.

Verification

Local, on the drafts worktree (Node 24.16.0, pnpm 11.10.0, pnpm install --frozen-lockfile), on the exact head ffde629, as lazurio-fork-ci.yml runs them:

  • node --test scripts/lazurio-release-contract.test.mjs — 27/27 pass (26 before; the new Folder guard).
  • pnpm exec vp fmt --check — pass (4226 files).
  • pnpm run lint — exit 0, no errors (on main before this PR: 2 errors, Lint fails on main: the managed Folder's engine tests exceed upstream's ManagedRuntime ceiling #63).
  • pnpm exec vp run --filter t3 typecheck, pnpm exec vp run --filter @t3tools/web typecheck — pass.
  • The test step with its derivation and gate (a local copy of the workflow's script): apps/server 43 files, 41 passed and 2 skipped (the Chromium tests), 876 tests passed and 12 skipped; apps/web 10 files, 222 tests; packages/contracts 3 files, 166 tests; packages/shared 1 file, 10 tests; scripts 2 files, 23 tests.
  • Every commit on its own (checked out in turn): formatting, the release contract, lint, the typecheck of each app it touches and the tests of the files it touches — all 14 pass. Commit 5 returns ThreadSettlementReactor.test.ts to upstream's text; that upstream test fails its 37 storage-cleanup cases on macOS exactly as at the upstream base (the file is byte-identical to v0.0.45) and passes on Linux in CI.
  • The new guard tests fail when their code is undone: the reactor test with the turn guard disabled, the contract guard with the palette condition or the reactor guard removed, the panel test with the old withoutSurface, the hold test with unlimited retries, the session test with the old cache.

GitHub (Lazurio Fork CI, workflow_dispatch on this branch before the PR, then the PR's run):

Canary checklist (root decision 0178)

On a canary Environment with the managed Folder (T3CODE_LAZURIO_FOLDER set by Machines) and this preview:

  1. The welcome in Czech and English. A first run (or /welcome) with the browser in Czech shows "Váš pracovní prostor je připravený" and the Czech text; in English, the unchanged English. The link opens the Environment's tools page in a new tab. "Začít v Lazuriu" / "Start in Lazurio" opens a new chat in the Lazurio project, and the welcome does not come back while the chat loads.
  2. The command palette. On the managed Environment alone: no "Add project" and no "New project"; the project search and "New thread in…" list only Lazurio. Where an unmanaged Environment is also known (or on a T3 Code without the variable): "Add project" is there, and with no connected Environment it opens Settings → Connections.
  3. The sidebar's "Add project". Hidden on the managed Environment alone, shown once an unmanaged Environment is known.
  4. A prepared prompt from the Launchpad. Apps → "+ Nový modul" on an Organization opens Chat with the prompt in a new thread of the Lazurio project, unsent, without the "Could not open the prepared prompt" toast.
  5. A new chat in the Lazurio project. The hero reads "What should we build in Lazurio?" without a picker; the first turn runs with the Folder as its working directory; no git actions for the Folder.
  6. The Environment browser (commit 10): when the panel's only tab ends in its view, the panel closes.
  7. lazurio chat defaults --apply on the canary still reports the managed model.

Risks

  • The managed Folder's code moved days after its first release while Machines and the Platform call t3 lazurio; the bytes are pinned and were compared, but the canary is where the Platform reads them.
  • Fork CI now lints the whole repository: an upstream lint regression at the next rebuild fails CI until it is fixed or the rule is reviewed, as upstream's own vp check would.
  • The prepared prompt in a managed Environment starts at the Folder root, not the Organization's root; the prompt text names the Organization and the agent works from there. That is F51's rule ("new sessions start at that root").
  • The model route now accepts the Folder through a symlink or with a trailing slash (still 409 for any other folder).
  • Merging closes Lint fails on main: the managed Folder's engine tests exceed upstream's ManagedRuntime ceiling #63.

🤖 Generated with Claude Code

immakermatty and others added 14 commits October 13, 2026 11:31
The managed Folder hid "Add project" in the command palette whenever no
Environment could take a project, and the sidebar hid its button unless
some server config was unmanaged. Both fired without T3CODE_LAZURIO_FOLDER:
with no Environment, or none connected, upstream shows "Add project" and the
palette leads to Settings -> Connections, and the fork showed nothing, so
the one way to connect an Environment from there was gone.

Both now ask one overlay helper, everyEnvironmentManaged: "Add project"
leaves only when the web knows at least one Environment and every one of
them is managed; an Environment whose config has not arrived yet counts as
not managed. Without the variable nothing is managed, so the palette and
the sidebar behave as upstream again, including with no Environment. A
managed Environment still takes no other project: it stays out of the
palette's list of Environments to add one to.

The helper's tests cover no Environment, unmanaged, loading and mixed
lists. The fork runbook no longer lists this as a known deviation.

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

Upstream's /welcome renders its setup wizard only while the location is
still /welcome: the root shell can remount the route's pending outlet after
the location changes, and setup must not reopen while the destination
route loads. The managed Folder returned its own welcome before that guard,
so after "Start in Lazurio" the remounted outlet could show the welcome
again, with a fresh, enabled button, until the new chat's route loaded.

The managed welcome now sits behind the same guard: on /welcome it shows,
during a pending navigation away the outlet renders nothing. It opens the
new chat in the Folder's project itself, so the route's seam is one import
and two lines instead of a separate early return with its own config read
and callback. What the welcome says and does is unchanged.

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

The Launchpad's "+ Nový modul" prompt names the Organization's root inside
the Lazurio Folder (<Folder>/organizations/<directory>) as its cwd. The
prompt overlay opens the project rooted there and adds one when there is
none, but a managed Environment (T3CODE_LAZURIO_FOLDER) refuses any
project other than the Folder itself, so the prompt failed with "Could not
open the prepared prompt" wherever the Folder was managed. Only a prompt
whose cwd was the Folder root, or an Organization that already had a
project from before, got through.

In a managed Environment the prompt now opens in the Folder's own project,
where every new thread there starts anyway, and nothing is added; the text
names the Organization. Without the variable nothing changes: the project
rooted at cwd, added when missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The managed Folder's web seams wrapped upstream code in new conditionals,
which re-indented whole blocks: 182 changed lines in DraftHeroHeadline.tsx
for 8 real ones, 81 in CommandPalette.tsx, 63 in FirstRunGate.tsx. Each
of them is a conflict waiting at the next upstream rebuild.

Upstream's code now stays in place and the overlay decides beside it,
through helpers in apps/web/src/lazurio/:

- DraftHeroHeadline.tsx: upstream's picker keeps its block under a new
  name; one line picks "Lazurio" instead for a managed Environment (7
  changed lines).
- CommandPalette.tsx: the project pickers filter their entries with
  offeredInProjectPicker, the Environments to add a project to drop managed
  ones with one more filter line, and the "Add project" item is built as a
  const and pushed unless everyEnvironmentManaged (12 changed lines).
- FirstRunGate.tsx: upstream's decision is computed as before and
  useManagedFirstRunDecision puts the managed first run in its place (6).
- useHandleNewThread.ts: one call to managedNewThread moves a new thread to
  the Folder's project and workspace (5); its second branch inside
  resolveDefaultEnvMode was unreachable, as the managed options always
  carry an explicit env mode, and is gone.

managedFirstRunDecision returns only the decision: a managed first run
never persists completion, which the hook says once instead of a field
that was always false. The helpers have tests; behaviour does not change.

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

The managed Folder (LazurioPlatform F51) spread its server code over
upstream files: `t3 lazurio` in cli/, 44 lines of Folder parsing in
cli/config.ts, three copies of `autoBootstrapProjectFromCwd &&
lazurioFolder === undefined` in startup, a realPath check written twice
(provider reactor, VCS service), an auth helper exported from upstream's
http.ts and copied in the thread-tabs route, and a new required method on
the settings service that five upstream test fixtures had to stub.

Now apps/server/src/lazurio/ holds it and upstream files keep hooks:

- cli.ts: `t3 lazurio`, moved verbatim from cli/lazurio.ts; bin.ts imports
  it from there.
- managedFolderConfig.ts: T3CODE_LAZURIO_FOLDER and T3CODE_LAZURIO_TOOLS_URL
  with their checks; cli/config.ts spreads its result over the config. The
  Folder becomes the cwd and turns off the cwd bootstrap there, so startup
  keeps upstream's checks and its three folded conditions are gone.
- managedFolder.ts: the engine's command guard, and one guard for the
  provider reactor and the VCS service (agent turns only in the Folder, the
  Folder never a repository), the refusal words unchanged; ws.ts gives
  clients the Folder through one helper.
- modelRecommendation.ts: the reconcile function, out of packages/shared.
  The settings service's reconcileRecommendedModel is optional, and its
  writer takes the function to apply inside its lock, so the five fixtures
  and the test layer are upstream's again; the model route answers 503
  where the method is missing, which only a test layer does.
- routeAuth.ts: one auth helper for both overlay routes; http.ts is
  upstream's again.
- packages/contracts: the wrong "compare-and-set" comment on the settings
  patch field is gone.

`t3 lazurio capabilities` and `t3 lazurio model` print the same bytes:
cli.test.ts pins both, metadata reads, the offline refusal and a live
apply through the route. New tests cover the Folder config, the guards on a
real filesystem with symlinks, the VCS refusal and the reactor guard (a
turn whose workspace no longer resolves to the Folder starts no session);
the settings test moved into the overlay. The allowlist drops the files
that are upstream's again and adds the reactor's test.

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

POST /api/lazurio/model-recommendation compared the folder in the request
with the configured Folder as raw strings, while the configured Folder is
the canonical path T3CODE_LAZURIO_FOLDER resolves to. The Platform's
`lazurio chat defaults --apply` sends realpath(folder), so it matched, but
the same Folder named through a symlink or with a trailing slash got 409
folder-mismatch.

The route now asks the Folder guard, which resolves the requested path the
way the provider reactor and the VCS service resolve theirs: a path that
resolves to the Folder is the Folder, anything else stays 409. The tests
use a real Folder and check a symlink, a trailing slash, the parent, a
subfolder and a relative path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ork CI lints (#63)

`vp lint` (the repository's `pnpm run lint`) failed on main: upstream
holds manual Effect runners in tests to a per-file ceiling with no net-new
occurrences, and the managed Folder's two engine tests each added a
ManagedRuntime.make to OrchestrationEngine.test.ts, two over its ceiling
of five. Fork CI never ran lint, so it went unseen.

Both tests now run as @effect/vitest live tests that provide the engine's
test layer, the adoption test once without and once with the Folder over
the same database file, so the file is back at upstream's five runners and
the full lint passes. What they check is unchanged.

Fork CI runs upstream's lint script after the formatter, as upstream's own
`vp check` does; the release contract keeps the step and the runbook lists
it. Fixes #63.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every overlay feature has a guard in the release contract that fails when
a rebuild on a new upstream tag loses one of its seams; the managed Folder
(LazurioPlatform F51) had none, though it touches the most upstream files.

The new guard reads the hooks in upstream files and pins each one: `t3
lazurio` in bin.ts, the Folder config spread last over cli/config.ts and
checked before the server's directories exist, the engine's command guard
right before a command is decided, the provider reactor's turn guard before
a session starts, the VCS guard before a driver runs, the startup adoption
and its welcome fields, the optional reconcile method and the writer's apply
hook in the settings service, the clients' config in ws.ts, the contract
fields; and in the web, the palette's project pickers and "Add project",
the sidebar's button, the hero, the first-run gate, the new-thread hook,
the scratch project, the git actions and the welcome behind upstream's
route guard. Every file must be the overlay's own or on the allowlist.
Disabling the palette's condition or the reactor's guard fails it.

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

The Environment browser overlay carried code nothing used and helpers
written twice:

- Server: every tab of a thread's snapshot carried `view`, which the web
  never reads (it builds `<viewOrigin>/t/<tabId>` itself since the panel
  first showed the tabs, so no released client needs it); DaemonSeams.read
  was left from the PID-based stop; askDaemonSocket and daemonProcessId
  were exported without importers. The three reconciliations of a holder
  file each removed the tabs the hub let go in a loop of their own; letGo
  now removes them and names them. The service cut labels with its own copy
  of the holder file's rule; holders.ts exports it as holderLabel.
- Web: the view's info and closed messages carried a validated `tab` that
  nothing read; the frame that sends them is the tab. originOf, the
  panel's state of a thread and the thread's last snapshot each had two
  definitions; environmentBrowser.ts and threadTabs.ts now export the one
  each. Nová karta used a copy of upstream's typing check for its letters;
  it imports upstream's exported surfaceShortcutTargetsTypingContext.
  postThreadTab, restoreTabs, runTool and chooseInNewTab are module-private.

Behaviour does not change; the tests that pinned the dropped fields follow.

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

When the view says its tab ended, the tab leaves the strip. The overlay
removed it with its own copy of upstream's close, which lacked one rule of
upstream's ×: the panel closes with its last surface. So a thread whose
only Environment browser tab ended kept an open, empty panel.

The overlay's update now matches upstream's closeSurface rule for rule. It
stays an automatic update rather than a call to closeSurface: that action
counts as the person's choice, and one during a turn holds back the panel
upstream opens by itself when the turn completes, while a tab an agent
closes ends without anyone choosing. A test runs upstream's closeSurface
and the overlay on the same panels (the last tab, the tab in front, a tab
behind, a closed panel) and requires the same result, with the person's
choices untouched.

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

Three small faults of the server overlay:

- The thread tabs service cached a failed lookup of a session's thread for
  good: a `t3-` session first seen while its thread was not live (archived,
  or not projected yet) was never matched again, so the tabs its agent
  bound after the thread came back never reached the thread's strip. Only
  a thread found is cached now; a session of no live thread is asked again
  when it binds anew, which happens only when its binding changes.
- The browser host kept a lock for every tab it ever drove and every other
  Environment's tab preview_open ever answered with, for the server's whole
  life. A tab's lock now goes when its last operation is done, and the host
  remembers the latest 256 other Environments' tabs; one forgotten is only
  no longer named as another Environment's when a tool reaches for it.
- The host's own record of a thread was an interface named ThreadTabs, the
  name of the service module it imports; it is HostThread. The JSDoc of
  foreignView sat on the function above it and moved to its own.

A test covers the session that is asked again.

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

A person's hold of a tab (Nová karta, a page's new tab, a link, Vrátit)
retried a network failure or a 5xx with a growing pause, up to 30 s, for
as long as the tab stayed in the strip. A server that keeps answering 503
(no holder file it can write, the service off) got a POST every 30 s from
every device, for as long as the person kept the tab, and the tab stayed
pending.

The hold now tries six more times, over about a minute, as the release
gives up after its few. After that it ends as a refusal does: the tab stays
in the strip as the device's own, with the same warning that it closes 30 s
after nobody views it. A test runs a persistent 503 through the retries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comments that outlived the code they described:

- agentBrowserSession.ts described a web copy of the session name, and a
  release contract check keeping the two equal; the web copy went when the
  right panel started reading the thread's tabs from the server. The
  contract test's comment on the browser view's address said the same.
- The web's environmentBrowserTab compared its refusal of the page's own
  origin to the thread's own tab, which the panel no longer has.
- overlay.ts and the line of server.ts that joins its layer named the
  browser host and the thread tabs, not the model recommendation route the
  managed Folder added to the same layer.

Comments only; nothing runs differently.

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

The managed Folder's welcome was English only, while the rest of the
overlay (the Environment browser's tabs, Nová karta, the toasts) speaks
Czech where the browser's language is Czech (prefersCzech), the agreed rule
until the shell's identity carries the person's language.

The welcome now follows the same rule. Its Czech addresses people formally
(root decision 0199) and calls the place the Environment (root decision
0170), with the Lazurio Folder named as the Environment's own pages name it.
The English text is unchanged, and so is what the welcome does. The
runbook's managed Folder section says it.

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

@agentrozjedemeai agentrozjedemeai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@immakermatty Reviewed the exact ffde629 head against main 35a31c0. APPROVED for the phase-A cleanup. I traced the managed/unmanaged/loading Environment paths, the prepared prompt to the Folder project, first-run and route guards, settings reconciliation through the native writer, engine guard before decide, CLI output and session-lookup retry, bounded tab/hold behavior, and the formal Czech welcome. No blocking regression found. Local evidence on this detached checkout: 27/27 release contract, 61/61 focused overlay tests, 208/208 related engine/reactor/VCS/settings/tab tests, web and server typecheck, lint (exit 0 with existing warnings), and git diff --check. CI on this SHA has the four fork jobs successful; review threads: 0. I did not run a live canary UI preview; keep that post-merge preview as planned.

@immakermatty
immakermatty merged commit 68f22f2 into main Oct 13, 2026
11 checks passed
immakermatty added a commit that referenced this pull request Oct 13, 2026
…rom T3 Code

GitHub shows .github/README.md in place of the root README, which stays
byte-equal to upstream's. The new page names the distribution (root
decision 0200 of the Lazurio project: "Lazurio T3 Code", a modified
distribution of T3 Code), says it is not an official T3 Code release and
that problems with it belong here, and explains what differs: the
Environment browser in the web client's right panel first, then the
Lazurio Folder project, the name and the light look on a Lazurio
Environment, the shell, prepared prompts, hosting behind a reverse proxy
and updates from this repository. It also says how main tracks upstream's
stable releases, what the stable and preview channels are, where to
report problems (security ones privately, through the Security tab), and
credits T3 Code with its MIT licence.

Impact: documentation only. It describes the managed Folder as phase A
part 2 (#65) leaves it and the name and look of #66, so it merges after
both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
immakermatty added a commit that referenced this pull request Oct 13, 2026
…rom T3 Code

GitHub shows .github/README.md in place of the root README, which stays
byte-equal to upstream's. The new page names the distribution (root
decision 0200 of the Lazurio project: "Lazurio T3 Code", a modified
distribution of T3 Code), says it is not an official T3 Code release and
that problems with it belong here, and explains what differs: the
Environment browser in the web client's right panel first, then the
Lazurio Folder project, the name and the light look on a Lazurio
Environment, the shell, prepared prompts, hosting behind a reverse proxy
and updates from this repository. It also says how main tracks upstream's
stable releases, what the stable and preview channels are, where to
report problems (security ones privately, through the Security tab), and
credits T3 Code with its MIT licence.

Impact: documentation only. It describes the managed Folder as phase A
part 2 (#65) leaves it and the name and look of #66, so it merges after
both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@immakermatty
immakermatty deleted the agent/DEV-6646-phase-a-folder branch October 13, 2026 19:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Lint fails on main: the managed Folder's engine tests exceed upstream's ManagedRuntime ceiling

2 participants