Files
werkregie/doc/werkregie.werkbaum
claude-codeandClaude Opus 5.5 2351ecb21e
werkator build failed after 04:36
werkator/dependencies build succeeded after 00:18
PR document, README, risk analysis and plan for matrix send and read
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 18:43:35 +02:00

566 lines
40 KiB
Plaintext

%% Werkregie, planned with Werkbaum (https://werkbaum.javagil.de): what exists, what comes next.
%% Status: [^] live on mih09 or in use, [x] done but not in use, [~] in work, [ ] planned, [?] idea, [-] dropped.
%% Each PR updates this file with the status its merge brings: main is what runs, there are no release commits,
%% so the PR that finishes a feature already sets it to [^]. The block behind --- explains the nodes with an id.
%% View: https://werkbaum.javagil.de/?sourceUrl=https://git.javagil.de/mi/werkregie/raw/branch/main/doc/werkregie.werkbaum
[~] #werkregie: Werkregie https://git.javagil.de/mi/werkregie
- [^] #dash: Dashboard https://werkregie.javagil.de
" What the coding agents and the build pipeline are doing, read-only, with links back to the tools.
- [^] #dash.sources: Sources
- [^] #dash.claude: Claude Code sessions, Desktop and terminal
" Busy, waiting and closed sessions; the resume command to copy.
- [^] A Desktop session opens in Claude Desktop; the logo opens the sessions waiting (XS)
" Werkregie PR#30: claude://code/continue and claude://code/needs-input; not on a phone.
- [^] #dash.claude.phone: On a phone, a session with Remote Control opens in the Claude app (XS)
" Werkregie PR#60: the last of its bridgeSessionIds on claude.ai/code; the logo opens claude.ai/code.
- [^] #dash.claude.ask: Du bist dran for a session that waits for the user (S)
" Werkregie PR#40: the process file, an unanswered AskUserQuestion, or Jev's rating of Claude's last text.
- [^] #dash.claude.dismiss: A session can be dismissed from Du bist dran until it changes (XS)
" Werkregie PR#44: kept on the server for all devices; only with the access token.
" Werkregie PR#56: every row shows ✕, dimmed with the reason where it cannot dismiss.
- [^] #dash.claude.tip: The tooltip shows the user's last input and Claude's question (S)
" Werkregie PR#47: a text over 160 characters summarized once by Haiku 5.5 through OpenRouter.
" PR#50: an answer to AskUserQuestion counts as input; an older prompt is searched up to 8 MiB back.
- [^] #dash.claude.info: An info symbol shows the two texts on a phone (XS)
" Werkregie PR#51: a tap opens them below the title of the row, a second tap closes them.
- [^] #dash.codex: Codex threads, Desktop, IDE and CLI (S)
" Codex' SQLite state read-only; a running turn from the tail of the rollout file.
+ [ ] A thread opens in the Codex app (XS)
" Werkregie PR#30: the ChatGPT app on Linux takes codex://threads/<id>, but does not act on it yet.
- [^] #dash.werkator: Werkator builds, any number of instances
- [^] Running and finished builds, @ai-review builds as werkrevisor (S)
" Three repositories at a time with a 30 s timeout; the control token reveals private repositories.
- [^] No failure that a newer build of its branch superseded (XS)
" Werkregie PR#46; from Werkator's build history, without a change in Werkator.
- [^] #dash.gitea: Gitea, any number of instances
- [^] Open pull requests, scope mine or all (S)
" The token comes from a tea login, by name or user.
- [^] Commit statuses: Werkator, werkrevisor run and verdict (S)
- [^] #dash.flags: Markers by what a pull request asks of whom (S)
" Festgefahren, Dein Approval, Mergen, Nacharbeit, Kommentar, Wartet auf Review, Agent arbeitet, Von dir approved;
" drafts carry none, are dimmed and sorted last.
- [^] #dash.merge: Mergen also for an agent's pull request that passed everything (XS)
" Werkregie PR#17; not while Gitea's automerge is scheduled.
- [^] #dash.merge.own: Mergen for the user's own pull request that its branch protection lets merge (S)
" Werkregie PR#94: official approvals and required checks of the base; behind it, rebase first.
- [^] #dash.answer.own: Antworten for the user's own pull request that another human commented (S)
" Werkregie PR#95: comments and reviews with comments after the last commit and answer; no review bots.
- [^] #dash.agent.works: Agent arbeitet instead of Freigeben while an agent's session works on the branch (S)
" Werkregie PR#96: a line of the session on the branch within 10 min, in a checkout of the same repository.
- [^] #dash.colleague: A colleague's pull request is neither to merge nor stuck for the user (S)
" Werkregie PR#97: agents per Gitea, default [claude-code]; any other author than the user is a colleague.
- [^] #dash.pr.session: Each pull request shows the session that works on it (S)
" Werkregie PR#98: the latest mention of its URL in the transcripts, a command before a text; the branch as fallback.
- [^] #dash.agent.works.url: Agent arbeitet also for a session that named the pull request a short time ago (XS)
" Werkregie PR#99: its URL in a shell command within 10 min, in a checkout of any repository; a text does not count.
- [^] #dash.order: Pull requests sorted by the user's next step, the longest waiting first (XS)
" Werkregie PR#17; ORANGE before YELLOW.
- [^] #dash.requested: Dein Approval for a requested review, no false alarm right after a push
- [^] A pending REQUEST_REVIEW counts once werkrevisor's result is there (XS)
" Werkregie PR#37; PR#42: not while werkrevisor reviews.
- [-] A requested review counts also while werkrevisor reviews (XS)
" Werkregie PR#37; dropped by PR#42: the user cannot approve before werkrevisor's result.
- [^] werkrevisor's first status is awaited for 2 min after the last change (XS)
" Werkregie PR#37.
- [^] #dash.conflict: Festgefahren for an agent's conflict left for 30 min (XS)
" Werkregie PR#43; measured from the later of the head commit and main leaving its base.
- [^] Own activity in the history (XS)
- [^] #dash.projects: Projects matched by repository name across sources (XS)
- [^] #dash.load: Werkator's host load
- [^] Werkator's verdict and its reasons (XS)
" Werkregie PR#27: /api/system.
- [-] CPU line of 24 hours, meters of CPU, RAM and disk (XS)
" Werkregie PR#27; replaced by the small charts of PR#31.
- [^] Small charts with levels and scales as on Werkator's home rail (XS)
" Werkregie PR#31.
- [-] Fixed charts: CPU, RAM, disk, load, and the worst of swap and the waits (XS)
" Werkregie PR#31; replaced by the 3 most critical charts of PR#34.
- [^] A chart for each disk, not only the first (XS)
" Werkregie PR#32: e.g. SSD and HDD of Werkator javagil.
- [^] Only the 3 most critical charts, in Werkator's order (XS)
" Werkregie PR#34: by level, then by the value against its threshold.
- [^] A failed history is read again after 30 s, not after 5 min (XS)
" Werkregie PR#34: the charts no longer stay empty after a restart.
- [^] Running builds of the slots, e.g. 1/2, before the verdict (XS)
" Werkregie PR#39: coloured as on Werkator's tile "Builds".
- [^] #dash.costs: werkrevisor's review costs of 24 hours and 7 days (XS)
" Werkregie PR#27: /api/stats of the statistics service.
- [~] #dash.merges: Merges into the default branch per day, week and month
- [^] The configured authors of each Gitea, stacked (S)
" Werkregie PR#78: Gitea's issue search; `mergeAuthors`, by default the token's user.
- [^] Changed lines per period, mean and median per pull request (S)
" Werkregie PR#80: `additions` and `deletions` of the pull request that is asked anyway.
- [^] Merges in the demo data (XS)
" Werkregie PR#81: a developer and a coding agent, invented by formula.
- [^] Tests of the counting by day, week and month (S)
" Werkregie PR#83: node --test without npm, ADR 0002; merges.js apart from index.html.
- [^] #dash.taiga: Taiga, any number of instances and projects
- [^] Open stories, tasks and issues assigned to the user (S)
" Werkregie PR#21: panel Aufgaben; login by user and password from the environment.
" Werkregie PR#23: the API address from Taiga's conf.json, as on a host of its own.
- [^] Statuses in their configured order, unknown ones first (XS)
" Werkregie PR#25: equal names in one place; unknown ones first and marked.
- [^] Hidden statuses, shown on demand (XS)
" Werkregie PR#25: e.g. Erledigt and Verworfen, which Taiga counts as open.
- [^] Taiga's status colours (XS)
" Werkregie PR#25: a dot before the status.
- [ ] A story links to its pull requests and its Werkbaum node (S)
- [?] Other task boards than Taiga
- [~] #dash.matrix: Matrix messages with the user's own account
" Werkregie PR#8: walking skeleton; PR#12: verification and key backup.
- [^] #dash.matrix.sdk: Trixnity on the JVM, with vodozemac rather than libolm (XS)
" Werkregie PR#5: it does; the spike is in dashboard/spikes/matrix-sdk.
- [^] Login as a device of its own, in the relay (S) :#dash.matrix.sdk
" Werkregie PR#8: werkregie-dashboard matrix login; the session lives in an H2 file.
" Werkregie PR#11: one client per machine; a second process reads along.
- [^] #dash.matrix.verify: Device verified by the recovery key (S)
" Werkregie PR#12: werkregie-dashboard matrix verify; also takes the security phrase.
- [^] Room keys from the key backup (S) :#dash.matrix.verify
" Werkregie PR#12: rows shown as encrypted get another try when the relay starts.
+ [ ] Device verified by emoji comparison (S)
- [^] Direct messages, mentions in every room, configured rooms (S)
- [^] The server gets room, sender, time and the start of the text (S)
- [^] Panel for the messages (S)
" Werkregie PR#15: rows lead with room and sender.
- [^] #dash.matrix.last: Each direct chat and configured room keeps its last message (S)
" Werkregie PR#13; mentions stay within the period.
- [^] #dash.matrix.read: Unread messages stand out, read ones are subdued (S)
" Werkregie PR#13: read receipts; PR#14: also Element's read marker m.fully_read.
- [^] An empty panel counts the older messages and offers 7 days (XS)
- [ ] #dash.matrix.accounts: Several Matrix accounts and servers (M)
- [^] #dash.matrix.link: Link into Element (XS)
- [^] Element Desktop on the desktop, the Element app on a phone (XS)
" Werkregie PR#29: a phone gets matrix.to; kept messages take matrix.link.
+ [ ] Older messages than the first sync brings (S)
- [x] #dash.matrix.react: An agent marks an own message with a reaction (S)
" Werkregie PR#91: matrix react; it takes sync.lock, so the relay stops for it.
- [x] The running relay sends the reaction, without a stop (S) :#dash.matrix.react
" Werkregie PR#93: the holder of sync.lock serves control.sock; matrix react asks it first.
- [x] An agent writes and reads a room (S) :#dash.matrix.react
" Werkregie PR#100: matrix send and matrix read, plain text, also through control.sock.
- [^] #dash.page: Page
- [^] Panels: Läuft jetzt, Offene Sessions, Offene Pull Requests, Verlauf (S)
" Werkregie PR#27: each in a tab, complete; headings name the tools the rows come from.
- [-] Three and a half rows per panel until opened (XS)
" Werkregie PR#27: dropped; the overview shows what matters, the tabs the complete lists.
- [^] #dash.overview: Overview: connected, and where to act
" Werkregie PR#27, design A3 of the design canvas.
- [^] Connection bar with the tools' logos; a silent relay counts as not connected (S)
- [^] One logo per tool; a tap opens a menu of its instances and relays (XS)
" Werkregie PR#68: the bar fits on a phone; the logo shows the worst state of its sources.
- [^] A logo of several sources shows two dots, the worst in front, the best behind (XS)
" Werkregie PR#73: all failed or only some, without opening the menu.
- [^] On a phone, the logos shrink instead of breaking the row (XS)
" Werkregie PR#76: from 34 px down to the logo itself; 9 logos fit in 320 px.
- [^] Du bist dran, grouped by action, with the tool's logo and a link (S)
- [^] A row of Du bist dran with new content shows inverted for 12 s (XS)
" Werkregie PR#38: as the cards since PR#33; time in a reason, e.g. "RED seit 2 h", is no change.
- [^] Werkator's load and builds, werkrevisor's costs beside it (S)
- [^] Running work and waiting sessions as cards (XS)
- [^] A card with new content shows inverted for 12 s (XS)
" Werkregie PR#33: age and durations alone are no change; PR#36: 12 s instead of 7 s.
- [^] The history of 24 hours as a lane per tool (S)
- [^] Tabs for the lists, a bar at the bottom on phones (S)
- [^] #dash.lang: German and English, switched in the header (S)
" Texts the sources compose stay as the server writes them.
+ [ ] Server texts in both languages, e.g. Gitea activity (S) :#dash.lang
- [^] Filters: source chips, project combobox, time window, search (S)
- [^] Two-line pull request rows with coloured marker chips (XS)
- [^] Werkator's design, light and dark with a toggle (S)
- [^] The footer links the repository and its releases (XS)
" Werkregie PR#35: the build takes the repository from origin, without user or token.
- [^] Reloads every 5 s while visible; cached data served at once (XS)
- [^] #dash.modes: Modes
- [^] #dash.local: local: everything read on this machine, loopback only, no token (XS)
- [^] #dash.server: server: Werkator, Gitea and relays on a host
- [^] Access token as cookie or bearer; demo data without it (S)
- [^] Relay registry: stale, gone, kept in relays.json (S)
- [^] forget-relay NAME (XS)
- [^] init server: systemd unit and .htaccess (XS)
- [^] The restart page reloads itself every 15 s (XS)
" Werkregie PR#28.
- [^] Runtime bundle with its own JRE (S)
- [^] #dash.relay: relay: reports local sessions to the server every 5 s
" On think as a systemd user unit; outgoing connections only.
+ [ ] Relays on the Omarchy hosts (XS)
- [~] #dash.pwa: Frontend as a PWA
- [^] Web app manifest and icons (XS)
" Werkregie PR#2; the title bar follows the header's light or dark colour.
- [^] Service worker: app shell offline, API never cached (S)
" Werkregie PR#2: network first; Chrome finds no installability errors.
- [^] Last state shown offline, marked as stale (S)
" Werkregie PR#19: localStorage, an amber banner with the age; never demo data.
- [^] A new version of the server loads an open page again (XS)
" Werkregie PR#36: the footer shows the page's version; at most once per version and tab.
- [^] Loads robustly after waking up; the header shows a late relay (XS)
" Werkregie PR#52: also on pageshow and online, a retry after 1 s, a timeout of 10 s;
" "think still" or "kein Relay" in amber.
- [^] Installed and checked offline on Android (XS)
" 2026-10-11: flight mode, a new start shows the last state under the banner.
- [ ] Installed and checked on iOS and desktop (XS)
+ [?] Push notification when a pull request needs the user
- [~] #dash.journal: A Werkjournal import file per calendar day
- [^] #dash.journal.record: The work of each day recorded by the server and the local mode (S)
" Werkregie PR#41: active time of the sessions from their transcripts, the items of all sources;
" <stateDir>/journal/YYYY-MM-DD.json, kept 400 days.
- [^] #dash.journal.proposal: Proposal for a picked day, to copy or download (M) :#dash.journal.record
" Werkregie PR#45: tab Journal; mapping in journal: of dashboard.yml; one entry per Taiga story, else per project.
" Werkregie PR#49: no HTTP 500 for a project with a story and other work.
" Werkregie PR#53: parallel entries share their minutes, so a day adds up to the clock.
" Werkregie PR#54: a story below 30 min joins the entry of its project.
- [x] AI summary as the description of an entry (S) :#dash.journal.proposal
" Werkregie PR#85: from the evidence only, kept by its hash; switch Regeln | KI in the tab Journal.
- [?] Days before the deployment, read from older transcripts
+ [?] #dash.notify: Matrix as a notification channel, for colleagues too
- [?] #dash.store: One database for Werkregie, to be discussed
- [~] #sat: Satellites: a fresh account becomes a workplace of agents
" A satellite reads its agents for the server and later also acts on them;
" a client is a dashboard the user operates.
- [x] #sat.inventory: What a satellite needs today (XS)
" Werkregie PR#57: doc/satellite-inventory.md.
- [x] #sat.spike: An Omarchy satellite in a VM on think, set up by hand (S)
" Werkregie PR#71: doc/satellite-omarchy.md; Claude Desktop from the AUR, RDP with hypr-rdp.
- [-] #sat.vm: satellite vm: an Omarchy VM installed unattended from a cidata drive :#sat.spike
" A VM on the user's laptop takes too much of its power; see #sat.machine.
- [ ] #sat.machine: Tooling that installs the agentic environment on a separate computer (M) :#sat.spike
" An Omarchy USB stick and a drive labeled cidata, as for the VM; then the steps over SSH.
- [ ] #sat.pair: Pairing, a token per satellite, revoked in the dashboard (S)
- [ ] #sat.doctor: satellite doctor: each component checked, the state per satellite in the dashboard (S) :#sat.pair
- [ ] #sat.apply: satellite apply on Omarchy Linux: packages, Claude Desktop, repositories, git identity, units (M) :#sat.doctor
" The steps after the install in doc/satellite-omarchy.md, over SSH in a login shell.
- [ ] #sat.rdp: The desktop of a satellite reached over RDP (S) :#sat.apply
" hypr-rdp with NLA and automatic login; tried in werkregie PR#71.
- [ ] #sat.secrets: Secrets end to end, released by the user (M) :#sat.pair
- [ ] #sat.logins: Guided logins: Claude Code, and Codex for the Codex runner (S) :#sat.apply
- [ ] #sat.jobs: Codex runner and self-update as jobs of the satellite (S) :#sat.apply
- [x] #sat.isolation: The satellite's Claude login sees all sessions of the user's account
" Decided 2026-10-15: a customer who needs isolation provides the Claude login;
" otherwise the user's own, e.g. for Hostsharing: open source, separate development and integration environments.
- [-] #sat.memory: The memory of Claude Code carried to a new satellite
" Knowledge of the processes belongs into the agentic workflow; a customer's memory is not shared.
- [?] #sat.cli: Agents on the Claude Code CLI alone, without a desktop
- [?] #sat.opencode: OpenCode on satellites, OpenChamber on the client
- [?] #sat.commands: The server starts agents on a satellite :#orchestrator
- [ ] #sat.t3: Spike: T3 Code between Werkregie and the agents
" One T3 server per satellite; the client connects to it, never the reverse; see the block #sat.t3.
- [ ] Werkregie reads and operates its agents through T3 Code, not through Claude Desktop and Codex directly (M)
" The goal of the spike: T3 Code takes the role that ClaudeCodeSource and the Codex runner have today.
- [ ] A remote satellite as a T3 environment, over Tailscale or SSH (S)
- [ ] An agent of another Unix user on the same laptop as a T3 environment (S)
- [ ] A satellite sees no session of the main account or of another satellite (XS)
- [ ] A link in Werkregie opens the thread in its environment (S)
- [ ] Werkregie reads threads and branches over /mcp with a read-only token (S)
- [ ] Werkregie sends the message of "Du bist dran" over /mcp with an operating token (S)
- [ ] The relay of a satellite still finds the author of a pull request in its transcripts (XS)
- [ ] T3 Code with Gitea over tea 0.16, as claude-code on git.javagil.de (S)
" Also: whether T3 Code opens a new PR with the prefix WIP:, which Gitea takes as a draft.
- [ ] A Claude login without access to the account: an API key per Console workspace, or claude setup-token (S)
- [ ] Claude Code under T3 Code loads CLAUDE.md, the memory and the skills of the satellite (XS)
- [ ] A dev server of an agent on the satellite opens on the client, over Tailscale or an SSH forward (S)
- [ ] An agent of another Unix user as an SSH environment satuser@localhost (XS)
- [x] Decision: Werkregie does not take over the functions of T3 Code; at most it works with it as its hub (XS)
" Decided by the user on 2026-10-15: they would overload Werkregie.
- [ ] Decision of the user: T3 Code as a new technology (XS)
- [ ] #ops: Build and delivery
- [^] #ops.werkator: Werkator builds werkregie (S)
" Werkregie PR#9: .werkator.yml; mih09 registers the repository since 2026-10-10.
- [^] #ops.werkrevisor: werkrevisor reviews werkregie's pull requests (XS) :#ops.werkator
" Werkregie PR#10: risk categories; the human set branch protection and the reviewer's rights.
- [^] #ops.deploy: Werkator deploys a green main to mih09 (S) :#ops.werkator
" Werkregie PR#69: build deploy, one ssh connection to a forced command; the host part is the human's.
" Werkregie PR#70: the test runs the bundle's own launcher; first deploy 0.43.1 by main@deploy on 2026-10-14.
- [ ] #ops.github: Werkator pushes a green main to GitHub (XS) :#ops.werkator
- [ ] #ops.port: Port 18091 confirmed with Hostsharing (XS)
- [^] #ops.deps: Kotlin 2.4, Gradle 9.8.1 and current libraries (XS)
" Werkregie PR#6; Temurin 25 since werkregie PR#24, see #ops.jdk.
- [^] #ops.workflow: The shared agentic workflow of all Werk repositories (S)
" Werkregie PR#7: doc/agentic-workflow.md, AGENTS.md, CLAUDE.md and PR documents.
" Werkregie PR#18: the purpose line of a scenario reads "&hellip; so that …".
- [^] #ops.master: Master copy of the shared workflow (XS) :#ops.workflow
" Werkregie PR#16; decided by mi on 2026-10-11.
- [^] #ops.watch: A coding agent watches its pull request until it must act (XS) :#ops.workflow
" Werkregie PR#48: werkregie-dashboard watch-pr; a conflict with main is the agent's to fix at once.
" Werkregie PR#65: READY for a WIP pull request only when each check of the branch protection passed.
- [x] #ops.codex: The shared workflow names the Codex gate (XS) :#ops.workflow
" Werkregie PR#66; gate in werkrevisor and Werkator since 2026-10-14.
- [~] #ops.version: Fewer conflicts between open pull requests :#ops.workflow
" Each pull request changed the version, the CHANGELOG and the plan at the same places.
- [^] werkregie derives the version from the PR documents (S)
" Werkregie PR#79: a line "Version: minor" under the title; the changelog from "Release Notes".
- [^] "Du bist dran" leaves the version of a conflict to the workflow (XS)
" Werkregie PR#82: the message to copy no longer asks for the next free version.
- [^] werkcrappit writes its CHANGELOG from the PR documents (S)
" Werkcrappit PR#70: a copy of the code of werkregie PR#79; published as 0.26.15.
- [ ] A Gradle plugin for the other Werk repositories (S)
- [?] Werkbaum: explanation blocks in the order of the nodes, not at the end (XS)
- [~] #ops.names: Names follow javagil.de, de.javagil.<repo> on the JVM :#ops.workflow
" Werkregie PR#86: the rule; a move starts only when no other PR of the repository is open.
- [ ] werkregie moves from de.hoennig (S)
- [^] werkator moves from de.hoennig (S)
" Werkator PR#163, live as 1.43.3; the Docker label org.hoennig.werkator stays for the cleanup of containers.
- [ ] werkjournal moves from de.hoennig (S)
- [ ] werkrevisor moves from de.hoennig (XS)
- [x] werkbaum moves from de.werkbaum (S)
" Werkbaum PR#11, decision D100; the deployment of the backend is open.
- [~] #ops.checks: Required checks of all werk repositories :#ops.workflow
" Werkregie PR#58: vulnerabilities, licenses and mutation tests; the risk analysis sets the CVSS score.
- [^] The rule in the shared workflow (XS)
- [~] werkregie
- [^] Risk analysis, criticality high (XS)
" Werkregie PR#59: doc/risk-analysis.md.
- [^] License check in each build (XS)
" Werkregie PR#59: dashboard/config/allowed-licenses.json; MIT-0 joins the defaults.
- [^] OWASP Dependency-Check on main, from CVSS 4 (XS)
" Werkregie PR#59: Werkator's build "dependencies"; the NVD API key on mih09 is the human's.
- [^] OWASP Dependency-Check for each PR (XS)
" Werkregie PR#61: the nightly build "vulnerability-data" loads the NVD data; every check only reads it.
- [^] A PR fails only on the vulnerabilities it brings; main is checked each night (S)
" Werkregie PR#62: gradle.lockfile against the merge base with main.
- [^] A vulnerability found on main shows in Du bist dran (S)
" Werkregie PR#63: a failed main@vulnerability-data, with the findings of its report.
- [^] Mutation tests in each build, in full each night (S)
" Werkregie PR#64: pitestPartial on the classes changed against main, limit 15; pitestFull each night, ratchet 1806.
" PIT's history does not suit Kotest: it keeps no result that a spec killed.
- [~] Each method at most 15, the nightly ratchet down to 15
" 67 methods above 15 at PR#64, highest GiteaSource.pullRequestItem with 1806.
- [x] Dashboard, RelayClient, ClaudeCodeSource and GiteaSource (M)
" Werkregie PR#75: tests and smaller methods; the ratchet at 812, MatrixSource.message.
- [x] The commands of Main.kt (S)
" Werkregie PR#67: a table of commands; the decisions in tested functions.
- [x] JournalProposer (S)
" Werkregie PR#84: propose split by source; holds, inRoom and unmappedName tested apart.
- [x] MatrixSource (S)
" Werkregie PR#92: the decisions in MatrixEvents and MatrixMessages; the ratchet at 272, CodexSource.fetch.
- [ ] The other classes, the ratchet lowered with each (L)
- [^] #ops.readme: README: what Werkregie is today, with screenshot and connections (XS)
" Werkregie PR#55: so far mainly a dashboard, to become the orchestrator; defines the workflow of the Werk family.
- [~] #ops.jdk: Temurin 25 as JDK and runtime of all Werk repositories
" Werkregie PR#20: doc/adrs/0001-2026-10-11.temurin-25.md; decided by mi on 2026-10-11.
- [x] Decision as an ADR (XS)
- [x] Revision: Temurin 25 comes from Foojay (XS)
" Werkregie PR#22; decided by mi on 2026-10-11.
- [x] werkregie builds and runs on Temurin 25 (XS)
" Werkregie PR#24; the runtime bundle carries Temurin 25.0.4.
- [-] Werkator's build environment with Temurin 25
" Foojay caches the JDK in the shared Gradle home; a rootfs would need an upload for each Java update.
- [~] #orchestrator: Orchestrator for agentic software development
" Designed in doc/agentic-flow.werkbaum; nodes move here once they are decided.
- [^] #orch.author: "Du bist dran" shows the author session of a stuck agent pull request (S)
" Werkregie PR#74: a link to the session and a message to copy; the human sends it.
" Werkregie PR#77: the demo shows one; deployed with the relay of think at 0.47.0 on 2026-10-14.
- [-] #orch.resume: The relay resumes the resting author session of a pull request that needs it
" Tried in werkregie PR#74: Claude Desktop ignores a turn of claude --resume -p and forks the transcript.
- [ ] #orch.wipConflict: "Du bist dran" shows a WIP pull request in conflict for 30 min without a new commit (S)
" Gitea's API gives mergeable false for each WIP; the server finds the conflict with git merge-tree.
---
#dash.flags
A pull request is the user's own, an agent's (its author is in agents) or a
colleague's. Most urgent first: Festgefahren (werkrevisor escalated, RED for
an hour without a new commit, ERROR, a run without verdict, or an agent's
pull request in conflict for 30 min without a new commit since main left its
base; never a colleague's), Dein Approval (an agent's or a colleague's pull
request with a final ORANGE or YELLOW, even if the user approved
before that result, or without werkrevisor 2 min after its last change),
Mergen (the user's own pull request that the branch protection of its base
lets merge, else one approved by another human, or an agent's
one approved by anyone but its author, all checks green, no automerge),
Nacharbeit (conflict or red build on the user's own pull request), Kommentar
(another human has the last word on the user's own pull request), Wartet auf
Review (the user's own pull request waits for another human), Agent arbeitet
(instead of Dein Approval while an agent's session works on the branch), Von dir
approved. Only the chips are coloured, not the row.
#dash.pwa
User request of 2026-10-10: the Werkregie frontend becomes a progressive
web app, installable on phone and desktop.
User decision of 2026-10-10: the last state, with pull request and session
data, may be kept in the browser's storage for the offline view.
The service worker caches the page, styles, fonts and icons only. The API
answers carry private data behind the access token and are never cached by
the service worker; offline the page shows the last state it keeps in the
browser's storage, marked with its age. Forgetting the access token deletes
it. The local mode on localhost counts as a secure context, so the PWA works
there too.
#dash.matrix
User request of 2026-10-10: messages that matter to the user show in
Werkregie, read-only. Werkregie signs in with the user's own account as a
device of its own, because many rooms are end-to-end encrypted and only a
device of the account can read them. It runs in the relay, so the device
keys stay on the user's machine.
The homeserver is configured; there is no default, and no real homeserver
appears in the repository. Shown: every direct message, mentions in every
room (found after decryption, since the server cannot see them in encrypted
rooms), and all messages of the configured rooms. The server gets only room,
sender, time and the start of the text.
Reading Element Desktop's own store was dropped: it has no interface, and
its data lies encrypted in IndexedDB.
#dash.matrix.sdk
Checked with Trixnity 5.9.2 on 2026-10-10, without signing in anywhere.
It compiles with the dashboard's Kotlin 2.2.21 on Temurin 21 and pulls
kotlin-stdlib 2.3.21. vodozemac comes through JNI: the jar carries the
native library for Linux x86-64 and aarch64 and unpacks it into the temp
directory, which must allow execution; it needs glibc 2.34 (mih09 has
2.36). Olm and Megolm round trips work, and so do discovery and versions
against matrix.org and the user's homeserver.
For the bundle: 49 jars and 24 MB more, and jlink needs java.logging,
java.management, java.instrument and jdk.unsupported besides the
modules it has. The client's store comes next:
trixnity-client-repository-exposed on the sqlite-jdbc the dashboard has.
#dash.taiga
User request of 2026-10-11: plan a Taiga integration. User decisions of
2026-10-11: the open user stories, tasks and issues assigned to the user;
several projects per instance; instances and projects only from the
configuration; the statuses "In Arbeit", then "Bereit" first, configurable,
other open ones after them; login by user and password from the
environment; read by the server and the local mode. The configuration is a
list of task boards with a type, so that more instances and other task
boards fit in later. A link of a story to its pull requests and its
Werkbaum node, which marks a subtree with &taiga.<project-slug>, follows in
a PR of its own.
#dash.matrix.react
User request of 2026-10-16: an agent that merges the approved pull requests
of hs.hsadmin.ng marks their announcements in the room "HSAdmin NG": ✅️ when
approved, ☑️ in addition when merged. The reaction comes from the device of
matrix login, encrypted like the room. Sending it through the running relay
needs a change of MatrixSource, whose methods are above the limit of the
mutation tests of a branch; so the relay stops for it until that is done.
Werkregie PR#92 brought MatrixSource under the limit; since PR#93 the process
that holds sync.lock sends the reaction, through the Unix domain socket
control.sock in the directory of the device's keys.
#dash.matrix.accounts
matrix becomes a list of named accounts, as giteas; a single block is still
read. Each account gets its own directory matrix/<name>/ with store, lock
and messages.json, a source matrix:<name>, and matrix login|verify <name>.
#dash.matrix.link
Element Desktop opens element:// links (io.element.desktop:// for the
stable app when a nightly build holds element://); on a phone matrix.to
opens Element. PR#8 makes it configurable as matrix.link, matrix.to by
default.
PR#29: the setting is the desktop's; on a phone the page links to
matrix.to, since io.element.desktop:// leads nowhere there. A Linux
desktop cannot hand https://matrix.to from the browser to Element Desktop,
as Android's app links do.
#dash.store
The Matrix client needs a store; Trixnity's Exposed repositories need
R2DBC, which SQLite does not offer, so PR#8 uses an H2 file for it.
sqlite-jdbc stays as long as Werkregie reads Codex: it only reads Codex'
own database. Whether Werkregie gets one database of its own, H2 or
another, and what moves into it, is to be discussed.
#dash.journal
User request of 2026-10-12: per calendar day a proposed import JSON for
Werkjournal, the day picked in the page. User decisions of 2026-10-12: one
entry per Taiga story and day where a Taiga ID is known, else one per
project and day; the hours from the active time of the sessions, a pause
over 15 min splits it; the mapping to Werkjournal customers and projects in
journal: of the server's dashboard.yml, by name, since Werkjournal matches
them by name too; a record of each day on the server, so that a day stays
available after the sources forget it, recorded in the local mode too;
descriptions by rules, the same data giving the same text, since
Werkjournal adds a changed entry as a new one;
two PRs, the record first, so that it fills while the proposal is built.
#dash.notify
Werkregie posts what a pull request asks of whom into a Matrix room, for
colleagues too. A separate feature, later. A bot account of its own will
do; which events go to whom is open.
#sat
User request of 2026-10-13: a freshly installed account becomes a
satellite with everything its agents need, set up by Werkregie as an
extension of the relay mode. A satellite reads its agents for the server,
later it also acts on them; a client is a dashboard the user operates. The
setups differ: another Unix account on the user's laptop, a local or a
remote virtual machine, the agent as a user or as root. The satellite
assumes none of them. The relay with Matrix stays in the user's main
account; it is no satellite.
Claude Code is the agent of a satellite. Codex serves the Codex runner of
werkrevisor only. A satellite is an Omarchy Linux desktop with Claude
Desktop, reached over RDP; the user moves to Omarchy Linux altogether in
the medium term. Anthropic supports Claude Desktop on Linux only on Debian
and Ubuntu, as a beta; werkregie PR#71 ran it on Omarchy,
an Arch Linux, from the AUR package that repackages Anthropic's .deb. OpenCode may follow later on satellites, with OpenChamber
on the client.
User decisions of 2026-10-13: own idempotent steps in Kotlin, each component
with a check and an apply that call the system's tools, rather than Ansible,
Nix or chezmoi. The secrets come end to end from the main account: a new
satellite creates a key pair when it pairs, the user releases it in the
dashboard, the relay of the main account encrypts the secrets for it, and
the server forwards only ciphertext. Logins belong to the device and are
guided, never copied. The memory of Claude Code is not carried along:
knowledge of the processes belongs into the agentic workflow, which each
customer has, and a customer's memory is not shared.
User decisions of 2026-10-14: a satellite in a VM on the user's laptop is
no practical way, as it takes too much of the laptop's power. A satellite
gets a computer of its own, installed by tooling as far as it goes. The
satellite's Claude Desktop shows all sessions of the user's account, which
defeats the isolation of the agents' work; how to isolate it is open.
#sat.t3
User request of 2026-10-15: the user works from one central place and
operates the satellites remotely, one satellite per customer or field,
e.g. Hostsharing, the Werk tools and other customers. A satellite is not
trusted: it reports to the main account, but sees nothing of it or of
other satellites. A link in Werkregie must open a session wherever it runs.
T3 Code (t3.codes, MIT, TypeScript and Electron, public since about
August 2026) controls agent CLIs such as Claude Code and Codex. Its
documents say: each machine runs its own server, an environment, which
keeps the logins, projects and threads; a client holds many environments
and opens each connection itself; pairing gives each device scopes such as
orchestration:read or orchestration:operate, revocable; routes are LAN,
Tailscale, SSH or the hosted T3 Connect, which needs a Clerk login. Each
environment offers MCP at /mcp, through which an approved outside agent
reads threads, starts them and sends them messages.
T3 Code does not isolate the Claude account: a satellite logged in with
the user's account holds a token for the whole account, see
#sat.isolation. Not documented: how T3 Code talks to Claude Code, deep
links into a thread, Gitea, and whether the usual transcripts stay in
~/.claude/projects. The spike decides whether Werkregie takes over these
functions or uses T3 Code as its hub to the agents.
User decision of 2026-10-15: Werkregie does not take over the many
functions of T3 Code, as they would overload it. Findings of the same day:
Gitea and Forgejo share one integration over tea or fj. A Claude login
is isolated only by credentials without access to claude.ai, e.g. an API
key of a Console workspace per customer, at API prices. HTML renders are
self-contained pages and work on every client; a dev server of an agent
is not forwarded, the user arranges that with Tailscale or SSH. Not
documented: whether the SDK mode loads the memory, and a server per Unix
user on one machine.
User decisions of 2026-10-15: a customer who needs isolation provides the
Claude login for its satellite; a customer who does not, e.g. Hostsharing
with open source and separate development and integration environments,
works with the user's own login. The spike evaluates whether T3 Code takes
the role that Claude Desktop and Codex have for Werkregie today: Werkregie
talks to T3 Code only, and T3 Code to the agents.
#ops.github
GitHub carries main only. Until Werkator does it, main is pushed by hand
with git push github.
#ops.port
The server runs on port 18091, picked because it was free; Hostsharing has
not confirmed it for the booked service yet.