fix: restore workflow ownership and pilot gates

This commit is contained in:
kiri committed 2026-09-06 14:57:30 +02:00
1 parent 1e6a0b74c9
commit bbaad073dd
3 files changed
+125 -43

No files matched your search

+69 -18
View File
@@ -2,9 +2,9 @@
Source: [`../workflow-discovery.md`](../workflow-discovery.md) Source: [`../workflow-discovery.md`](../workflow-discovery.md)
The declarative workflow implementation is complete. This file is the living The declarative workflow core is complete; pilots remain. This file is the
handoff for operational constraints and external gates; implementation history living handoff for operational constraints and external gates; implementation
is available in Git. history is available in Git.
## Activation boundary ## Activation boundary
@@ -29,28 +29,37 @@ restarted Kitty and closed the user's terminal session.
## Current checkpoint ## Current checkpoint
- State: declarative implementation and autonomous verification complete. - State: declarative core complete; corrective activation and pilots remain.
- Branch: `chore/workflow-system`. - Branch: `chore/workflow-system`.
- Validation: `nix flake check --no-build --quiet` plus no-link Zenith and Orion - Validation: `nix flake check --no-build --quiet`, all three no-link system
system builds passed on 2026-09-06 after Orion became the sole transcription builds, generated Zenith and Polaris Niri validation, and all six companion
owner. The expected dirty-tree and unknown `modules` warnings were emitted. flake evaluations passed on 2026-09-06. The updated data-science shell exposes
Python 3.14.7 and its full project check passes. The expected dirty-tree and
unknown `modules` warnings were emitted.
- Live state: Walker project and terminal actions, daily notes, stable web apps, - Live state: Walker project and terminal actions, daily notes, stable web apps,
Evolution D-Bus activation, the Zenith VPN, invocation-scoped GitHub and Evolution D-Bus activation, the Zenith VPN, invocation-scoped GitHub and
Context7 credentials, Pinta, and Orion transcription passed their completed Context7 credentials, Pinta, and Orion transcription passed their completed
pilots. pilots.
## External or deferred gates ## Active pilot gates
These gates do not block work on each other. These gates do not block work on each other.
- During a docked Zenith session, capture the external display's stable identity - Add `RabbitMQ — TEST` for `https://test.rabbitmq.yookr.org` and
and test the two-output `Super+A` exchange. The current recorded session exposed `RabbitMQ — LIVE` for `https://rabbitmq.yookr.org` to a Vivaldi `Operations`
only `eDP-1`. bookmark folder. Vivaldi remains the bookmark owner.
- Resume Evolution only when the user chooses to configure the personal, - Supply approved test RabbitMQ management credentials at runtime, then verify
old-personal, university, work, and Radicale accounts. Keep Thunderbird and the Nix-provided client without installing it permanently:
Outlook until the daily-use gate passes.
- On Android, complete the DAVx5/Radicale and Tasks.org pilots, including default ```console
accounts, recurrence, reminders, and Microsoft To Do within documented limits. RABBITMQADMIN_BASE_URI=https://test.rabbitmq.yookr.org nix run --quiet nixpkgs#rabbitmqadmin-ng -- show overview
RABBITMQADMIN_BASE_URI=https://test.rabbitmq.yookr.org nix run --quiet nixpkgs#rabbitmqadmin-ng -- queues list
```
Export `RABBITMQADMIN_USERNAME` and `RABBITMQADMIN_PASSWORD` from the approved
credential source first; do not place their values in documentation or shell
history. Keep publishing, getting, and purge visibly interactive in the
management UI.
- Supply one real Yookr S3 task, a least-privileged remote, and explicit permission - Supply one real Yookr S3 task, a least-privileged remote, and explicit permission
for any upload. `rclone` is installed; no remote or wrapper is preconfigured. for any upload. `rclone` is installed; no remote or wrapper is preconfigured.
- Deploy a GET image exposing `/full-api-docs/openapi.json`, then rerun - Deploy a GET image exposing `/full-api-docs/openapi.json`, then rerun
@@ -64,6 +73,36 @@ These gates do not block work on each other.
- Wait for a real Monday ticket before adding anything beyond native GitHub, - Wait for a real Monday ticket before adding anything beyond native GitHub,
Herdr, Git, and worktree workflows. Herdr, Git, and worktree workflows.
The Herdr pilot passes only when short, long, and approval-blocked sessions have
accurate attention state; detach and reattach preserve output; one Claude or Pi
fallback works; and each completed event produces exactly one notification.
Create two independently writing, non-overlapping task worktrees under
`~/dev/work/.worktrees/<repository>/<branch-slug>`, explicitly authorize each
`.envrc`, and confirm paths are predictable, dirty removal is refused, and the
branches remain for review. If a component fails, fall back independently to
native agent sessions and Codex TUI notifications or native
`git worktree add/list/remove`; do not add a wrapper or Worktrunk yet.
## Deferred pilots
- During a docked Zenith session, capture the external display's stable identity
and test the two-output `Super+A` exchange. The current recorded session exposed
only `eDP-1`.
- Resume Evolution only when the user chooses to configure the personal,
old-personal, university, work, and Radicale accounts. Keep Thunderbird and
Outlook until the daily-use gate passes.
- On Android, complete the DAVx5/Radicale and Tasks.org pilots, including default
accounts, recurrence, reminders, and Microsoft To Do within documented limits.
- Do not replicate the workstation workflow on Polaris until the user resumes
the procedure below.
The Niri pilot is two-output-only. It passes when the active workspaces exchange
physical outputs, both arrivals are active, original names are preserved, and
focus returns to the original physical output. Any temporary names must be
collision-free and restored on success or failure; missing output or workspace
state must leave the session unchanged. Keep the helper only after repeated
reliable swaps with an acceptable visible transition.
## Deferred Polaris replication ## Deferred Polaris replication
Do not access or test Polaris unless the user resumes this deferred replication. Do not access or test Polaris unless the user resumes this deferred replication.
@@ -81,6 +120,11 @@ Zenith's result remains representative meanwhile.
7. Create mode-0600 `~/.config/context7/api-key` without a trailing newline, 7. Create mode-0600 `~/.config/context7/api-key` without a trailing newline,
restart Codex after activation, and run one Context7 lookup. restart Codex after activation, and run one Context7 lookup.
Replication passes only when the VPN has the expected route and DNS behavior,
reaches a test service, reconnects after disconnect and suspend, and survives a
reboot without autoconnecting. The two credential files must remain mode 0600;
the fresh-shell GitHub read and restarted-Codex Context7 lookup must both work.
## Durable implementation decisions ## Durable implementation decisions
- Active work repositories live under `~/dev/work`, archives under `.archive`, - Active work repositories live under `~/dev/work`, archives under `.archive`,
@@ -88,6 +132,12 @@ Zenith's result remains representative meanwhile.
- Participating repositories expose non-mutating direnv shells, minimal flake - Participating repositories expose non-mutating direnv shells, minimal flake
checks, native commands through `just`, concise `AGENTS.md`, and machine-local checks, native commands through `just`, concise `AGENTS.md`, and machine-local
credential inputs. credential inputs.
- `yookr-data-science/conf/local/credentials.yml` is an approved narrow
application-owned exception to the external credential-file default: Kedro's
named credential dataset resolves it from the native ignored `conf/local`
hierarchy. Keep it untracked and mode 0600.
- `yookr-data-science` follows ordinary `nixos-unstable`, like the other
companion repositories; it needs no `devenv-nixpkgs` compatibility input.
- `yookr-workbench` starts with cross-system work only; isolation and additional - `yookr-workbench` starts with cross-system work only; isolation and additional
tools wait for observed needs. tools wait for observed needs.
- Walker's native Elephant menu scans repository roots and calls one Nix-owned - Walker's native Elephant menu scans repository roots and calls one Nix-owned
@@ -111,5 +161,6 @@ Zenith's result remains representative meanwhile.
## Next step ## Next step
Continue an external pilot only when its real input arrives. Otherwise no workflow Activate the verified corrective generation on Zenith, confirm Vivaldi cannot
implementation action remains. replace the managed launchers, then collect all inputs for the active pilots
before running them in the order RabbitMQ, OpenAPI/API, workbench, S3, and Herdr.
+22 -6
View File
@@ -1,7 +1,7 @@
# Workflow system blueprint # Workflow system blueprint
Status: implemented. Current external gates and operational handoff live in Status: declarative core implemented; pilots remain. Current gates and the
[`plans/workflow-system.md`](plans/workflow-system.md). operational handoff live in [`plans/workflow-system.md`](plans/workflow-system.md).
This document is the durable design for the workstation and surrounding Yookr This document is the durable design for the workstation and surrounding Yookr
workflow. Implementation history belongs in Git. workflow. Implementation history belongs in Git.
@@ -111,6 +111,8 @@ copied application state.
the repository root, starts Neovim, and leaves a shell after Neovim exits. the repository root, starts Neovim, and leaves a shell after Neovim exits.
- Vivaldi remains the bookmark and web-app authority. Home Manager owns stable - Vivaldi remains the bookmark and web-app authority. Home Manager owns stable
launchers for Actual, WhatsApp, and Outlook without duplicating browser state. launchers for Actual, WhatsApp, and Outlook without duplicating browser state.
Its `Operations` folder owns visibly labeled test/live RabbitMQ bookmarks;
terminal inspection uses the Nix-provided `rabbitmqadmin-ng` on demand.
- Niri keeps dynamic general-purpose workspaces and a compact navigation and - Niri keeps dynamic general-purpose workspaces and a compact navigation and
movement vocabulary. The two-output active-workspace exchange remains a movement vocabulary. The two-output active-workspace exchange remains a
bounded pilot. bounded pilot.
@@ -141,15 +143,18 @@ synchronization. The accepted `yookr-vpn.ovpn` is a narrow exception for Zenith
and Polaris: keep it user-restricted and import it into NetworkManager without and Polaris: keep it user-restricted and import it into NetworkManager without
printing or committing its contents. printing or committing its contents.
`yookr-data-science/conf/local/credentials.yml` is a separate application-owned
exception: Kedro resolves its named credential dataset through the conventional
ignored `conf/local` hierarchy. Keep the file untracked and mode 0600; do not
generalize the exception to other repositories.
Only the user activates a NixOS or Home Manager generation. Agents may evaluate Only the user activates a NixOS or Home Manager generation. Agents may evaluate
and build configurations, then provide an activation command. and build configurations, then provide an activation command.
## Remaining pilots ## Remaining pilots
- Capture Zenith's external display identity during a docked session and test the - Verify the labeled RabbitMQ test/live bookmarks and a read-only test overview
two-output `Super+A` exchange. plus queue listing through an invocation-scoped `rabbitmqadmin-ng` run.
- Resume Evolution and Android PIM only when the user chooses to run those daily
use pilots.
- Add workbench database connections and a Marimo report only for a real - Add workbench database connections and a Marimo report only for a real
cross-system investigation. cross-system investigation.
- Configure an S3 remote only for a real task with least-privileged credentials - Configure an S3 remote only for a real task with least-privileged credentials
@@ -157,9 +162,20 @@ and build configurations, then provide an activation command.
- Rerun the Yookr OpenAPI refresh after the deployed image exposes - Rerun the Yookr OpenAPI refresh after the deployed image exposes
`/full-api-docs/openapi.json`; run authenticated API checks only with current `/full-api-docs/openapi.json`; run authenticated API checks only with current
user credentials. user credentials.
- Run the complete Herdr notification, fallback-agent, and safe worktree pilot
with a real Monday ticket.
- Keep Bruno, DBeaver, and existing PIM clients until their independent gates are - Keep Bruno, DBeaver, and existing PIM clients until their independent gates are
resolved. resolved.
## Deferred pilots
- Capture Zenith's external display identity during a docked session and test the
two-output `Super+A` exchange, including name and focus restoration on failure.
- Resume Evolution and Android PIM only when the user chooses to run those daily
use pilots.
- Replicate the proven workstation workflow on Polaris only when the user resumes
its machine-local VPN and credential procedure.
## Deferred work ## Deferred work
- Define the team release process and OpenAPI publication policy before encoding - Define the team release process and OpenAPI publication policy before encoding
+34 -19
View File
@@ -34,20 +34,12 @@
actualId = "ahoihnifhakgijcmjlhbcgehigihinlo"; actualId = "ahoihnifhakgijcmjlhbcgehigihinlo";
outlookId = "eoficlgicibekocmfdomjbfnjmehnhcd"; outlookId = "eoficlgicibekocmfdomjbfnjmehnhcd";
whatsappId = "hnpfjngllnobngcgfapefoaidbinmjnm"; whatsappId = "hnpfjngllnobngcgfapefoaidbinmjnm";
in actualDesktop = pkgs.makeDesktopItem {
{ name = "vivaldi-${actualId}-Default";
desktop.commands.browser = [ command ]; desktopName = "Actual";
home = {
packages = [ pkgs.vivaldi ];
sessionVariables.BROWSER = command;
};
xdg = {
desktopEntries = {
"vivaldi-${actualId}-Default" = {
name = "Actual";
exec = appCommand actualId; exec = appCommand actualId;
icon = "vivaldi-${actualId}-Default"; icon = "vivaldi-${actualId}-Default";
settings.StartupWMClass = "crx_${actualId}"; extraConfig.StartupWMClass = "crx_${actualId}";
actions = { actions = {
Accounts = { Accounts = {
name = "Accounts"; name = "Accounts";
@@ -63,18 +55,20 @@
}; };
}; };
}; };
"vivaldi-${whatsappId}-Default" = { whatsappDesktop = pkgs.makeDesktopItem {
name = "WhatsApp Web"; name = "vivaldi-${whatsappId}-Default";
desktopName = "WhatsApp Web";
exec = appCommand whatsappId; exec = appCommand whatsappId;
icon = "vivaldi-${whatsappId}-Default"; icon = "vivaldi-${whatsappId}-Default";
settings.StartupWMClass = "crx_${whatsappId}"; extraConfig.StartupWMClass = "crx_${whatsappId}";
}; };
"vivaldi-${outlookId}-Default" = { outlookDesktop = pkgs.makeDesktopItem {
name = "Outlook"; name = "vivaldi-${outlookId}-Default";
desktopName = "Outlook";
exec = "${appCommand outlookId} %U"; exec = "${appCommand outlookId} %U";
icon = "vivaldi-${outlookId}-Default"; icon = "vivaldi-${outlookId}-Default";
mimeType = [ "x-scheme-handler/mailto" ]; mimeTypes = [ "x-scheme-handler/mailto" ];
settings.StartupWMClass = "crx_${outlookId}"; extraConfig.StartupWMClass = "crx_${outlookId}";
actions = { actions = {
Calendar = { Calendar = {
name = "Open calendar"; name = "Open calendar";
@@ -90,6 +84,27 @@
}; };
}; };
}; };
in
{
desktop.commands.browser = [ command ];
home = {
packages = [ pkgs.vivaldi ];
sessionVariables.BROWSER = command;
};
xdg = {
dataFile = {
"applications/vivaldi-${actualId}-Default.desktop" = {
force = true;
source = "${actualDesktop}/share/applications/vivaldi-${actualId}-Default.desktop";
};
"applications/vivaldi-${whatsappId}-Default.desktop" = {
force = true;
source = "${whatsappDesktop}/share/applications/vivaldi-${whatsappId}-Default.desktop";
};
"applications/vivaldi-${outlookId}-Default.desktop" = {
force = true;
source = "${outlookDesktop}/share/applications/vivaldi-${outlookId}-Default.desktop";
};
}; };
mimeApps.defaultApplicationPackages = [ pkgs.vivaldi ]; mimeApps.defaultApplicationPackages = [ pkgs.vivaldi ];
}; };