%% 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 (S) " Busy, waiting and closed sessions; the resume command to copy. - [^] #dash.codex: Codex threads, Desktop, IDE and CLI (S) " Codex' SQLite state read-only; a running turn from the tail of the rollout file. - [^] #dash.werkator: Werkator builds, any number of instances (S) " Running and finished builds, @ai-review builds as werkrevisor; " three repositories at a time with a 30 s timeout; the control token reveals private repositories. - [^] #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, Wartet auf Review, 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.order: Pull requests sorted by the user's next step, the longest waiting first (XS) " Werkregie PR#17; ORANGE before YELLOW. - [^] Own activity in the history (XS) - [^] #dash.projects: Projects matched by repository name across sources (XS) - [^] #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. - [^] Configured statuses first, in their order (XS) - [ ] 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) + [ ] Older messages than the first sync brings (S) - [^] #dash.page: Page - [^] Panels: Läuft jetzt, Offene Sessions, Offene Pull Requests, Verlauf (S) " Three and a half rows until opened; headings name the tools the rows come from. - [^] 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) - [^] 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) - [^] 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. - [^] 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.notify: Matrix as a notification channel, for colleagues too - [?] #dash.store: One database for Werkregie, to be discussed - [ ] #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.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 "… so that …". - [^] #ops.master: Master copy of the shared workflow (XS) :#ops.workflow " Werkregie PR#16; decided by mi on 2026-10-11. - [~] #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. --- #dash.flags Most urgent first: Festgefahren (werkrevisor escalated, RED for an hour without a new commit, ERROR, or a run without verdict), Dein Approval (a foreign pull request with a final ORANGE or YELLOW, or without werkrevisor), Mergen (the user's own pull request approved by another human, or a foreign one approved by anyone but its author, all checks green, no automerge), Nacharbeit (conflict or red build on the user's own pull request), Wartet auf Review (the user's own pull request waits for another human), 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., follows in a PR of its own. #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// with store, lock and messages.json, a source matrix:, and matrix login|verify . #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. #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.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. #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.