566 lines
40 KiB
Plaintext
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 "… 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.
|