From b4d51565f4807882485074180fb199f703626720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Such=C3=A1nek?= Date: Fri, 16 Oct 2026 19:08:12 +0200 Subject: [PATCH 1/2] Core: an Organization's Workspace tabs are one setting, workspace.tabs Decision 0206 lets an Organization arrange its Workspace in Apps into tabs it names itself. Lazurio Core's closed settings tree and the manifest schema gain `settings.workspace.tabs`: 1 to 12 tabs in order, each a name of 1 to 40 characters and the lazurio.module.v1 ids in it. Core also refuses what the schema cannot express: two tabs of one name (letter case ignored) and a module in two tabs. The whole list is one effective key. Readers first: no Organization declares tabs until Core, the Dashboard and the LazurioPlatform release that read them are out, because an older reader judges the whole section invalid and keeps its last applied settings. Co-Authored-By: Claude Opus 5.5 --- .../core/organization-activation-lib.test.mjs | 18 ++--- .../core/organization-scaffold-lib.test.mjs | 18 ++--- lazurio/core/organization-settings-lib.mjs | 46 +++++++++++- .../core/organization-settings-lib.test.mjs | 74 +++++++++++++++++-- lazurio/lazurio.organization.v1.schema.json | 33 +++++++++ lazurio/organization-check-cli.test.mjs | 20 ++--- manual/lazurio-manifest-family.md | 32 ++++++++ 7 files changed, 205 insertions(+), 36 deletions(-) diff --git a/lazurio/core/organization-activation-lib.test.mjs b/lazurio/core/organization-activation-lib.test.mjs index 2e82f91e..4b493b2e 100644 --- a/lazurio/core/organization-activation-lib.test.mjs +++ b/lazurio/core/organization-activation-lib.test.mjs @@ -702,7 +702,7 @@ test("Organization settings ride next to the resource and never touch projection status: "valid", source: "lazurio.organization.json", values: { integrations: { composio: { allowed: false } } }, - effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedMicrosoft365()], + effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedAfterComposio()], issues: [], }); expect(plain.settings).toMatchObject({ status: "absent", source: "lazurio.organization.json", values: {} }); @@ -1047,12 +1047,12 @@ function fixture({ owner = true, canCreate = true, app = {}, root = {} } = {}) { }; } -// The Microsoft 365 company app (decision 0162, addendum 2026-10-14) is not -// declared by these fixtures, so its keys stay ungoverned. -function ungovernedMicrosoft365() { - return ["tenant_id", "client_id", "apps", "callbacks"].map((field) => ({ - key: `integrations.microsoft365.${field}`, - governed: false, - value: null, - })); +// Neither the Microsoft 365 company app (decision 0162, addendum 2026-10-14) +// nor the Workspace tabs (decision 0206) are declared by these fixtures, so +// their keys stay ungoverned. +function ungovernedAfterComposio() { + return [ + ...["tenant_id", "client_id", "apps", "callbacks"].map((field) => `integrations.microsoft365.${field}`), + "workspace.tabs", + ].map((key) => ({ key, governed: false, value: null })); } diff --git a/lazurio/core/organization-scaffold-lib.test.mjs b/lazurio/core/organization-scaffold-lib.test.mjs index d643b5b9..310f65b6 100644 --- a/lazurio/core/organization-scaffold-lib.test.mjs +++ b/lazurio/core/organization-scaffold-lib.test.mjs @@ -102,7 +102,7 @@ describe("Organization scaffold", () => { expect(company).not.toHaveProperty("settings"); expect(resolution.settings).toMatchObject({ status: "valid", - effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedMicrosoft365()], + effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedAfterComposio()], }); }); @@ -278,12 +278,12 @@ function hermeticGitEnvironment(root) { return env; } -// The Microsoft 365 company app (decision 0162, addendum 2026-10-14) is not -// declared by these fixtures, so its keys stay ungoverned. -function ungovernedMicrosoft365() { - return ["tenant_id", "client_id", "apps", "callbacks"].map((field) => ({ - key: `integrations.microsoft365.${field}`, - governed: false, - value: null, - })); +// Neither the Microsoft 365 company app (decision 0162, addendum 2026-10-14) +// nor the Workspace tabs (decision 0206) are declared by these fixtures, so +// their keys stay ungoverned. +function ungovernedAfterComposio() { + return [ + ...["tenant_id", "client_id", "apps", "callbacks"].map((field) => `integrations.microsoft365.${field}`), + "workspace.tabs", + ].map((key) => ({ key, governed: false, value: null })); } diff --git a/lazurio/core/organization-settings-lib.mjs b/lazurio/core/organization-settings-lib.mjs index f7b9b096..beede85e 100644 --- a/lazurio/core/organization-settings-lib.mjs +++ b/lazurio/core/organization-settings-lib.mjs @@ -40,6 +40,14 @@ const LAUNCHPAD_CALLBACK_PATTERN = // callback always takes one of them. const MICROSOFT365_MAX_CALLBACKS = 255; +// An Organization's own Workspace tabs (decision 0206): 1 to 12 tabs, each a +// name of 1 to 40 characters without control characters or surrounding +// space, and the modules in it by their lazurio.module.v1 id. +// biome-ignore lint/suspicious/noControlCharactersInRegex: the control characters are what it refuses. +const WORKSPACE_TAB_NAME_PATTERN = /^(?=[^\u0000-\u001f\u007f]{1,40}$)[^\s\u0000-\u001f\u007f](?:.*[^\s\u0000-\u001f\u007f])?$/; +const WORKSPACE_MODULE_PATTERN = /^[a-z0-9][a-z0-9-]{0,62}$/; +export const WORKSPACE_TABS_MAX = 12; + const CANONICAL_SOURCE = "lazurio.organization.json"; // The whole contract as one closed tree. Adding an Organization setting adds @@ -65,6 +73,21 @@ const SETTINGS_CONTRACT = objectNode({ ["tenant_id", "client_id", "apps", "callbacks"], ), }), + workspace: objectNode( + { + tabs: arrayLeaf( + objectNode( + { + name: stringLeaf(WORKSPACE_TAB_NAME_PATTERN), + modules: arrayLeaf(stringLeaf(WORKSPACE_MODULE_PATTERN), { maxItems: 500 }), + }, + ["name", "modules"], + ), + { minItems: 1, maxItems: WORKSPACE_TABS_MAX }, + ), + }, + ["tabs"], + ), }); /** Dot-separated keys of every known setting, as reported per item to the Dashboard. */ @@ -103,6 +126,7 @@ export function resolveOrganizationSettings({ authority, canonicalManifest }) { } const issues = []; validateNode(canonicalManifest.settings, SETTINGS_CONTRACT, "/settings", issues); + if (issues.length === 0) workspaceIssues(canonicalManifest.settings, issues); if (issues.length > 0) { return settingsResult({ status: "invalid", @@ -184,6 +208,26 @@ function validateNode(value, node, path, issues) { } } +// What the closed tree (and the JSON schema) cannot say about the tabs: two +// tabs never share a name, letter case ignored, and a module is in one tab +// at most. +function workspaceIssues(settings, issues) { + const tabs = settings.workspace?.tabs; + if (tabs === undefined) return; + const names = new Set(); + const modules = new Set(); + tabs.forEach((tab, index) => { + const at = `/settings/workspace/tabs/${index}`; + const name = tab.name.normalize("NFC").toLocaleLowerCase(); + if (names.has(name)) issues.push({ code: "settings_value_invalid", path: `${at}/name` }); + names.add(name); + tab.modules.forEach((module, position) => { + if (modules.has(module)) issues.push({ code: "settings_value_invalid", path: `${at}/modules/${position}` }); + modules.add(module); + }); + }); +} + function objectNode(fields, required = []) { return Object.freeze({ kind: "object", @@ -205,7 +249,7 @@ function enumItem(values) { } // An array is one setting: its items are validated, never reported as keys. -// Items are strings and must be unique. +// String items must be unique. function arrayLeaf(items, { minItems = 0, maxItems = Infinity } = {}) { return Object.freeze({ kind: "array", items, minItems, maxItems }); } diff --git a/lazurio/core/organization-settings-lib.test.mjs b/lazurio/core/organization-settings-lib.test.mjs index 7435452d..ec889ecb 100644 --- a/lazurio/core/organization-settings-lib.test.mjs +++ b/lazurio/core/organization-settings-lib.test.mjs @@ -19,7 +19,8 @@ const microsoftKeys = [ "integrations.microsoft365.apps", "integrations.microsoft365.callbacks", ]; -const ungovernedMicrosoft = microsoftKeys.map((key) => ({ key, governed: false, value: null })); +// Every setting after Composio's, none of them governed. +const ungovernedAfterComposio = [...microsoftKeys, "workspace.tabs"].map((key) => ({ key, governed: false, value: null })); const tenantId = "11111111-2222-4333-8444-aaaaaaaaaaaa"; const clientId = "11111111-2222-4333-8444-bbbbbbbbbbbb"; const callback = "https://launchpad.machine-1.example-org.lazurio.io/api/integrations/oauth/callback"; @@ -42,7 +43,7 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { "settings_type_invalid", "settings_value_invalid", ]); - expect(ORGANIZATION_SETTINGS_KEYS).toEqual(["integrations.composio.allowed", ...microsoftKeys]); + expect(ORGANIZATION_SETTINGS_KEYS).toEqual(["integrations.composio.allowed", ...microsoftKeys, "workspace.tabs"]); expect(MICROSOFT365_APPS).toEqual(["outlook", "one_drive", "share_point"]); expect(Object.isFrozen(ORGANIZATION_SETTINGS_KEYS)).toBe(true); }); @@ -53,7 +54,7 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { status: "absent", source: canonicalSource, values: {}, - effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedMicrosoft], + effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedAfterComposio], issues: [], }); }); @@ -65,7 +66,7 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { status: "valid", source: canonicalSource, values: settings, - effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedMicrosoft], + effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedAfterComposio], issues: [], }); } @@ -76,7 +77,7 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { status: "valid", source: canonicalSource, values: settings, - effective: [{ key: "integrations.composio.allowed", governed: true, value: allowed }, ...ungovernedMicrosoft], + effective: [{ key: "integrations.composio.allowed", governed: true, value: allowed }, ...ungovernedAfterComposio], issues: [], }); } @@ -151,7 +152,7 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { status: "absent", source: null, values: {}, - effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedMicrosoft], + effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedAfterComposio], issues: [], }); for (const input of [ @@ -187,7 +188,7 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { expect(newOrganizationSettings()).toEqual({ integrations: { composio: { allowed: false } } }); expect(settingsOf(manifest(newOrganizationSettings()))).toMatchObject({ status: "valid", - effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedMicrosoft], + effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedAfterComposio], }); }); @@ -204,6 +205,7 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { { key: "integrations.microsoft365.client_id", governed: true, value: clientId }, { key: "integrations.microsoft365.apps", governed: true, value: ["outlook", "one_drive", "share_point"] }, { key: "integrations.microsoft365.callbacks", governed: true, value: [callback] }, + { key: "workspace.tabs", governed: false, value: null }, ], issues: [], }); @@ -309,6 +311,17 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { { integrations: { microsoft365: { ...microsoft365, callbacks: ["https://attacker.example/api/integrations/oauth/callback"] } } }, { integrations: { microsoft365: { ...microsoft365, callbacks: manyCallbacks(256) } } }, { integrations: { microsoft365: { ...microsoft365, client_secret: "value" } } }, + { workspace: { tabs } }, + { workspace: {} }, + { workspace: { tabs: [] } }, + { workspace: { tabs: Array.from({ length: 13 }, (_, index) => ({ name: `T${index}`, modules: [] })) } }, + { workspace: { tabs: [{ name: " Finance", modules: [] }] } }, + { workspace: { tabs: [{ name: "x".repeat(41), modules: [] }] } }, + { workspace: { tabs: [{ name: "Fi\nnance", modules: [] }] } }, + { workspace: { tabs: [{ name: "Finance", modules: ["../deals"] }] } }, + { workspace: { tabs: [{ name: "Finance", modules: ["deals", "deals"] }] } }, + { workspace: { tabs: [{ name: "Finance" }] } }, + { workspace: { tabs: [{ name: "Finance", modules: [], icon: "x" }] } }, ]; for (const settings of documents) { const coreValid = settingsOf(manifest(settings)).status === "valid"; @@ -318,6 +331,53 @@ describe("Organization settings contract (decision 0194, DEV-6653 C1)", () => { }); }); +// Decision 0206: an Organization's own Workspace tabs, one setting. +const tabs = [ + { name: "Každodenní práce", modules: ["deals", "knowledgebase"] }, + { name: "Finance", modules: ["invoices"] }, + { name: "Sklad", modules: [] }, +]; + +describe("Workspace tabs (decision 0206)", () => { + test("are one setting: ordered names, each module in one tab at most", () => { + expect(settingsOf(manifest({ workspace: { tabs } }))).toMatchObject({ + status: "valid", + values: { workspace: { tabs } }, + }); + expect(settingsOf(manifest({ workspace: { tabs } })).effective.at(-1)).toEqual({ + key: "workspace.tabs", + governed: true, + value: tabs, + }); + // What the JSON schema cannot express, Core refuses on its own. + const twice = [ + [ + [ + { name: "Finance", modules: ["deals"] }, + { name: "FINANCE", modules: [] }, + ], + "/settings/workspace/tabs/1/name", + ], + [ + [ + { name: "Finance", modules: ["deals"] }, + { name: "Sklad", modules: ["deals"] }, + ], + "/settings/workspace/tabs/1/modules/0", + ], + ]; + for (const [value, path] of twice) { + expect(settingsOf(manifest({ workspace: { tabs: value } }))).toMatchObject({ + status: "invalid", + values: null, + issues: [issue("settings_value_invalid", path)], + }); + expect(validateAgainstSchema(manifest({ workspace: { tabs: value } }), organizationManifestSchema, "organization")) + .toEqual([]); + } + }); +}); + function settingsOf(canonicalManifest) { return resolveOrganizationSettings({ authority: "canonical", canonicalManifest }); } diff --git a/lazurio/lazurio.organization.v1.schema.json b/lazurio/lazurio.organization.v1.schema.json index b8ed9ff0..a482b185 100644 --- a/lazurio/lazurio.organization.v1.schema.json +++ b/lazurio/lazurio.organization.v1.schema.json @@ -173,6 +173,39 @@ } } } + }, + "workspace": { + "type": "object", + "additionalProperties": false, + "required": ["tabs"], + "description": "The Organization's own tabs in Apps' Workspace (decision 0206), the same for every member; a module named in no tab is in the first. Core also refuses two tabs of one name (letter case ignored) and a module in two tabs, which this schema cannot express.", + "properties": { + "tabs": { + "type": "array", + "minItems": 1, + "maxItems": 12, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name", "modules"], + "properties": { + "name": { + "type": "string", + "pattern": "^(?=[^\\u0000-\\u001f\\u007f]{1,40}$)[^\\s\\u0000-\\u001f\\u007f](?:.*[^\\s\\u0000-\\u001f\\u007f])?$", + "description": "The tab's name: 1 to 40 characters, no control character, no space at either end." + }, + "modules": { + "type": "array", + "maxItems": 500, + "uniqueItems": true, + "items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,62}$" }, + "description": "The modules of the tab, by their lazurio.module.v1 id." + } + } + }, + "description": "The tabs, in their order." + } + } } } }, diff --git a/lazurio/organization-check-cli.test.mjs b/lazurio/organization-check-cli.test.mjs index 801f7d8d..18436ef9 100644 --- a/lazurio/organization-check-cli.test.mjs +++ b/lazurio/organization-check-cli.test.mjs @@ -44,7 +44,7 @@ test("a root with valid settings passes and prints the effective values without status: "valid", source: "lazurio.organization.json", values: { integrations: { composio: { allowed: false } } }, - effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedMicrosoft365()], + effective: [{ key: "integrations.composio.allowed", governed: true, value: false }, ...ungovernedAfterComposio()], issues: [], }, failures: [], @@ -66,7 +66,7 @@ test("a root without settings passes: the Organization governs nothing", () => { settings: { status: "absent", values: {}, - effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedMicrosoft365()], + effective: [{ key: "integrations.composio.allowed", governed: false, value: null }, ...ungovernedAfterComposio()], }, }); expect(run(["organization", "check", root]).stdout).toContain("integrations.composio.allowed: neřízeno"); @@ -255,12 +255,12 @@ function run(args) { }; } -// The Microsoft 365 company app (decision 0162, addendum 2026-10-14) is not -// declared by these fixtures, so its keys stay ungoverned. -function ungovernedMicrosoft365() { - return ["tenant_id", "client_id", "apps", "callbacks"].map((field) => ({ - key: `integrations.microsoft365.${field}`, - governed: false, - value: null, - })); +// Neither the Microsoft 365 company app (decision 0162, addendum 2026-10-14) +// nor the Workspace tabs (decision 0206) are declared by these fixtures, so +// their keys stay ungoverned. +function ungovernedAfterComposio() { + return [ + ...["tenant_id", "client_id", "apps", "callbacks"].map((field) => `integrations.microsoft365.${field}`), + "workspace.tabs", + ].map((key) => ({ key, governed: false, value: null })); } diff --git a/manual/lazurio-manifest-family.md b/manual/lazurio-manifest-family.md index b8939895..bd1dd7d9 100644 --- a/manual/lazurio-manifest-family.md +++ b/manual/lazurio-manifest-family.md @@ -257,6 +257,38 @@ not secrets; the runbook is LazurioPlatform release that apply it are out, in the order of [Readers first](#readers-first). +### Workspace tabs (`settings.workspace.tabs`) + +Decision 0206 lets an Organization arrange its Workspace in Apps into tabs it +names itself, the same for every member. Its Owner arranges them in the +Dashboard, which writes this setting with the Owner's own GitHub rights +(decision 0194 point 2); agents propose a pull request. + +```json +"settings": { + "workspace": { + "tabs": [ + { "name": "Každodenní práce", "modules": ["mission-control", "deals"] }, + { "name": "Finance", "modules": ["invoices", "pricing"] }, + { "name": "Sklad", "modules": ["stock"] } + ] + } +} +``` + +- `tabs` holds 1 to 12 tabs in their order. A `name` has 1 to 40 characters, + no control character and no space at either end; `modules` are + `lazurio.module.v1` ids, unique in the tab. +- Core also refuses what the JSON schema cannot express: two tabs of one name + (letter case ignored) and a module in two tabs (`settings_value_invalid`). +- A module named in no tab is in the first tab; ids that name no module are + ignored by the reader. The whole list is one key in `effective[]` + (`workspace.tabs`). +- **Readers first, again.** A reader that does not know `workspace` judges the + whole section `invalid` and keeps the settings it applied last. No + Organization declares tabs until Lazurio Core, the Dashboard and the + LazurioPlatform release that read them are out. + ### Check in CI ```text From ddf0c56f0fbd3605cc28a38b6c92017e1a7bf638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Such=C3=A1nek?= Date: Fri, 16 Oct 2026 19:08:12 +0200 Subject: [PATCH 2/2] Decisions: 0206 Workspace tabs belong to the Organization; 0188 offers the personal space only on the personal Environment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0206 (Matěj, 2026-10-16): inside Workspace the Organization names its own tabs and places each module in one, the same for every member. One setting in its repository (`settings.workspace.tabs`, decision 0194); a module in no tab is in the first; the Owner arranges the tabs in the Dashboard, reached from Apps' "Přesunout do karty" and "Upravit karty". Rejected: a per-browser arrangement and a fixed Work / Administration pair. 0188 addendum: a personal space is never created inside an Organization's Environment. The personal Environment offers it as before; the person's own computer may hold one but no longer offers it next to its Organizations (only `lazurio personalspace install` or an agent with consent); work, Team and Automated Environments never have one. Co-Authored-By: Claude Opus 5.5 --- manual/decision-register.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/manual/decision-register.md b/manual/decision-register.md index 8864ba6c..49fe05bc 100644 --- a/manual/decision-register.md +++ b/manual/decision-register.md @@ -121,7 +121,7 @@ frameworku se sem nepřenášejí). | 0185 | **Shell Lazuria, druhá iterace: rail přepíná Organizace, Environment se vybírá v hlavičce levého sloupce, vybraný stav je tichá plocha a Apps se zjednodušují.** Anička (spoluzakladatelka, owner design systému a UX shellu) navrhla po review wireframu, Matěj (Organization Admin) potvrdil 2026-10-04; plán DEV-6639. Mění 0179 body 2, 3 a 5 a navazuje na jeho dodatek z 2026-10-03 večer; navazuje na 0146, 0170, 0171 a 0180. (1) **Rail přepíná prostory.** Shora logo Lazuria (Dashboard), hledání (⌘⇧E), osobní prostor s iniciálami Ownera, pak avatar GitHub Organizace pro každou Organizaci a „+“; dole jen účet s fotkou z GitHubu. Ikony Environmentů, složky ani „+N“ v railu nejsou. Aktivní prostor obkreslí inkoustový prstenec. Klik na Organizaci vrátí do jejího naposledy otevřeného Environmentu ve stejné aplikaci, jinak do prvního a bez Environmentu do Dashboardu Organizace. Důvod: obecné ikony druhu Environmentu vypadají v každé Organizaci stejně a snadno se klikne vedle, avatar Organizace se pozná hned. (2) **Hlavička levého sloupce.** Nad přepínačem Chat · Apps · Automate je výběr Environmentu: jméno a pod ním, komu Environment slouží. Hned vedle je ozubené kolo, které otevře Nastavení přesně toho, co výběr jmenuje: Nastavení Environmentu, na Dashboardu Organizace Nastavení Organizace. V railu ozubené kolo není; Nastavení účtu jsou v nabídce účtu. Rozbalený seznam ukáže Environmenty daného prostoru podle jmen. Organizace v něm stojí nad svými Environmenty jako nadřazená položka, která otevře Dashboard Organizace; Dashboard není další řádek vedle Environmentů. Tento počítač je v seznamu každé Organizace, kterou nese, a otevře se pro ni. „Všechny Organizace“ seznam rozšíří. Seznam leží přes sloupec jen po dobu výběru, takže postranní panely forků zůstávají jejich; forky dál vkládají jen hlavičku sloupce, rail a bublinu Buddyho (0179 bod 6). ⌘⇧E skočí kamkoli. (3) **Jména Environmentů** říkají, k čemu Environment je: Team a jeho jméno, Pracovní, jméno persony, jméno počítače, Osobní; bez slova „VM“ (0170). Druhý řádek říká, komu slouží (sdílený Teamem, jen tvůj, @kolega, automatizace, předplatná Organizace), a stav jen tehdy, když Environment neběží. Technický název stroje je jen v Nastavení → Tento Environment, v Diagnostice, v Serverech a v adrese (0146). (4) **Vybraný stav je tichá plocha** podle design systému Lazuria (varianta A): plocha o stupeň tmavší, plná sazba a v seznamu fajfka se slovem. Hrana vlevo patří stavu („tady se má něco řešit“), a proto výběr nenese; vržený stín ani verzálky nejsou. Barva Organizace zůstává v jejím avataru a aktivní prvek neoznačuje. (5) **Apps.** Po přihlášení i při otevření bez adresy se otevřou Apps naposledy otevřeného Environmentu, poprvé prvního Environmentu první Organizace; Dashboard otevírá logo. Pamatuje si to účet v Dashboardu, protože každý Environment má vlastní adresu. Nahoře je název Organizace a pod ním Environment. Sekce jsou dvě podle dodatku 0179, Workspace a Productionspace; v Productionspace jsou repozitáře, ne Moduly. Levý sloupec nese jen Všechny moduly, Soubory, Oblíbené a dole Marketplace (zatím „již brzy“); seznam Modulů ani hledání v něm nejsou. Dlaždice ukazuje ikonu, název, krátký popis, hvězdičku oblíbeného a tři tečky; řádky stavu a vysvětlivky na ní nejsou. Klik otevře aplikaci Modulu tam, kde říká nastavení účtu: výchozí v nové záložce, volitelně ve stejném okně; nastavení platí pro celého člověka ve všech Environmentech, pro dlaždice i oblíbené, a drží ho účet v Dashboardu (Matěj 2026-10-04). Modul bez aplikace nic neotevře ani složku a jen krátce oznámí, že aplikaci nemá. Tři tečky nabízejí „Přidat do oblíbených“, „Informace o modulu“ (jediný vstup na stránku s lifecycle aplikace, složkou, větvemi a worktrees a logem) a Adminovi a Stewardovi Organizace „Přístup k modulu“. Ten ve stejném okně otevře Modul v Dashboardu Organizace, kde přepínač u každého Teamu rozhodne o jeho přístupu; změnu Dashboard provede na GitHubu právy toho, kdo ji dělá, a GitHub zůstává jedinou autoritou přístupů. Oblíbené patří člověku a Organizaci, jsou připnuté v levém sloupci a ve své sekci jdou první. (6) **Nový Modul.** Poslední dlaždicí Workspace je „+ Nový modul“, jen tam, kde skutečná GitHub identita Environmentu podle živé odpovědi GitHubu smí v Organizaci vytvořit repozitář a přiřadit ho Teamům; bez takové odpovědi se dlaždice neukáže (fail closed). Typicky je to pracovní Environment nebo počítač Ownera Organizace. Týmový Environment jedná brokerovanou aplikací Lazurio for GitHub v rozsahu grantů svého Teamu (0147, 0165), automatizovaný Environment vlastním GitHub účtem své persony (0169) a osobní Environment repozitáře Organizace nemá; dlaždici dostanou jen tehdy, když jejich identita tu schopnost skutečně má. Otevře Chat stejného Environmentu s připraveným, neodeslaným zadáním: Agent se nejdřív zeptá na účel, jméno, aplikaci a Teamy a Modul pak založí scaffoldem `lazurio module create` podle Lazurio Module Standard (0171), nejdřív přes `--dry-run`, a připraví pull request. Až bude hotové zakládání Modulu v Dashboardu (plán DEV-6634), povede „+ Nový modul“ tam místo do Chatu (Matěj 2026-10-04). **Vztah k dřívějším rozhodnutím:** 0179 bod 2 (rail Environmentů ve složkách s „+N“, aktivní Environment vyplněný akcentem Organizace), bod 3 (ozubené kolo v railu) a bod 5 (výběr Modulu v levém sloupci otevírá jeho přehled) se mění; dodatek 0179 o dvou sekcích platí. Ostatní body 0179 a 0180 beze změny. Přejmenování více Environmentů jednoho Teamu uzavírá 0186. Podklady: wireframe HumanAndMachine-ai/prototypes-lazurio#4, design system HumanAndMachine-ai/design-system-lazurio#54, fork T3 Code Lazurio/t3code#35. **Dodatek 2026-10-06 (Anička navrhla revizí wireframu, Matěj potvrdil): užší rail a kompaktní výběr Environmentu; mění body 1, 2 a 4.** (1) **Rail** má šířku jednoho kroku mřížky design systému, 64 px: položky 40 px, avatary Organizací i iniciály osobního prostoru 32 px a se stejným zaoblením, takže rohy jsou soustředné; najetí přinese jen plochu a tvar nemění. Osobní prostor je bílý monogram s linkou, nikdy inkoustový blok. Aktivní prostor nese místo inkoustového prstence tichou plochu s vlasovou linkou, stejně jako vybraný řádek. (2) **Rozbalený výběr** ukáže Environmenty daného prostoru, každý na jednom řádku: malá ikona, jméno a tlumeně komu slouží. Organizace v něm nestojí a výběr na Dashboard Organizace nevede, protože do výběru Environmentu míchala jinou úroveň. Dashboard Organizace otevře její název v hlavičce stránky, ⌘⇧E (ten nadřazené položky Organizací ponechává) nebo seznam Organizací na osobním Dashboardu. Hledání se ukáže, až je Environmentů víc než sedm; dole je jen „Všechny Organizace“. (3) **Vybraný řádek** má tichou plochu, plnou sazbu a fajfku; slovo „tady jsi“ zůstává jen pro čtečky obrazovky. Plovoucí vrstvy mají jeden stín a vlasovou linku a každý roh patří do jedné ze tří velikostí design systému. **Provedení:** shell v Lazurio/LazurioPlatform (dodatek F36 z 2026-10-06, vydání v0.1.8-rc.36), Dashboard ho vendoruje a Environmenty ho dostanou s dalším pinem Platformy. Podklady: wireframe HumanAndMachine-ai/prototypes-lazurio #11, #14, #15 a #17, design system HumanAndMachine-ai/design-system-lazurio #57, #58, #59 a #62. **Dodatek 2026-10-08 (0162, plán DEV-6626): levý sloupec Apps má pod Soubory navíc Připojené aplikace; mění bod 5.** Stránka je v obou režimech Composia místem, kde se aplikace připojují a odpojují (katalog, účty, odpojení); Nastavení → Nástroje drží jen přihlášení Composio účtu. **Dodatek 2026-10-09 (0162, plán DEV-6626): položka se jmenuje Integrace a režimy Composia se ruší.** Stránka Integrace má záložky Vše · Připojené · Vlastní; Nastavení → Nástroje drží přihlášení nástrojů včetně Composio účtu a povinný executor. **Dodatek 2026-10-13 (Matěj, plán DEV-6662, Lazurio/LazurioPlatform#359): osobní prostor ukazuje svému držiteli vždy Workspace s „+ Nový modul“ a tichou sekci odkazů; mění body 5 a 6.** (1) **Workspace osobního prostoru** se jeho ověřenému držiteli ukazuje vždy, i bez Modulů („zatím žádné moduly“), a jeho poslední dlaždicí je „+ Nový modul“. Držitelem je na osobním Remote Environmentu jeho Owner a na vlastním počítači přihlášený GitHub účet, pokud se ověří, že osobní prostor je jeho vlastní soukromý Personalspace (Lazurio/LazurioPlatform#186). Bez ověřeného držitele se dlaždice neukáže (fail closed). Dlaždice otevře Chat s připraveným, neodeslaným zadáním, které založí osobní Modul (dodatek 0171 z 2026-10-13); kde Chat na Environmentu neběží, například na vlastním počítači, se zadání zkopíruje do schránky jako u dlaždice Organizace. Dlaždice a její zadání vyjdou až spolu s osobním tvarem `lazurio module create`. (2) **Sekce „Co dalšího tu můžete dělat“.** Pod mřížkou osobního prostoru je tichá sekce odkazů Chat, Automate, Integrace (jméno položky levého sloupce podle dodatku z 2026-10-09) a Soubory. Zůstává i s Moduly a stojí vždy až za mřížkou, nikdy mezi dlaždicemi; její nadpis je tichý, ne třetí sekce vedle Workspace a Productionspace (dodatek 0179). Odkaz jen vede do aplikace, která věc vlastní, bez kopie jejího rozhraní. Kde Chat nebo Automate na Environmentu neběží, je jeho odkaz ztlumený stejnou větou jako přepínač aplikací. Odkazy smějí vyjít dřív než dlaždice. (3) **Vztah k bodu 6.** Pro osobní prostor tento dodatek nahrazuje pravidlo, že dlaždici dostane jen identita, která smí v Organizaci vytvořit repozitář; pro Workspace Organizací platí bod 6 beze změny. (4) **Marketplace i do osobního prostoru.** Až Marketplace vyjde, přidá aplikaci i do osobního prostoru: z osobního Environmentu nabídne „Přidat aplikaci do osobního prostoru“ a převzetí vede Agent bez výběru Teamu a bez kroku Admina, jen s potvrzením člověka; vznikne soukromý osobní Modul podle dodatku 0171 z 2026-10-13. Do vydání Marketplace je to cíl, ne nasazený stav. Podklady: wireframe HumanAndMachine-ai/prototypes-lazurio#43. | | 0186 | **Přístup Teamu k Modulu určuje živý grant na GitHubu; Dashboard ho mění právy člověka přes úzkou aplikaci Lazurio Administration Access; stav účtu se zapisuje přes bránu Environmentu a víc Environmentů jednoho Teamu se číslují.** Matěj (Organization Admin) 2026-10-04, plán DEV-6639; navazuje na 0185 body 5 a 6 a uzavírá jeho otevřenou otázku. (1) **Živý grant je pravda o přístupu.** O tom, které Teamy na Modul dosáhnou, rozhoduje grant na GitHubu. Přepínač v Dashboardu (Nastavení Organizace → Moduly → Modul, vstup „Přístup k modulu“ z Apps) mění jen tento grant. `modules[].teams` / `module_slots[].teams` v manifestu Organizace zůstává výchozím stavem při zakládání Modulu (`lazurio module create --teams`) a deklarací pro rozložení, ale už není autoritou přístupu; kontrola driftu v Dashboardu proto přestane hlásit Teamy, jejichž grant se od manifestu liší. (2) **Grant zapisuje člověk svými právy.** Změnu provede jednorázový uživatelský token toho, kdo přepíná, z nové GitHub aplikace Lazurio Administration Access s minimem, které GitHub pro zápis grantu Teamu vyžaduje: Administration: write k repozitářům a Members: read k Organizaci (s implicitním Metadata: read); Members: read jen čte Teamy a členy (oprava potvrzená Matějem týž den po review). Dashboard z ní nevydává instalační tokeny, nedrží její privátní klíč a token po změně zahodí; GitHub zapíše do auditu člověka, ne aplikaci. Lazurio for GitHub ani broker týmových Environmentů se nemění, aby jejich klíč neuměl měnit přístupy. Owner každé Organizace aplikaci jednou nainstaluje. Přepnutí Stewarda je žádost, kterou schválí Admin; Adminovo přepnutí je schválením samo (invariant 3 Dashboardu: přesná změna, schválení Adminem, zpětné čtení, audit). (3) **Stav účtu přes bránu Environmentu.** Oblíbené Moduly a poslední Environment zapisuje shell do Lazurio účtu přes bránu Environmentu tokenem člověka, stejně jako se podle F37 (LazurioPlatform) čte seznam jeho Environmentů. Brána zná jen jmenný prostor `/.lazurio/account/` s pevným seznamem cest (seznam Environmentů, přidání a odebrání oblíbeného, poslední Environment); vše ostatní odmítne a scope `lazurio-account` platí jen na těchto cestách. Který Environment se ptá, pozná Dashboard z podepsaného tokenu (každý Environment má u vydavatele vlastního klienta), nikdy z hlavičky. Token neuvidí Launchpad, aplikace ani Agent. Nastavení „Aplikace modulů otevírat“ se mění jen v Dashboardu a k Environmentům jde s tímto seznamem. (4) **Víc Environmentů jednoho Teamu** se jmenuje podle pořadí založení: „Team “, „Team 2“ a dál. Admin Organizace může kterýkoli Environment v Dashboardu přejmenovat. Dosavadní nastavený název platí jako přejmenování jen tam, kde se liší od odvozeného a neobsahuje „VM“ ani technický název stroje (0170). **Vztah k dřívějším rozhodnutím:** 0023 a 0041 platí pro rozložení a deklaraci Teamů; v otázce přístupu je mění bod 1. 0185 bod 3 už nemá otevřenou otázku přejmenování. Root zásada „GitHub je jediná autorita přístupů“ a pravidla Personalspace beze změny. Realizace: plán DEV-6639 (Dashboard #184, #185, #186, #187 a #194; dodatek F37 v LazurioPlatform; brána a scope v Machines a Auth podle DEV-6552). Založení aplikace Lazurio Administration Access a její instalace jsou kroky Ownerů na GitHubu. | | 0187 | **Barvy shellu Lazuria: prvky shellu berou barvy aplikace, ve které jsou, a každá aplikace si zatím vybírá vlastní téma.** Matěj (Organization Admin) a Anička (spoluzakladatelka, owner design systému a UX shellu) potvrdili 2026-10-04 po iteraci wireframu; plán DEV-6639. Navazuje na 0179 bod 6 a 0185. (1) **Shell nemá vlastní paletu.** Rail, hlavička levého sloupce (výběr Environmentu, ozubené kolo, přepínač Chat · Apps · Automate), rozbalený seznam Environmentů a nabídka účtu berou barvy aplikace, ve které jsou: v Chatu z tématu T3 Code, v Automate ze skinu MausBotu, v Apps a v Dashboardu z design systému Lazuria. Aplikace jim předá barevné role jako CSS proměnné `--lazurio-*` na svém dokumentu: plocha, text, tlumený text, linka, výrazná linka, hover, výběr, dráha přepínače, aktivní záložka, rozbalený seznam a jeho text, fokus. Prvky je čtou i ve svém shadow DOM. Kde role chybí, platí design systém. Tvary, písmo a pravidlo výběru (tichá plocha, fajfka se slovem) zůstávají z design systému. *(Od dodatku 0185 z 2026-10-06: fajfka bez viditelného slova, „tady jsi“ zůstává jen pro čtečky obrazovky; tvary, písmo a tichá plocha dál z design systému.)* (2) **Mezi railem a postranním panelem aplikace není čára** (Chat, Automate): rail má stejnou plochu jako panel vedle něj, takže působí jako jedna plocha. Apps drží jemnou linku design systému mezi railem a svým sloupcem, jak ji ukazuje wireframe. (3) **Logo Lazuria v railu je v bílém kolečku**, aby bylo stejně vidět ve všech tématech. (4) **Každá aplikace má zatím vlastní výběr tématu z palet, které sama má**: T3 Code svá témata ve světlé i tmavé variantě, MausBot své skiny, Apps design systém. Světlý nebo tmavý režim si člověk volí v aplikaci, která ho nabízí. (5) **Později** přijde mechanismus, který téma sjednotí napříč aplikacemi jednoho Environmentu. Z něj se stane téma Environmentu a nastaví ho jeho Operátor; vlastní palety Lazuria případně až potom. Dřívější návrh barvy Environmentu (šest barev, tečka u jména) se teď neimplementuje. **Provedení:** knihovna shellu v Lazurio/LazurioPlatform rozšiřuje rozhraní prvků verze 1 (F36) o barevné role; forky Lazurio/t3code a Lazurio/OpenMausBot mapují na role vlastní tokeny. **Vztah k dřívějším rozhodnutím:** 0185 a 0179 beze změny. Podklady: wireframe HumanAndMachine-ai/prototypes-lazurio#13. **Změněno rozhodnutím 0200:** body 4 a 5 pro T3 Code: jeho výchozí světlý vzhled na Environmentu je design systém Lazuria; témata T3 Code zůstávají volbou člověka. | -| 0188 | **První spuštění Environmentu: prohlídka po skutečném rozhraní k GitHubu v Nastavení, obsah podle druhu Environmentu a oprava v Chatu.** Matěj (Organization Admin) 2026-10-04 po pěti kolech wireframu s Aničkou (spoluzakladatelka, owner design systému a UX shellu); plán DEV-6644. Navazuje na 0091, 0153, 0178, 0185 a 0187. (1) **Prohlídka, ne formulář.** Kdo poprvé otevře svůj Environment (osobní, pracovní nebo vlastní počítač), dostane prohlídku po skutečném rozhraní: kroužek kolem prvku a bublina vedle; kliká sám. Pořadí: ozubené kolo → Nástroje → Připojit u gh, volitelně Composio, pak Tento Environment → stáhnout Organizaci nebo připravit osobní prostor, nakonec Apps, Chat, Automate a „Nastavení je vždycky tady“. Člověk se tak naučí, že napojení a obsah Environmentu patří do Nastavení. Prohlídka jde kdykoli ukončit. (2) **Bez GitHubu nic nefunguje.** Dokud chybí GitHub nebo obsah, říká to jednořádkový banner v Apps i v hlavičce sloupce shellu, tedy i v Chatu a Automate, i po zavření prohlídky; tlačítko vede do Nastavení a akci tam rovnou spustí. Rozhraní forků se nemění. (3) **Obsah podle druhu Environmentu.** Osobní Environment drží jen osobní prostor (Personalspace), pracovní jen svou Organizaci, vlastní počítač (instalace na localhostu) své Organizace i osobní prostor. Týmové a automatizované Environmenty připravuje jejich hosting; prohlídka se jich netýká. Platí 0091 a 0153: osobní VM nemá repozitáře Organizací a pracovní Environment Personalspace nemountuje. (4) **Stejné jádro jako CLI.** Organizaci stáhne `lazurio organization install ` s rolí člověka v Organizaci, osobní prostor `lazurio personalspace install`; Launchpad volá totéž jádro. Výběr se řídí živou rolí člověka ověřenou na GitHubu: Builder a Steward stahují s `--role builder` a `--role steward`, takže restricted sloty jen pro Admina a jejich potomci se vynechají bez jediné provider operace; plnou instalaci bez `--role` dostane jen ověřený Admin. Když roli nejde ověřit, instalace nezačne (fail closed). Personalspace se připravuje jen na osobním Environmentu a na localhostu: existuje-li na GitHubu, jen se naklonuje, jinak se založí ze šablony Lazuria jako soukromý repozitář. Stažení obsahu je samostatná operace, nikdy součást aktualizace produktu. (5) **Oprava v Chatu odkazem.** Když se příprava zastaví, „Vyřešit v Chatu“ otevře odkaz, který nese jen jméno připraveného zadání; text dodá Launchpad téhož Environmentu, takže cizí odkaz nic nepodstrčí. Chat otevře nové vlákno ve složce Lazurio a zadání jen vloží; odeslat ho musí člověk. Do rozhraní T3 Code se kvůli tomu nezasahuje. (6) **Texty pro kancelářského člověka.** Bubliny mají nejvýš 10–12 slov: proč a co se stane, nic technického, žádné nadpisky ani pokyny „klikni na…“ (kam, ukazuje kroužek). Nastavení nemá úvodní odstavce, podrobnosti patří do návodu (Guide). Nástroje mají svůj skutečný název, aby šel vyhledat a seděl s tím, co říká agent, a pod ním jednu větu, k čemu jsou; stav je Připojeno nebo Nepřipojeno. (7) **Připojený nástroj se pro agenty zapne sám**, aby po přihlášení rovnou fungoval; vypnout ho jde dál ručně. **Provedení:** Launchpad a jádro obsahu v Lazurio/LazurioPlatform (směr F9 content-sync), hlavička sloupce shellu podle 0187. Podklady: wireframe HumanAndMachine-ai/prototypes-lazurio#16. **Dodatek 2026-10-08 (0162, plán DEV-6626): aplikace se připojují v Apps → Připojené aplikace; upřesňuje bod 1.** Do Nastavení dál patří přihlášení nástrojů včetně Composio účtu. Jednotlivé aplikace se připojují na stránce Připojené aplikace a krok prohlídky „Připoj své aplikace“ vede tam. **Dodatek 2026-10-09 (0162, plán DEV-6626):** stránka, na kterou vede krok prohlídky „Připoj své aplikace“, se jmenuje Integrace. | +| 0188 | **První spuštění Environmentu: prohlídka po skutečném rozhraní k GitHubu v Nastavení, obsah podle druhu Environmentu a oprava v Chatu.** Matěj (Organization Admin) 2026-10-04 po pěti kolech wireframu s Aničkou (spoluzakladatelka, owner design systému a UX shellu); plán DEV-6644. Navazuje na 0091, 0153, 0178, 0185 a 0187. (1) **Prohlídka, ne formulář.** Kdo poprvé otevře svůj Environment (osobní, pracovní nebo vlastní počítač), dostane prohlídku po skutečném rozhraní: kroužek kolem prvku a bublina vedle; kliká sám. Pořadí: ozubené kolo → Nástroje → Připojit u gh, volitelně Composio, pak Tento Environment → stáhnout Organizaci nebo připravit osobní prostor, nakonec Apps, Chat, Automate a „Nastavení je vždycky tady“. Člověk se tak naučí, že napojení a obsah Environmentu patří do Nastavení. Prohlídka jde kdykoli ukončit. (2) **Bez GitHubu nic nefunguje.** Dokud chybí GitHub nebo obsah, říká to jednořádkový banner v Apps i v hlavičce sloupce shellu, tedy i v Chatu a Automate, i po zavření prohlídky; tlačítko vede do Nastavení a akci tam rovnou spustí. Rozhraní forků se nemění. (3) **Obsah podle druhu Environmentu.** Osobní Environment drží jen osobní prostor (Personalspace), pracovní jen svou Organizaci, vlastní počítač (instalace na localhostu) své Organizace i osobní prostor. Týmové a automatizované Environmenty připravuje jejich hosting; prohlídka se jich netýká. Platí 0091 a 0153: osobní VM nemá repozitáře Organizací a pracovní Environment Personalspace nemountuje. (4) **Stejné jádro jako CLI.** Organizaci stáhne `lazurio organization install ` s rolí člověka v Organizaci, osobní prostor `lazurio personalspace install`; Launchpad volá totéž jádro. Výběr se řídí živou rolí člověka ověřenou na GitHubu: Builder a Steward stahují s `--role builder` a `--role steward`, takže restricted sloty jen pro Admina a jejich potomci se vynechají bez jediné provider operace; plnou instalaci bez `--role` dostane jen ověřený Admin. Když roli nejde ověřit, instalace nezačne (fail closed). Personalspace se připravuje jen na osobním Environmentu a na localhostu: existuje-li na GitHubu, jen se naklonuje, jinak se založí ze šablony Lazuria jako soukromý repozitář. Stažení obsahu je samostatná operace, nikdy součást aktualizace produktu. (5) **Oprava v Chatu odkazem.** Když se příprava zastaví, „Vyřešit v Chatu“ otevře odkaz, který nese jen jméno připraveného zadání; text dodá Launchpad téhož Environmentu, takže cizí odkaz nic nepodstrčí. Chat otevře nové vlákno ve složce Lazurio a zadání jen vloží; odeslat ho musí člověk. Do rozhraní T3 Code se kvůli tomu nezasahuje. (6) **Texty pro kancelářského člověka.** Bubliny mají nejvýš 10–12 slov: proč a co se stane, nic technického, žádné nadpisky ani pokyny „klikni na…“ (kam, ukazuje kroužek). Nastavení nemá úvodní odstavce, podrobnosti patří do návodu (Guide). Nástroje mají svůj skutečný název, aby šel vyhledat a seděl s tím, co říká agent, a pod ním jednu větu, k čemu jsou; stav je Připojeno nebo Nepřipojeno. (7) **Připojený nástroj se pro agenty zapne sám**, aby po přihlášení rovnou fungoval; vypnout ho jde dál ručně. **Provedení:** Launchpad a jádro obsahu v Lazurio/LazurioPlatform (směr F9 content-sync), hlavička sloupce shellu podle 0187. Podklady: wireframe HumanAndMachine-ai/prototypes-lazurio#16. **Dodatek 2026-10-08 (0162, plán DEV-6626): aplikace se připojují v Apps → Připojené aplikace; upřesňuje bod 1.** Do Nastavení dál patří přihlášení nástrojů včetně Composio účtu. Jednotlivé aplikace se připojují na stránce Připojené aplikace a krok prohlídky „Připoj své aplikace“ vede tam. **Dodatek 2026-10-09 (0162, plán DEV-6626):** stránka, na kterou vede krok prohlídky „Připoj své aplikace“, se jmenuje Integrace. **Dodatek 2026-10-16 (Matěj, Organization Admin): osobní prostor se nabízí jen na osobním Prostředí; mění body 1, 3 a 4.** Osobní prostor se nikdy nezakládá uvnitř Prostředí Organizace; patří na osobní Prostředí člověka. (1) **Osobní Prostředí** nabízí osobní prostor jako svůj obsah jako dosud: řádek v Apps, krok prohlídky a krok Začínáme. (2) **Vlastní počítač** smí osobní prostor dál držet (bod 4, dodatek 0185 z 2026-10-13), ale vedle Organizací ho nenabízí: Apps, prohlídka ani Začínáme o něm nemluví, stažení všeho obsahu ho vynechá a krok Začínáme se jmenuje podle Organizací („Stáhnout Organizace“). Připraví se jen na výslovnou žádost, `lazurio personalspace install` nebo agentem se souhlasem člověka; už připravený a ověřený osobní prostor zůstává v Apps i s „+ Nový modul“. (3) **Pracovní, týmová a automatizovaná Prostředí** osobní prostor dál nikdy nemají (0091, 0153). **Provedení:** jedno pravidlo v rozsahu obsahu Prostředí v Lazurio/LazurioPlatform (dodatek F9 z 2026-10-16). | | 0189 | **Chat začíná v Lazurio Folderu; předání z Launchpadu nenese model, platí výchozí model T3 Code.** Matěj (Organization Admin) rozhodl 2026-10-04 po vyzkoušení „+ Nový modul“ na Remote Environmentu, kde se vlákno otevřelo v kořeni Organizace a s naposledy zvoleným slabým modelem. (1) **Všechno začíná v Lazurio Folderu.** Každé vlákno, které Launchpad, průvodce nebo prompt otevírá v Chatu, se otevře v projektu Lazurio Folderu (kořen Folderu daného Environmentu), ne v kořeni Organizace ani v Modulu. Prompt sám řekne, pro kterou Organizaci (jméno a GitHub login) a na čem se pracuje; Agent pak scope určí podle `AGENTS.md`. (2) **Předání promptu odkazem nese jen text a složku**, nikdy model ani reasoning effort. T3 Code otevře takové vlákno s **výchozím modelem z Nastavení** (poskytovatel, model, effort), ne s modelem, který zůstal v poli pro zprávu. (3) **Výchozí model drží Environment jako dobrou volbu i do budoucna.** Doporučení (dnes: přihlášený Codex → GPT 6.1 Sol, effort high; přihlášený Claude → Opus 5.5, effort high) žije na jednom místě a mění se jedním PR, když vyjde lepší model; vlastní volbu člověka nepřepisuje. Kdo doporučení vlastní a jak se kontroluje (Platforma s Doctor kontrolou, Machines rollout, nebo verze forku T3 Code), je otevřené v Lazurio/LazurioPlatform#178 s doporučením Platformy; volba se zapíše jako dodatek tohoto rozhodnutí. **Provedení:** Lazurio/LazurioPlatform#178 (cwd = kořen Folderu, prompt jmenuje Organizaci, výchozí model při přípravě Environmentu), Lazurio/t3code#39 (vlákno z odkazu s výchozím modelem z Nastavení). **Vztah k dřívějším rozhodnutím:** zpřesňuje předání promptu z 0185 (S16) pro Launchpad Platformy z 0167; nic neruší. **Dodatek 2026-10-05 (Matěj zvolil Platformu, Lazurio/LazurioPlatform#178; plán DEV-6644): výchozí model drží aktuální Platforma; uzavírá otevřenou otázku bodu 3.** (a) **Doporučení žije jednou v Platformě.** Doporučený výchozí model podle přihlášeného poskytovatele je na jednom místě v Lazurio/LazurioPlatform vedle instrukcí Folderu a vychází s každým vydáním Platformy; změna doporučení je jeden PR a jedno vydání. (b) **Jiná volba člověka se nepřepisuje.** Platforma si pamatuje hodnotu, kterou do výchozího modelu T3 Code sama zapsala, a aktualizace Platformy a `lazurio doctor` ho změní jen tehdy, když není nastavený nebo v něm pořád je přesně tahle zapsaná hodnota. Kdo si vybere jiný model, tomu ho Platforma nikdy nepřepíše. Kdo si v Nastavení T3 Code sám vybere právě doporučený model, toho Platforma od svého vlastního zápisu nerozezná a bere ho jako „podle doporučení“: s dalším doporučením se posune také (Matěj 2026-10-05 tuto výjimku výslovně přijal; rozlišit ji by vyžadovalo značku ve forku T3 Code nebo sledování souboru s nastavením). (c) **Doctor hlídá.** `lazurio doctor` upozorní, když je výchozí model starší nebo slabší než doporučení, nebo když jeho poskytovatel na Environmentu není přihlášený. **Zamítnuté varianty:** Machines při každém nasazení (každá změna by čekala na rollout a Machines by vlastnil produktovou preferenci) a verze forku T3 Code (svázané s přestavbou na upstream; fork neví, ke kterému poskytovateli se Operátor přihlásil). | | 0190 | **Dashboard podle wireframu na stacku Platformy: dnešní rozhraní Dashboardu je MVP a staví se znovu, doména a provoz zůstávají, Dashboard hostuje shell Lazuria a pořadí Organizací určuje člověk.** Matěj (Organization Admin) 2026-10-05; plán DEV-6645. Navazuje na 0178, 0179, 0185, 0186 a 0187. (1) **Rozhraní znovu, jádro zůstává.** Dashboard má vypadat a fungovat podle wireframu shellu: osobní Dashboard (Přehled, Organizace, Přidat organizaci, Nastavení účtu) a Dashboard Organizace (Přehled, Environmenty, Diagnostika a Nastavení Organizace se sekcemi). Dnešní rozhraní (HTML skládané na serveru ze šablon, jeden velký styl a vložené skripty) se zahodí. Zůstává, co je ověřené testy a nese pravidla Dashboardu: napojení na GitHub, zrcadlo členství, přihlášení, data, API účtu, přístup k modulům, diagnostika, infrastruktura a vydávací linka. (2) **Stejný stack jako Launchpad Platformy.** Bun v přesné verzi, přísný TypeScript, Biome a `bun test`; stránka bez frameworku vykreslovaná TypeScriptem v prohlížeči, české a anglické texty s typovanými klíči a tokeny design systému převzaté beze změny. Server je tabulka cest a JSON API nad doménou; o přístupu, navigaci a viditelnosti dál rozhoduje jen server. (3) **Dashboard hostuje shell.** Rail a hlavička sloupce v Dashboardu jsou tytéž prvky jako v Apps, Chatu a Automate. Stránka Dashboardu nepatří žádnému Environmentu; v Dashboardu Organizace hlavička sloupce jmenuje Organizaci a ozubené kolo vede do Nastavení Organizace; na osobním Dashboardu je aktivní logo. Účet dává shellu Dashboard sám, bez brány Environmentu. Platforma vydává shell jako ověřitelný artefakt každého vydání a Dashboard používá jedno připnuté vydání. (4) **Pořadí Organizací určuje člověk.** Na stránce Organizace v Dashboardu si seřadí své Organizace; pořadí patří k jeho účtu a podle něj řadí avatary Organizací rail ve všech aplikacích (0185) i úvodní přesměrování. (5) **Wireframe a design systém.** Kde se rozcházejí, platí design systém (vybraný stav je tichá plocha, obecným vstupem do Nastavení Organizace je jen ozubené kolo v hlavičce sloupce, bez další položky sloupce, bez nadpisků a verzálek); přímé odkazy na konkrétní místo, jako „Přístup k modulu“ z Apps (0185), zůstávají. Sekce, kterou role nevidí, se nezobrazuje. Dashboard ukazuje jen změřené hodnoty: dostupnost, vytížení ani historii neukazuje jako fakt, dokud je nic neměří. (6) **Přechod.** Nové rozhraní se nejdřív ověří na preview; produkce se přepne, až ho Matěj přijme v prohlížeči (0178), a staré rozhraní se pak smaže. Body 1, 2, 4 a 6 rozhodl Matěj; body 3 a 5 z nich plynou podle 0179, 0185 a 0187 a jejich provedení navrhl Task Agent. **Provedení:** HumanAndMachine-ai/Dashboard (`docs/dashboard-v2.md`) a Lazurio/LazurioPlatform (dodatek F36: stránka, která nepatří žádnému Environmentu, účet od hostitele, artefakt shellu). | | 0191 | **Prohlížeč a plocha Environmentu: jedno Chromium na Environment se sdílenými přihlášeními, okno pro každé vlákno a pohled se sledováním a převzetím v pravém panelu aplikací, ne čtvrtý mód.** Matěj (Organization Admin) 2026-10-05. Navazuje na 0162, 0172, 0175, 0146, 0178 a 0179. (1) **Jeden prohlížeč na Environment.** Na každém Remote Environmentu běží jeden prohlížeč Environmentu: Chromium s jedním trvalým profilem. Přihlášení v něm jsou schopnost Environmentu stejně jako `gh` nebo Composio (0162): sdílí je všechna vlákna a chaty, Task Agenti v Codexu, T3 Code i Claude Code, boti i Buddy. Uvnitř Environmentu se přihlášení neoddělují: žádný kontejner, profil pro vlákno ani sandbox. Kdo potřebuje jiná přihlášení, dostane jiný Environment (0172 bod 2). Přihlášení patří Environmentu, na kterém prohlížeč běží: vestavěný prohlížeč Codexu nebo desktopového T3 Code na notebooku drží přihlášení toho počítače, ne Remote Environmentu. (2) **Jedna obrazovka.** Environment má jednu virtuální obrazovku; běží na ní prohlížeč Environmentu i aplikace, které si na Environment člověk nainstaluje. Plocha Environmentu je pohled na celou obrazovku, pohled vlákna je pohled na jedno okno prohlížeče. (3) **Okno pro každé vlákno.** Každé vlákno pracuje ve vlastním okně téhož prohlížeče, takže se vlákna navzájem nepřepínají a člověk vidí práci jednoho vlákna. Okno zavírá agent; po nečinnosti se uklidí. Začíná se nejjednodušší variantou a ladí se podle provozu. (4) **Ovládání přes CLI.** Agenti ovládají prohlížeč Environmentu přes CLI `agent-browser` popsané v návodech Lazurio Folderu (0162: CLI-first), ne přes MCP server ani vlastní nástroj Lazuria. Lazurio staví na hotových, zdokumentovaných open source nástrojích a vlastní mašinérii přidává, jen když nástroj danou věc neumí. (5) **Sledování a převzetí.** Agent pošle do chatu odkaz na pohled svého okna na `browser...lazurio.io` (osobní Environment `browser..lazurio.io`), za bránou Environmentu a jen z tailnetu (0146). Člověk ho otevře v pravém panelu Codex Desktopu připojeného přes SSH, v pravém panelu webového T3 Code nebo Launchpadu, v tabu nebo na telefonu, sleduje, jak agent kliká, a při přihlášení, 2FA nebo CAPTCHA převezme ovládání. Kdo projde bránou Environmentu, vidí všechna jeho okna a smí je převzít. (6) **Trezor.** Prohlížeč Environmentu má rozšíření Bitwarden napojené na kolekci Environmentu v trezoru Organizace. (7) **Týmový Environment.** Osobní přihlášení do webů se tam neblokují: lidé vědí, že je Environment sdílený, a přihlásit se je jejich vědomá volba. Platforma říká, že přihlášení vidí celý Team a že sem patří týmové a firemní účty nebo účty, které je v pořádku s Teamem sdílet. Pravidlo 0168 pro `gh` platí dál. (8) **Plocha a Computer Use (druhá vlna).** Plocha Environmentu je dostupná na `desktop...lazurio.io` jako webová vzdálená plocha přes WebSocket; člověk na ní instaluje a používá aplikace. Agenti na ní pracují přes Computer Use jeden po druhém, protože myš a klávesnice jsou na ploše jedny; prohlížeč běží paralelně dál. Webové T3 Code má v pravém panelu položku Browser (pohled vlákna) a ve druhé vlně Desktop; desktopová aplikace T3 Code má vlastní prohlížeč a tímto rozhodnutím se nemění. (8a) **Pravý panel, ne čtvrtý mód.** Prohlížeč a plocha nejsou další položkou přepínače Apps · Chat · Automate (0179, 0185). Jsou to pohledy na Environment v pravém panelu aplikací, jak ho mají Codex Desktop, T3 Code i Lazurio MausBot: webové T3 Code ho má v panelu Browser, Launchpad dostane vlastní pravý panel, ve kterém si člověk ručně otevře prohlížeč Environmentu (všechna okna) nebo plochu. Každá aplikace do svého panelu vkládá tytéž adresy `browser.` a `desktop.`; vlastní prohlížeč ani plochu si žádná aplikace nestaví. (8b) **Jedna cookie brány na Environment.** Sezení brány Environmentu zůstává jedno pro všechny adresy jedné Mašiny (cookie s doménou `...lazurio.io`, 0146), aby pohledy vložené v pravém panelu jiné aplikace téhož Environmentu fungovaly bez dalšího přihlášení; přihlašovací stránka Lazurio Auth se v rámečku zobrazit nedá. Je to vědomá výjimka z pravidla prefixu `__Host-` pro cookies relying party (0179 bod 7) pro bránu Environmentu; zbytkové riziko, že sourozenecká adresa podstrčí cookie stejného jména, je omezené, protože ji cizí brána nerozšifruje. (9) **Vlastnictví a pořadí.** Machines dodají systémové balíčky (obrazovka, Chromium, později desktopové prostředí a vzdálená plocha) a pevné adresy `browser.` a `desktop.` v bráně; LazurioPlatform vlastní službu prohlížeče, pohled, nastavení `agent-browser` a návody Folderu (0144, 0161). Pořadí: první prohlížeč, druhá plocha s Computer Use, třetí Lazurio MausBot, který přejde na prohlížeč Environmentu místo vlastních profilů. Cílem je Linux Remote Environment (Ubuntu); základní Environment má 8 GiB RAM, náročnější práce dostane větší Environment. (10) **Předání jinému člověku.** Pracovní Environment jednoho operátora se jinému člověku nepřeřadí, dokud není profil prohlížeče Environmentu vymazaný, aby přihlášení předchozího operátora nepřešla na nástupce (0175). Dokud pro to není nástroj, vymaže profil při předání ručně ten, kdo Environment přeřazuje, podle návodu LazurioPlatform; bez vymazaného profilu se přeřazení nedělá. Ukončit relace u poskytovatelů, které nechce nechat běžet, může předchozí operátor sám. Týmového Environmentu, který je sdílený záměrně, ani osobního Environmentu s jedním Ownerem se to netýká. **Odloženo:** odhlášení z jednotlivých webů, přehled přihlášení a automatické vymazání profilu. **Co se nemění:** Publikace dál patří Operátorovi (0103); možnost agenta klikat v přihlášené aplikaci není souhlas se zápisem do ní a zápisy do napojených externích aplikací drží své brány podle `manual/external-app-integrations.md`. Personalspace a cross-org izolace platí dál (0091). **Stav:** jde o cíl; nic z toho zatím není nasazené. Volba konkrétního Chromium buildu, vzdálené plochy (kandidát Selkies, záloha KasmVNC) a nástroje pro Computer Use je technická a patří do issues owning repozitářů. **Dodatek z 2026-10-06 (pohled pro lidi, schránka a passkey; Matěj po pilotu):** (11) **Jedna záložka člověka = jedna vzdálená záložka.** Pohled pro lidi už není „prohlížeč v prohlížeči“; dashboard `agent-browser` se sezeními a záložkami uvnitř zůstává jen pilotní. Adresa `browser...lazurio.io` otevře novou vzdálenou záložku a `…/t/` je okno přesně do jedné záložky prohlížeče Environmentu. Záložky dělá aplikace, ve které člověk pracuje: T3 Code, ChatGPT a Codex Desktop, webový prohlížeč nebo telefon. Pohled má jen tenkou lištu (zpět, vpřed, obnovit, adresa) a titulek s ikonou přebírá ze stránky. Nová záložka člověka je nová vzdálená záložka. Zavřená záložka člověka zavře po krátké lhůtě i vzdálenou, pokud ji nepoužívá agent. Každá vzdálená záložka je vlastní okno prohlížeče Environmentu, protože se kreslí jen viditelná okna. (12) **Pop-upy a nové záložky.** Okno, které stránka otevře jako pop-up (přihlášení přes Google, okno rozšíření jako Bitwarden), se ukáže ve stejné záložce člověka nad stránkou a po zavření zmizí. Záložku, kterou stránka otevře jako novou, otevře T3 Code jako novou záložku panelu; jinde ji pohled nabídne jedním klikem. (13) **Spolupráce místo převzetí.** Agent a člověk klikají a píšou ve stejné záložce současně; ovládání se nepředává. (14) **Jediné přihlášení je brána.** Pohled nemá vlastní token; jedinou admission je sezení brány Environmentu (bod 8b). (15) **Schránka a klávesnice.** Vložení (Cmd nebo Ctrl+V) vloží text ze schránky člověka, kopírování vrátí text do jeho schránky a klávesy chodí se správnými kódy. (16) **Nic mimo stránku nesmí pohled zablokovat.** Dialogy stránek, výběr souboru a HTTP přihlášení ukáže pohled jako součást stránky. Žádosti o oprávnění (poloha, kamera, notifikace) prohlížeč rovnou odmítá. Na ostatní okna mimo stránku je plocha Environmentu (bod 8). (17) **Passkey přes Bitwarden Environmentu.** Cílem je, aby Bitwarden Environmentu (bod 6) držel jeho passkey i hesla v kolekci Environmentu a při přihlášení se nabídl. Passkey jsou tak preferovaná cesta přihlašování agentů i lidí. Passkey z telefonu přes QR kód a Bluetooth na Remote Environmentu fungovat nemůže. Do nasazení Bitwardenu prohlížeč Environmentu žádosti o passkey hned odmítá bez nativního okna, aby weby nabídly jinou cestu. (18) **Co dodatek mění v dřívějších bodech.** Bod 5: agent posílá do chatu odkaz na svou záložku `browser...lazurio.io/t/` (osobní Environment `browser..lazurio.io/t/`), ne holou adresu, protože holá adresa vždy založí novou vzdálenou záložku. Kdo projde bránou Environmentu, smí otevřít kteroukoli jeho záložku podle její adresy a pracovat v ní spolu s agentem; „převezme ovládání“ a „smí je převzít“ v bodě 5 i převzetí v názvu rozhodnutí nahrazuje spolupráce (bod 13). Bod 3: vlákno má tolik oken, kolik má záložek, protože každá vzdálená záložka je vlastní okno (bod 11); vlákna se dál navzájem nepřepínají. Bod 8a: pohled „prohlížeč Environmentu (všechna okna)“ se ruší, protože pohled pro lidi ukazuje vždy jen jednu záložku; přehled všech oken Environmentu dává jen plocha (`desktop.`, bod 8). Pravý panel Launchpadu otevírá prohlížeč stejně jako ostatní aplikace: holá adresa `browser.` v něm založí novou vzdálenou záložku a odkaz agenta `…/t/` otevře jeho záložku. Ostatní body 1–10 platí beze změny. **Stav dodatku:** pilotní dashboard zůstává jen na pilotním Environmentu; ostatní Environmenty dostanou prohlížeč až s tímto pohledem. Pohled je tenká služba LazurioPlatform nad Chrome DevTools protokolem (obraz a vstup jedné záložky); `agent-browser` zůstává nástrojem agentů. **Dodatek z 2026-10-09 (prohlížeč jiného Environmentu, osobní věci a označení pohledu; Matěj):** (19) **Věc patří do svého Environmentu.** Agent pracuje v prohlížeči Environmentu, kam věc patří. Osobní věci operátora (osobní e-mail, datová schránka, banka, osobní domény) a jejich přihlášení patří jen do osobního Environmentu, věci Organizace do jejího. Pracuje-li agent přes SSH v jiném Environmentu, platí tam hranice a `AGENTS.md` toho Environmentu. V prohlížeči Environmentu Organizace agent osobní věci neřeší a o přihlášení osobních účtů nežádá, protože přihlášení v něm patří Environmentu a jdou s ním dál, i při plném sdílení podle 0192; požádá-li o to člověk, agent mu to řekne a navrhne osobní Environment. Technicky se přihlášení neblokují a vědomá volba člověka na týmovém Environmentu (bod 7) platí dál. (20) **Prohlížeč jiného Environmentu v pravém panelu.** T3 Code a Launchpad smí v pravém panelu ukázat záložku prohlížeče jiného Environmentu. Poznají ji podle adresy `browser.<…>.lazurio.io/t/` a vloží její pohled přímo, s barevným rámečkem a označením toho Environmentu. Technicky to jde u všech Environmentů, kam má člověk přístup. Kdo záložku uvidí, dál rozhoduje brána toho Environmentu a přihlášení člověka (bod 8b); když sezení chybí, panel nabídne přihlášení v novém tabu prohlížeče, ve kterém člověk aplikaci otevřel. Kromě vlastního Environmentu proto pohled smí vložit jen T3 Code nebo Launchpad jiného Environmentu, který o něj žádá; aplikace Organizací ho vložit nesmí. (21) **Agent otevírá prohlížeč jen tam, kde ho ovládá.** Prakticky agent otevře a ovládá prohlížeč Environmentu, na kterém běží jeho příkazy. Z osobního Environmentu tak přes SSH otevírá prohlížeče pracovních Environmentů svého operátora a jejich záložky mu ukazuje v pravém panelu. Pohled jiného Environmentu nikdy nenačítá v prohlížeči svého Environmentu (pohled v pohledu), protože by tím prohlížeč jednoho Environmentu získal sezení brány druhého. Tuto hranici drží pravidlo pro agenty v návodech Folderu, ne technický zákaz: Matěj 2026-10-09 rozhodl prohlížeč Environmentu technicky neomezovat. Zbytkové riziko vědomě přijal: kdo v prohlížeči Environmentu otevře adresu jiného Environmentu nebo v něm spustí T3 Code či Launchpad se záložkou jiného Environmentu a přihlásí se, uloží sezení cizí brány do profilu toho prohlížeče. Kdo takové přihlášení najde, odhlásí ho. (22) **Každý pohled říká, čí je.** Pohled má vlevo nahoře vždy viditelnou ikonu Organizace nebo člověka a označení „ · “, u osobního Environmentu „Osobní · “. Označení se odvozuje z adresy pohledu a začíná jím i titulek tabu, takže je vidět i v holém tabu prohlížeče, v ChatGPT Desktopu nebo na telefonu. (23) **Co dodatek mění v dřívějších bodech.** Bod 8a: aplikace vkládá do panelu adresy `browser.` svého Environmentu a podle bodu 20 i jiných Environmentů. Bod 8b platí dál: sezení brány má každý Environment vlastní. Bod 7 platí dál pro vědomou volbu člověka; agent ji podle bodu 19 sám nevyvolává. Ostatní body platí beze změny. **Stav dodatku:** bod 19 a nová záložka pro novou stránku jsou v návodech Folderu (LazurioPlatform #289 a #290). Označení pohledu, jeho vkládání a záložky jiného Environmentu v panelu T3 Code se připravují v plánu DEV-6646. **Dodatek z 2026-10-11 večer (architektura prohlížeče pro aplikace a forky; Matěj):** (24) **Jedna architektura pro aplikace a forky.** Prohlížeč Environmentu má jednu architekturu pro Launchpad, T3 Code, Lazurio MausBot a napojení Codex Desktopu; popisuje ji `manual/environment-browser.md`. Podle ní se aktualizují forky T3 Code, Lazurio MausBot a agent-browser a reaguje se na nové verze upstreamu nebo Codex Desktopu. Prohlížeč patří Environmentu a je jeden, přihlašují se v něm účty pro všechny agenty Environmentu, karty otevírá Environment a agenti v nich pracují přes fork `agent-browser` upravený pro Lazurio (v T3 Code i přes jeho náhledové nástroje nad stejným prohlížečem); spravuje se z Launchpadu. (25) **Kompatibilita s T3 Code má přednost.** Přinese-li upstream T3 Code vlastní prohlížeč do webového T3 (upstream main k 2026-10-11 spouští prohlížeč na serveru T3), fork ho vyřadí nebo napojí na prohlížeč Environmentu a ponechá pohled vzdálené karty, který pro Remote Environment funguje. Overlay ve forku je ohraničený, popsaný v runbooku forku a minimální, aby šel přenést na další stable bez práce od začátku. (26) **Karty vlákna a bota.** V T3 Code drží karty lišta vlákna. Archivace nebo smazání vlákna zavře všechny jeho karty včetně vlastního okna jeho agenta; kartu, kterou drží i jiné vlákno nebo Launchpad, jen pustí, protože bod 11 rozhodnutí 0195 platí dál. Tím se rozhoduje otázka, kterou F47 v LazurioPlatform nechával otevřenou. Totéž se vymyslí pro boty Lazurio MausBotu. (27) **Codex Desktop je vědomý kompromis.** Upravit ho nelze: jeho agenti pracují v prohlížeči Environmentu přes `agent-browser` a posílají odkaz na pohled, Nová karta je pro něj samostatná stránka Launchpadu, jejíž karty drží Launchpad, a okna agentů Codexu drží jen práce agenta a sledování. **Stav dodatku:** dokument platí; Launchpad a hub staví plán DEV-6656 (úkol 917), T3 Code plán DEV-6646 (úkol 501). **Dodatek z 2026-10-12 (úklid a refaktor prohlížeče; Matěj):** (28) **Agent okno na konci pustí, nezavírá.** Agent svou práci v okně ukončí tím, že ho pustí (příkaz `lazurio browser done`, který refaktor přidá); kartu pak ukončí hub, až ji nic nedrží a nikdo se na ni nedívá. `agent-browser … tab close` agent nepoužívá, protože by zavřel kartu i všem, kdo ji drží nebo sledují; zavřít všem jde dál jen v Přehledu. (29) **Stránky pro člověka v Codex Desktopu nikdo nedrží.** Stránky otevřené ze samostatné Nové karty a stránky, které agent mimo T3 Code otevře pro člověka, žijí, dokud se na ně někdo dívá, a skončí 30 s po posledním divákovi (bod 11 rozhodnutí 0195). Codex Desktop nemá lištu ani ×, takže by se jinak hromadily v liště Launchpadu. Mění to bod 27: karty samostatné Nové karty už nedrží Launchpad. (30) **Desktopové T3 Code na Remote Environmentu.** Desktopová aplikace T3 Code připojená k Remote Environmentu, který prohlížeč deklaruje, ukazuje v pravém panelu karty vlákna z prohlížeče Environmentu; vlastní náhled desktopu zůstává pro lokální Environmenty. (31) **Karta jiného Environmentu všude.** Launchpad i Nová karta v každé aplikaci umí ukázat kartu jiného Environmentu, viditelně označenou jako cizí, stejně jako dnes T3 Code. (32) **Nečitelný soubor držitele zastaví jen svou aplikaci.** Jeden nečitelný soubor držitele zastaví ukončování jen karet, které drží právě on; ostatní karty Environmentu končí dál. `lazurio doctor` na nečitelný soubor hlasitě upozorní. Mění to pravidlo F47 bod 5, podle kterého jeden nečitelný soubor zastavil ukončování všech karet. Důsledek pro start hubu: co soubor drží, zná hub z jeho posledního přečtení a to neukládá, takže soubor, který od startu hubu přečíst nešel, nedrží nic, co by hub znal. Kartu, kterou pak nic jiného nedrží a nikdo nesleduje, ukončí hub po startu pohledu až po 10 minutách, a aplikace soubor při dalším zápisu nahradí. (33) **Jeden jazyk povrchů.** Všechny povrchy Lazuria mluví jazykem shellu svého Environmentu; jazyk prohlížeče platí jen pro samostatně otevřený pohled bez aplikace kolem. (34) **Lazurio MausBot.** Boti sdílejí jeden prohlížeč Environmentu: každý bot má svou lištu, kterou smazání nebo archivace bota pustí; na Lazuriu běží jen prohlížeč Environmentu, žádné prohlížeče a profily jednotlivých botů. Kartu ovládají bot i člověk společně, bez předávání ovládání. MausBot se kvůli tomu výrazně forkne, včetně změn rozhraní (například výběr modelu jako v T3 Code), a přijde na řadu jako poslední, po samostatné diskusi. (35) **Směr do budoucna: cizí Environment musí být vidět.** Kdo je v Environmentu, který mu nepatří (například servisní přístup k Environmentu kolegy), má to vidět na první pohled, třeba podle červeného rámečku; stejně tak karta prohlížeče z jiného Environmentu. Člověk tak nespustí prompt nebo akci v cizím Environmentu v domnění, že je ve svém. Zatím se neimplementuje; návrhy rozhraní s tím počítají. **Stav dodatku:** rozhodnuto; body 28–33 stavějí fáze refaktoru prohlížeče v plánech DEV-6656 a DEV-6646 (jeden smluvní modul Platformy s testovacími vektory, prvek shellu pro kartu prohlížeče, převzetí smlouvy forky), bod 34 přijde poslední a bod 35 je směr pro návrhy rozhraní. | @@ -138,6 +138,7 @@ frameworku se sem nepřenášejí). | 0202 | **Pracovní Prostředí Admina je správní stanoviště Organizace: z něj vede servisní SSH do Pracovních a Týmových Prostředí členů téže Organizace a správa jejího Conglomerate Hostu, přímo, bez laptopu.** Matěj (Organization Admin) 2026-10-15 po workshopu jedné Organizace; o totéž požádali Admini dalších Organizací. Navazuje na 0153, 0172, 0183 a 0192. Mění větu manuálu správy Ownery, že Pracovní Prostředí správní práva implicitně nezískává: pro výslovně jmenované Prostředí Admina je získává. (1) **Zdroj.** Jmenovitě deklarované Pracovní Prostředí člověka, který má živou roli Owner GitHub Organizace (v Lazuriu Organization Admin; v GitHub API role `admin`); „Owner nebo Admin“ v tomto rozhodnutí znamená tutéž jednu roli. Deklarace drží přesnou Mašinu: uzel tailnetu Organizace a jeho jedinou adresu. Agenti v tomto Prostředí jednají jménem toho člověka. Zdrojem nikdy není celý tag Organizace, Týmové ani Automatizované Prostředí, telefon ani zařízení jiného člověka. Role a identita uzlu se ověřují při každém nasazení. Když člověk roli ztratí, grant se odvolá změnou infra; průběžnou automatickou revokaci rozhodnutí neslibuje. (2) **Cíle.** Pracovní a Týmová Prostředí členů téže Organizace (servisní SSH pod účtem operátora Prostředí) a Conglomerate Host této Organizace (jmenovitý správní účet). Cílem nikdy není Osobní Prostředí ani jiná Organizace, a opačný směr do Prostředí Admina nevzniká. (3) **Personalspace do Pracovních Prostředí nepatří.** Leží výhradně v Osobním Prostředí uživatele, takže vstup Admina do Pracovního Prostředí otevírá jen pracovní záležitosti Organizace daného uživatele. Pracovní Prostředí, která dnes osobní prostor obsahují, se srovnají navazující prací. Do té doby Agent Admina cizí personalspace nečte (hranici drží proces). (4) **Přijaté riziko.** Kdo ovládne Prostředí Admina, dostane se do všech Pracovních a Týmových Prostředí jeho Organizace. Je to vědomá daň za správu. Přímé cesty omezují přesné granty Headscale na Prostředí téže Organizace; samotný tailnet izolaci dat negarantuje, protože jeden tailnet a jeden Conglomerate Host mohou obsluhovat víc Organizací (0192). Správu hostitele dostává jen Owner Organizace, která hostitel vlastní; když hostitel obsluhuje víc Organizací, ovládnutí jeho Prostředí zasáhne všechny tenanty hostitele, stejně jako dnes ovládnutí jeho laptopu. Privátní klíč zůstává v Prostředí Admina. (5) **Realizace.** Machines přijmou jmenované Pracovní Prostředí jako zdroj servisních a správních grantů Conglomerate Hostu a před nasazením ověří živou roli Owner (na GitHubu role `admin` organizace); infra repozitáře Organizací granty deklarují; manuál správy Ownery se upraví. **Dnes:** rozhodnuto, nenasazeno; změna Machines a nasazení v Organizacích jsou navazující práce. | | 0203 | **Trezory podle Organizací: každá Organizace má vlastní Lazurio Vaultwarden, člověk do něj vstupuje pod uživatelským jménem svého Lazurio účtu a osobní Prostředí používají vlastní Bitwarden.** Matěj (Organization Admin) 2026-10-15 po rozboru architektury trezorů, dokud trezor používají jen pilotní uživatelé; plán DEV-6631. Navazuje na 0091, 0153, 0154, 0172, 0192, 0197 a 0198. (1) **Lazurio Vaultwarden každé Organizace.** Conglomerate Host provozuje pro každou Organizaci, kterou obsluhuje, vlastní instanci Lazurio Vaultwardenu na adrese `vaultwarden..lazurio.io`, s vlastní databází, zálohou, aktualizacemi a přihlašovacím klientem v Lazurio Auth; dostupná je jen z tailnetu sítě (0197 bod 11). Účet člověka v trezoru tak patří jedné Organizaci a v rozšíření Bitwarden má člověk účet pro každou Organizaci; jeden profil prohlížeče unese nejvýš pět účtů, další profil dalších pět. Účty se v rozšíření liší adresou serveru, proto ji nese jméno Organizace. Trezory Prostředí (0198 bod 1) leží ve Vaultwardenu své Organizace a zkratku Organizace v názvu nenesou: „ “, u týmového Prostředí jen jeho jméno. Instance Organizace se stěhuje celá, nikdy kopií databáze do další běžící instance: klienti Bitwardenu by kopii považovali za tentýž server a účty by si přepisovali. (2) **Hranicí je Conglomerate.** Organizace jednoho Conglomerate jsou spřátelené firmy se společným Headscale a tvoří jednu bezpečnostní hranici. Lazurio Auth proto do Vaultwardenu kterékoli z nich pustí člena kterékoli Organizace, kterou síť obsluhuje, jako dosud; co člověk uvidí, určují jen trezory, do kterých je pozván. Kdo odejde z jedné Organizace a zůstane v okruhu, se do jejího Vaultwardenu dál přihlásí, ale vidí jen to, co mu někdo výslovně nasdílel; z trezorů Prostředí ho Prostředí po ztrátě přístupu odebere samo (0198 bod 2). (3) **Trezor Organizace.** Každý Vaultwarden Organizace má jeden Trezor Organizace pro hesla, která si lidé sdílejí mezi sebou, v kolekcích, jak je ve Vaultwardenu běžné. Ownerem je Admin Organizace jako člověk, nikdy technický účet, aby k němu provozovatel hostu neměl klíč; jako Owner si zpřístupní všechno, což je vědomý rozdíl proti trezorům Prostředí. Členy zve a potvrzuje Admin, i lidi ze spřátelených Organizací. Účty Prostředí v něm nikdy nejsou: kolekce jsou ve Vaultwardenu oprávnění serveru, ne samostatné šifrování, takže by agenti drželi klíč ke všem firemním heslům; co má dostat agent, zkopíruje člověk do trezoru Prostředí. Při odchodu člověka z Organizace ho z Trezoru Organizace odebere Admin a Dashboard mu to připomene, aniž by trezor viděl. Web trezoru, vlastní build Lazurio Vaultwardenu, Admina správou provede, aby se v ní neztrácel. Co Organizace přiděluje Prostředím (0198 bod 8), zůstává otevřené a zvlášť. (4) **Uživatelské jméno Lazurio účtu.** Každý Lazurio účet má jedno uživatelské jméno: malými písmeny, jedinečné, nikdy se nemění a nikdy se nepřidělí znovu, ani po smazání účtu. S připojeným GitHubem je to GitHub login z prvního přihlášení. Bez GitHubu si ho člověk zvolí tak, aby na GitHubu neexistovalo ani jako uživatel, ani jako organizace, a jména se s GitHubem co nejméně překrývala; Lazurio mu doporučí si ho na GitHubu zarezervovat založením účtu. Patří-li GitHub login už jinému Lazurio účtu (po přejmenování na GitHubu), zvolí si člověk jiné jméno podle stejného pravidla. Existující účty dostanou svůj zmrazený GitHub login. Jméno vydává Lazurio Auth a je jediným jménem člověka všude: v adrese trezoru, v Headscale i jako osobní DNS slug (0153). Prostředí ho dostává od přihlášení jako ověřený údaj, nikdy ho neskládá z GitHubu. (5) **Adresa Lazurio účtu.** Adresa člověka ve Vaultwardenu je `@account.lazurio.ai`. Je to identifikátor, nikdy schránka: doména má záznam „null MX“ a nikdy to není `@lazurio.ai`. Mimo trezor ji smí dostat jen aplikace za Lazurio přihlášením, která e-mail jako přihlašovací jméno vyžaduje, a každá vědomě; nikdy neslouží jako kontakt pro poštu. Vaultwarden z adresy odvozuje šifrování hlavního hesla, proto se adresa ani jméno nemění. Technické účty Prostředí zůstávají `vaultwarden-@` (0197 bod 3), protože jejich adresa je zároveň jednorázové pověření k registraci. (6) **Agenti beze změny.** Prostředí si účet zaregistruje samo s náhodným hlavním heslem, které nezná žádný člověk, a s API klíčem; obojí leží jen v Prostředí. Přihlašuje se API klíčem, dešifruje uloženým heslem a drží jednu odemčenou relaci pro všechny své agenty; cílově stejným účtem přihlásí i rozšíření v prohlížeči Prostředí (0197 bod 7). Agenti nikdy nepoužívají účet ani heslo člověka. (7) **Osobní Prostředí s vlastním Bitwardenem.** Osobní Prostředí nepatří žádné Organizaci, proto nepoužívá Lazurio Vaultwarden: člověk mu připojí Bitwarden podle své volby, typicky bezplatný Bitwarden jako službu (bitwarden.eu nebo bitwarden.com). Agenti vždy dostanou vlastní účet, nikdy hlavní účet člověka, a to ve stejné službě a regionu jako účet člověka, protože organizaci mezi regiony sdílet nejde; trezorem osobního Prostředí je bezplatná organizace Bitwardenu pro dva, člověka a účet agentů. Kdo Bitwarden nemá, tomu návod doporučí bitwarden.eu. Služba při registraci ověřuje e-mail, takže účet agentů založí člověk, vytvoří mu API klíč a jednou ho vyplní v Nastavení → Trezor, stejně jako odpověď na žádost o tajemství; dál Prostředí postupuje samo, založí si trezor a pozve do něj člověka. Přihlášení API klíčem služba neověřuje kódem z e-mailu. Ochrana „jen z tailnetu“ tu neplatí; je to volba člověka. Jak Bitwarden připojit, lidem vysvětlí motion grafika. Výhledově mají být osobní Prostředí dostupná primárně bez tailnetu, jen za Lazurio Auth; to mění 0154 a rozhodne se samostatně. (8) **Přechod bez migrace dat.** Trezor zatím používají jen pilotní uživatelé, proto se přechází načisto: dosavadní trezor sítě zůstane Vaultwardenem Organizace, jejíž adresu nese, nebo se přestaví načisto, a ostatní Organizace sítě dostanou nové instance. Lidé se přihlásí znovu pod novou adresou a své položky si převedou sami. Dokud Auth nevydává uživatelská jména, lidé se do trezorů nezvou, aby nevznikaly adresy, které by se musely měnit. **Mění:** 0197 bod 2 (adresu `@vaultwarden-identity.lazurio.ai` nahrazuje `@account.lazurio.ai`), 0197 body 2 a 11 a 0198 bod 3 (trezor sítě s jedním účtem člověka na síť nahrazuje Vaultwarden každé Organizace s účtem člověka pro každou Organizaci; tailnet zůstává), 0197 bod 5 a 0198 bod 4 (osobní Prostředí místo trezoru sítě používá vlastní Bitwarden), 0198 bod 1 (název trezoru Prostředí bez zkratky Organizace), 0198 bod 2 (Trezor Organizace pro hesla lidí existuje; role dál nedává přístup do trezorů Prostředí) a 0153 (osobní DNS slug je uživatelské jméno Lazurio účtu). Kde 0193, 0197 nebo 0198 mluví o trezoru či Vaultwardenu sítě, platí Vaultwarden Organizace, u osobního Prostředí jeho vlastní Bitwarden. **Nemění:** 0197 body 1, 3, 4, 7 až 10 a 12, 0198 body 5 až 9, vstup podle 0192 a soukromí Personalspace (0091). **Stav:** cíl. Implementaci vlastní plán DEV-6631: Lazurio Auth (uživatelské jméno, adresa a klient pro každý Vaultwarden), Machines (Vaultwarden pro každou Organizaci), LazurioPlatform (Správci podle uživatelského jména, osobní Prostředí s vlastním Bitwardenem) a `Lazurio/vaultwarden` (web, který Admina provede). | | 0204 | **LazurioExampleOrganization je veřejná referenční Organizace Lazuria: její Prostředí jsou na vlastním serveru dostupná bez tailnetu, vyzkoušet je může každý Lazurio účet a je první vlnou každého rolloutu, kde rollouty a restarty nepotřebují souhlas.** Matěj (Organization Admin) 2026-10-16; plán DEV-6668. Navazuje na 0146, 0172, 0181, 0192, 0194 a 0201. (1) **Rozsah.** Platí jen pro GitHub Organizaci `LazurioExampleOrganization` (id 325048785), Mašiny, které vlastní, a jejich Prostředí. Jiná Organizace se na toto rozhodnutí nesmí odvolávat ani ho rozšiřovat; další veřejná Organizace potřebuje vlastní rozhodnutí. Organizace drží jen fiktivní data a veřejné repozitáře; jedinou výjimkou je její soukromé Deployment Repo (bod 8). Nemá v Gitu žádné tajemství, žádná data skutečných lidí ani klientů a nic, co sahá do jiné Organizace. (2) **Veřejný vstup bez tailnetu.** Organizace má vlastní dedikovaný server. Její Prostředí jsou dostupná přes veřejné HTTPS vlastním veřejným vstupem Organizace na tomto serveru, bez Tailscale/Headscale a bez schvalování zařízení. Jména leží ve veřejném DNS ve vlastní delegované zóně Organizace a certifikáty vydává vlastní služba DNS-01 Organizace. Žádná z jejích Mašin není v žádném tailnetu. Všechny ostatní Organizace drží 0146, 0184 a 0192 beze změny. (3) **Kdo smí kam.** Prostředí pro návštěvníky pouštějí každý přihlášený Lazurio účet bez členství, pozvánky a grantu v Auth, s plným přístupem do Prostředí na jedno použití; vyzkoušení nabízí Dashboard každému přihlášenému účtu. Návštěvník se nikdy nestává členem Organizace ani spolupracovníkem na GitHubu. Všechna ostatní Prostředí Organizace se řídí 0192 bez její síťové podmínky: členství a výslovný grant zůstávají povinné a návštěvníci do nich grant nedostanou. Zda je Organizace veřejná, určuje platforma (Dashboard a Machines), nikdy nastavení Organizace samotné (0194). (4) **Prostředí na jedno použití.** Organizace ani provozovatelé nedávají Prostředí pro návštěvníky žádné přihlášení: žádný trezor, žádné Integrace, žádné předplatné AI a žádnou schopnost zápisu na GitHubu; nic z jiné Organizace v nich není. Odchozí provoz omezuje allowlist. Prostředí pro návštěvníky jsou dvojí. *Sdílené Prostředí* pouští současně každý přihlášený účet: návštěvníci v něm vidí a mohou měnit práci jeden druhého, což je vědomě přijaté riziko prvního sdíleného Prostředí. Vstup to předem řekne a zakáže do něj přihlašovat vlastní účty a zadávat osobní údaje; nejméně jednou za noc se vrací do stavu posledního reviewovaného nasazení a jeho vstupní tajemství vzniknou znovu. *Prostředí návštěvníka* má vždy jen jeden účet. Dalšímu se předá až po dokončeném návratu do stavu posledního reviewovaného nasazení s novými vstupními tajemstvími; když návrat selže, zůstane zavřené. Jen sem smí návštěvník přihlásit vlastní účet GitHubu nebo vlastní předplatné AI. Jsou to jeho přihlášení s jeho oprávněními a na jeho riziko, včetně toho, kam jeho účet sahá mimo tuto Organizaci; Organizace je nijak nerozšiřuje, vidět je mohou i provozovatelé Organizace, vstup to předem řekne a návrat po relaci je smaže. Kterékoli Prostředí i celý server lze kdykoli nasadit znovu od nuly. Zahazuje se tím stav Prostředí; není to rollback vydání, takže 0166 platí beze změny. (5) **GitHub.** Organizace dává Prostředím pro návštěvníky na GitHubu jen schopnost ke čtení; vlastní účet návštěvníka smí být jen v Prostředí návštěvníka podle bodu 4. Výchozí větve všech repozitářů Organizace chrání rulesety bez výjimky pro Lazurio for GitHub. (6) **AI.** Návštěvník nikdy nedostane sdílené předplatné ani AI pool (0181 zůstává jen pro členy). Dokud neexistuje brána s rozpočtovým stropem, AI není, nebo si návštěvník přinese vlastní předplatné do Prostředí návštěvníka podle bodu 4. Pozdější model se platí klíčem s pevným stropem, který se nikdy nedostane do Prostředí pro návštěvníky. (7) **První vlna každého rolloutu.** Organizace je prvním cílem každého rolloutu sdíleného softwaru Lazuria: Machines, LazurioPlatform, forků T3 Code a Lazurio MausBot a změn Auth nebo Dashboardu ve vstupu do Prostředí. Netýká se sdílené řídicí vrstvy (vydavatel Auth, nasazení Dashboardu, Headscale a Vaultwarden Conglomerate Hostu) ani vstupu přes tailnet, které tato Organizace nemá; ty si drží dosavadní brány. *Bez souhlasu:* rollouty, restarty, reinstalace a nová nasazení jejích Mašin a Prostředí, včetně předběžných kandidátů, nepotřebují souhlas lidí, kteří tato Prostředí používají, ani okno. Provádí je Agent jako součást vydání na pokyn svého Operátora, který má v této Organizaci živou roli Admin, a v jeho právech; Agent tím žádnou vlastní pravomoc nezískává. *Zůstává:* pokyn Operátora, review zdrojů sdílených repozitářů, brány životního cyklu Machines (sloučený záměr s Permitem, nebo zveřejněný canary marker), schvalování vydání, zákaz tajemství v Gitu a vlastní souhlas každé jiné Organizace. *Akceptace před další vlnou:* rollout postoupí do další vlny až po akceptaci v prohlížeči na této Organizaci (0178). (8) **Deployment Repo zůstává soukromé jako všude.** Deployment Repo Organizace je samostatný soukromý repozitář uvnitř Organizace (např. `LazurioExampleOrganization/machines`), takže brány Machines pro něj platí beze změny. Veřejný repozitář `infra` drží jen veřejnou dokumentaci. Přístupové údaje a soukromé vstupy zůstávají v custody mimo Git. (9) **Beze změny:** 0153/0154 (na tomto serveru neběží žádná osobní Mašina a žádná osobní Mašina není dosažitelná mimo tailnet svého Ownera), 0091 Personalspace, 0172 plný přístup (proto je každé Prostředí pro návštěvníky samostatná Mašina oddělená od ostatních Prostředí Organizace), GitHub jako autorita repozitářových schopností a Auth jako autorita účtů. **Vztah k dřívějším rozhodnutím, jen pro tuto Organizaci:** 0146: jména dílen jsou veřejně dostupná vlastním vstupem Organizace, bez split DNS Conglomerate Hostu a bez fail-closed produkční brány pro labely VM, a DNS-01 běží na vstupu Organizace, ne na Conglomerate Hostu. 0154 a 0184 se na Organizaci nerozšiřují a Headscale v ní není; pro osobní Mašiny platí 0154 beze změny. 0192: podmínka Tailscale a zařízení schváleného Adminem neplatí pro žádné Prostředí Organizace a Prostředí pro návštěvníky pouštějí nečleny bez grantu, tedy veřejnou cestou i lidi mimo Organizaci. 0181 bod 1: na dedikovaném serveru Organizace je jedna servisní Mašina pro veřejný vstup; AI pool návštěvník nikdy nedostane. 0203: Organizace nemá Conglomerate Host, a proto ani Lazurio Vaultwarden. 0157: výjimka nativního párování T3 se nepoužívá, každý požadavek T3 prochází admission. 0201: Prostředí pro návštěvníky mají ukázkový onboarding bez kroku „nejdřív AI“. Praxe rolloutů se souhlasem lidí, kteří Prostředí používají, a s oknem ustupuje bodu 7; review zdrojů a brány vydání zůstávají. Záznam canary v LazurioPlatform dál vyžaduje jedno osobní Prostředí mimo tuto Organizaci, protože tato Organizace osobní Prostředí nemá; pracovní Prostředí do něj dodává ona. **Provedení:** plán DEV-6668: server a soukromé Deployment Repo, delegovaná DNS zóna, vstupní Mašina a první sdílené Prostředí s nočním resetem, vstup přes Auth a Dashboard, později Prostředí návštěvníka a brána AI. Postupy vydání Machines, LazurioPlatform, T3 Code a MausBot uvedou tuto Organizaci jako první vlnu. **Dnes:** rozhodnuto, nenasazeno. | +| 0206 | **Karty ve Workspace určuje Organizace: jedno nastavení v jejím repozitáři, stejné pro všechny členy, které upravuje Owner v Dashboardu.** Matěj (Organization Admin) 2026-10-16 po návrhu Ownera partnerské Organizace (Lazurio/LazurioPlatform#428 a #446) a prohlídce prototypu; provedení Lazurio/LazurioPlatform#467 (dodatek F32 z 2026-10-16). Navazuje na 0179 (dodatek o dvou sekcích), 0185 bod 5 a 0194. (1) **Co člověk vidí.** Apps mají dál sekce Workspace a Productionspace. Organizace si ve Workspace může pojmenovat vlastní karty, například „Každodenní práce“, „Finance“ nebo „Sklad“, a každý Modul zařadit do jedné z nich. Rozdělení je stejné pro všechny členy. Dělá to, co dřív v rozhraní zkoušely Teamy, ale s Teamy ani s přístupy nesouvisí. Vlastní pořadí člověka zůstávají Oblíbené v levém sloupci. (2) **Jedna pravda.** Karty jsou nastavení Organizace `settings.workspace.tabs` v `lazurio.organization.json` jejího repozitáře (0194 bod 1): karty v pořadí, každá se jménem a Moduly podle id. Nejvýš 12 karet, jméno má 1 až 40 znaků, dvě karty nemají stejné jméno a Modul je nejvýš v jedné kartě. Neplatné nastavení neplatí celé a Workspace zůstane jedním seznamem. Pole v `modules.manifest.json`, databáze Dashboardu ani nastavení v prohlížeči nevznikají. (3) **První karta drží zbytek.** Modul, který Organizace nikam nezařadila, i každý nový Modul je v první kartě; tam zůstává i „+ Nový modul“. Karta, která na tomto Prostředí nemá žádný Modul, se neukáže, a méně než dvě karty znamenají Workspace bez karet. Moduly, které Prostředí nemá, zůstávají skryté (LazurioPlatform F32, dodatek z 2026-10-15). (4) **Upravuje Owner v Dashboardu.** Kde živá odpověď GitHubu říká, že identita Prostředí je Owner Organizace, nabídnou Apps v nabídce dlaždice „Přesunout do karty“ a vedle karet „Upravit karty“. Obojí otevře Moduly Organizace v jejím Dashboardu, který změnu zapíše právy Ownera a přečte zpět (0194 bod 2); Apps nic nezapisují. Agent může změnu navrhnout pull requestem. (5) **Texty.** Karty nesou jen svá jména, bez počtů a vysvětlivek. **Pořadí zavedení:** Lazurio Core (`organization-settings-lib.mjs` a schéma manifestu), vydání LazurioPlatform a Dashboard (ověření, doručení a editor). Dřív žádná Organizace karty nedeklaruje, protože starší čtenáři by celou sekci nastavení považovali za neplatnou a nechali by poslední použité nastavení. Doručení přes bránu Prostředí (LazurioPlatform F45), díky kterému se změna ukáže do několika minut a ne až po další synchronizaci obsahu, přijde jako další krok. **Vztah k dřívějším rozhodnutím:** 0179 (dodatek o dvou sekcích) a 0185 bod 5 se doplňují o karty uvnitř Workspace; 0194 beze změny. **Zamítnuto:** rozdělení podle člověka v prohlížeči (Lazurio/LazurioPlatform#446) a pevná dvojice Práce / Správa. | **Dodatek 0192 — důvěrné plné sdílení, rozhodnutí Operátora 2026-10-06:** Přidělený uživatel smí vědomě předat důvěryhodnému členovi téže Organizace vše dostupné v pracovním individuálním Environmentu, včetně osobních přihlášení a existujících vzdálených přístupů. Systém vysvětlí rozsah a umožní odebrat vstup; nevynucuje odhlášení, výmaz ani převod na týmový broker. Sdílející přijímá riziko použití těchto účtů; publikaci uvnitř runtime drží proces, ne izolace jednotlivých lidí. Odebrání vstupu nevrátí kopie dat a samo neodvolá externí klíče. Aktivní členství a zařízení schválené Adminem zůstávají povinné; externí hosté ani Personalspace se tímto nepovolují. Plný kontrakt: [přístupový model](environment-access-model.md); vývoj doporučení: [review](environment-access-review-2026-10-06.md).