diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/app.css b/src/ClawdDotNet.Manager.Web/wwwroot/app.css
index 10c146d..2137930 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/app.css
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/app.css
@@ -1795,3 +1795,116 @@ td.klein {
.team-flaeche { flex-direction: column; }
.team-seitenleiste { width: auto; }
}
+
+/* ─── Organisation (#683) ─── */
+
+.org-ansicht {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.org-raster {
+ display: grid;
+ grid-template-columns: minmax(260px, 360px) 1fr;
+ gap: 16px;
+ align-items: start;
+}
+
+.org-baum {
+ background: var(--surface);
+ border: 1px solid var(--divider);
+ padding: 12px;
+}
+
+.org-baum-kopf {
+ justify-content: space-between;
+ margin-bottom: 8px;
+}
+
+.org-knoten-liste {
+ display: flex;
+ flex-direction: column;
+}
+
+.org-ebene-titel {
+ padding: 6px 12px;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+button.org-knoten {
+ width: 100%;
+ justify-content: space-between;
+ border: none;
+ border-left: 3px solid transparent;
+ background: transparent;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ text-align: left;
+}
+
+button.org-knoten.aktiv {
+ border-left-color: var(--accent);
+ background: var(--surface-hover);
+}
+
+button.org-einheit .org-name {
+ font-weight: 600;
+}
+
+.org-detail {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.org-detail .karte {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.org-grund input {
+ width: 100%;
+}
+
+.org-werkzeuge {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
+ gap: 4px 12px;
+}
+
+.org-werkzeug {
+ font-size: 13px;
+}
+
+.org-einstellung {
+ flex-wrap: wrap;
+}
+
+.org-liste {
+ list-style: none;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+tr.org-ausreisser td {
+ background: rgba(181, 130, 42, 0.08);
+}
+
+.org-probleme {
+ border: 1px solid var(--gefahr);
+ border-left-width: 4px;
+ padding: 10px 14px;
+ font-size: 13px;
+}
+
+.org-probleme ul {
+ margin: 6px 0 0 18px;
+}
+
+@media (max-width: 900px) {
+ .org-raster { grid-template-columns: 1fr; }
+}
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/app.js b/src/ClawdDotNet.Manager.Web/wwwroot/app.js
index efe8187..cc0fcc4 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/app.js
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/app.js
@@ -36,6 +36,7 @@ import { renderUsageTimeline } from "./views/usage-timeline.js";
import { renderRunDetail } from "./views/run-detail.js";
import { renderPromptHistory } from "./views/prompt-history.js";
import { renderTeam, leaveTeam } from "./views/team.js";
+import { renderOrganisation } from "./views/organisation.js";
// ─── 1. Routen registrieren ───
@@ -53,6 +54,7 @@ registriereRoute("/agenten", () => { verlasseAnsicht(); return rendereAgenten();
registriereRoute("/agenten/:agentId", (p) => { verlasseAnsicht(); return rendereAgenten(p); });
registriereRoute("/aufgaben", () => { verlasseAnsicht(); return rendereAufgaben(); });
registriereRoute("/team", () => { verlasseAnsicht(); return renderTeam(); });
+registriereRoute("/organisation", () => { verlasseAnsicht(); return renderOrganisation(); });
registriereRoute("/dienste", () => { verlasseAnsicht(); return rendereDienste(); });
registriereRoute("/staging", () => { verlasseAnsicht(); return rendereStaging(); });
registriereRoute("/verbrauch", () => { verlasseAnsicht(); return rendereVerbrauch(); });
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json
index 30a58ba..15194c8 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json
@@ -68,6 +68,65 @@
"nav.agents": "Agenten",
"nav.tasks": "Aufgaben",
"nav.team": "Teamübersicht",
+ "common.saved": "Gespeichert.",
+ "common.create": "Anlegen",
+ "nav.organisation": "Organisation",
+ "org.title": "Organisation",
+ "org.subtitle": "Einheiten, Leitungen und Mitglieder. Jeder Agent erreicht nur seine Einheit und seine Leitung — die Struktur ist das Adressbuch.",
+ "org.problems": "Probleme in der Struktur",
+ "org.structure": "Struktur",
+ "org.newUnit": "Neue Einheit",
+ "org.newSubUnit": "Neue Untereinheit",
+ "org.topLevel": "Oberste Ebene",
+ "org.leadShort": "Leitung",
+ "org.unitId": "Kennung (Buchstaben, Ziffern, - und _)",
+ "org.unitName": "Name",
+ "org.parent": "Übergeordnete Einheit",
+ "org.goal": "Ziel der Einheit",
+ "org.reason": "Begründung der Änderung (geht ins Audit)",
+ "org.reasonPlaceholder": "z. B. Marktplätze bekommen ein eigenes Team",
+ "org.selectHint": "Links eine Einheit oder einen Agenten wählen.",
+ "org.lead": "Leitung",
+ "org.noLead": "— keine Leitung (die Leitung darüber übernimmt) —",
+ "org.leadHint": "Die Leitung muss Mitglied der Einheit sein.",
+ "org.position": "Platz im Baum",
+ "org.move": "Verschieben",
+ "org.moveUnitHint": "Die Mitglieder bleiben in der Einheit; es ändert sich, was darüber liegt. Nicht möglich, solange ein betroffener Agent läuft.",
+ "org.ceiling": "Rechte-Obergrenze",
+ "org.ceilingHint": "Was die Einheit nicht darf, kann ein Mitglied nicht bekommen. Senken entzieht den Mitgliedern Werkzeuge — nach einer Bestätigung.",
+ "org.ceilingLimit": "Werkzeuge dieser Einheit begrenzen",
+ "org.ceilingInherited": "Von oben begrenzt auf: {tools}",
+ "org.settings": "Sammelwerte",
+ "org.settingsHint": "Werden nach einer Vorschau in die Agenten geschrieben. Die Einheit merkt sich den Wert nur als Vorgabe für neue Mitglieder — zur Laufzeit übertrumpft nichts einen Agenten.",
+ "org.setting.DailyCostUsd": "Tagesbudget (USD)",
+ "org.setting.DailyTokens": "Tagesbudget (Tokens)",
+ "org.setting.Model": "Modell",
+ "org.setting.WhenExhausted": "Wenn das Budget erschöpft ist",
+ "org.modePerAgent": "jeder Agent bekommt den Wert",
+ "org.modeDistribute": "Wert ist ein Gesamtbetrag, verteilt",
+ "org.preview": "Vorschau",
+ "org.apply": "Gewählte Werte schreiben",
+ "org.agent": "Agent",
+ "org.current": "Bisher",
+ "org.proposed": "Neu",
+ "org.outlier": "Ausreißer",
+ "org.outlierHint": "Ausreißer weichen stark von ihren Kollegen ab — oft ein Spezialist mit bewusst anderem Wert. Sie sind standardmäßig nicht gewählt.",
+ "org.rememberDefault": "Als Vorgabe für neue Mitglieder merken",
+ "org.settingInvalid": "Dieser Wert ist für diese Einstellung nicht gültig.",
+ "org.members": "Mitglieder",
+ "org.noMembers": "Noch keine Mitglieder.",
+ "org.deleteUnit": "Einheit löschen",
+ "org.unit": "Einheit",
+ "org.answersTo": "Berichtet an",
+ "org.human": "einen Menschen",
+ "org.since": "In dieser Einheit seit {time}",
+ "org.tools": "Werkzeuge",
+ "org.moveAgent": "Agent verschieben",
+ "org.moveAgentHint": "Adressbuch, Leitung und womöglich Werkzeuge ändern sich. Der Agent und beide Leitungen erfahren es in ihrem nächsten Lauf.",
+ "org.toolsLostTitle": "Werkzeuge würden entfernt",
+ "org.toolsLostIntro": "Der neue Platz hat eine Rechte-Obergrenze. Diese Agenten verlören Werkzeuge:",
+ "org.toolsLostConfirm": "Werkzeuge entfernen und übernehmen",
+ "org.runningRefusal": "Nicht, solange {agents} läuft — ein Agent darf nicht mitten im Lauf andere Rechte bekommen.",
"team.title": "Teamübersicht",
"team.subtitle": "Wer arbeitet, wer hat in den letzten Sekunden wen erreicht, und wo klemmt es. Ein Klick auf einen Agenten zeigt Einzelheiten.",
"team.noInstance": "Keine Instanz ausgewählt. Oben eine aktive Instanz wählen.",
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json
index ee7f842..1e90287 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json
@@ -68,6 +68,65 @@
"nav.agents": "Agents",
"nav.tasks": "Tasks",
"nav.team": "Team overview",
+ "common.saved": "Saved.",
+ "common.create": "Create",
+ "nav.organisation": "Organisation",
+ "org.title": "Organisation",
+ "org.subtitle": "Units, leads and members. Every agent only reaches its unit and its lead — the structure is the address book.",
+ "org.problems": "Problems in the structure",
+ "org.structure": "Structure",
+ "org.newUnit": "New unit",
+ "org.newSubUnit": "New sub-unit",
+ "org.topLevel": "Top level",
+ "org.leadShort": "lead",
+ "org.unitId": "Id (letters, digits, - and _)",
+ "org.unitName": "Name",
+ "org.parent": "Parent unit",
+ "org.goal": "Goal of the unit",
+ "org.reason": "Reason for the change (goes into the audit log)",
+ "org.reasonPlaceholder": "e.g. marketplaces get their own team",
+ "org.selectHint": "Select a unit or an agent on the left.",
+ "org.lead": "Lead",
+ "org.noLead": "— no lead (the lead above takes over) —",
+ "org.leadHint": "The lead must be a member of the unit.",
+ "org.position": "Position in the tree",
+ "org.move": "Move",
+ "org.moveUnitHint": "The members stay in the unit; what changes is what lies above it. Not possible while an affected agent is running.",
+ "org.ceiling": "Tool ceiling",
+ "org.ceilingHint": "What the unit may not have, a member cannot be granted. Lowering it removes tools from the members — after a confirmation.",
+ "org.ceilingLimit": "Limit the tools of this unit",
+ "org.ceilingInherited": "Limited from above to: {tools}",
+ "org.settings": "Unit-wide values",
+ "org.settingsHint": "Written into the agents after a preview. The unit keeps the value only as a default for new members — nothing overrides an agent at run time.",
+ "org.setting.DailyCostUsd": "Daily budget (USD)",
+ "org.setting.DailyTokens": "Daily budget (tokens)",
+ "org.setting.Model": "Model",
+ "org.setting.WhenExhausted": "When the budget is exhausted",
+ "org.modePerAgent": "each agent gets the value",
+ "org.modeDistribute": "value is a total, distributed",
+ "org.preview": "Preview",
+ "org.apply": "Write the selected values",
+ "org.agent": "Agent",
+ "org.current": "Current",
+ "org.proposed": "New",
+ "org.outlier": "outlier",
+ "org.outlierHint": "Outliers differ strongly from their colleagues — often a specialist with a deliberately different value. They are not selected by default.",
+ "org.rememberDefault": "Remember as default for new members",
+ "org.settingInvalid": "That value is not valid for this setting.",
+ "org.members": "Members",
+ "org.noMembers": "No members yet.",
+ "org.deleteUnit": "Delete unit",
+ "org.unit": "Unit",
+ "org.answersTo": "Answers to",
+ "org.human": "a human",
+ "org.since": "In this unit since {time}",
+ "org.tools": "Tools",
+ "org.moveAgent": "Move agent",
+ "org.moveAgentHint": "Its address book, its lead and possibly its tools change. The agent and both leads are told in their next run.",
+ "org.toolsLostTitle": "Tools would be removed",
+ "org.toolsLostIntro": "The new position has a tool ceiling. These agents would lose tools:",
+ "org.toolsLostConfirm": "Remove the tools and apply",
+ "org.runningRefusal": "Not while {agents} is running — an agent must not get different rights in the middle of a run.",
"team.title": "Team overview",
"team.subtitle": "Who is working, who reached whom in the last seconds, and where something is stuck. Click an agent for details.",
"team.noInstance": "No instance selected. Choose an active instance in the header.",
diff --git a/src/ClawdDotNet.Manager.Web/wwwroot/index.html b/src/ClawdDotNet.Manager.Web/wwwroot/index.html
index 34b1ee7..8526081 100644
--- a/src/ClawdDotNet.Manager.Web/wwwroot/index.html
+++ b/src/ClawdDotNet.Manager.Web/wwwroot/index.html
@@ -61,6 +61,12 @@
Team overview
+
+
+ Organisation
+