This is Kendex's first extensive Copilot consumer workload; report package or workflow failures with kendex report, using temporary consumer-side workarounds without editing Kendex-owned files.
A desktop shell for Hyprland, built on Quickshell 0.3.1. A small fixed core starts the shell, talks to Hyprland, hosts surfaces and loads plugins. Everything outside the core is a plugin: one directory with a manifest.json, shown on the surfaces the core hosts, landed with the validation row that proves it is built and handed what it asked for. docs/architecture/overview.md holds the idea and its rules.
scripts/validate [AREA]: run only checks affected by changes from the newest commit holding what last passed AREA in this worktree, else the default branch's merge base, including uncommitted files.--changed BASEselects a fix round;--listpreviews commands;--fullopts into the whole area.unitneeds Qt and no Wayland session;packageneeds rootless podman and the Arch mirrors;qmlneeds the nested sandbox. Exit 77 means a check could not run and is not a pass.scripts/qml-smoke.sh: the nested sandbox row alone. It needsXDG_RUNTIME_DIRand a non-AMD render node.scripts/landing-times.py [--last N]: the median time from open (first commit or PR creation) to landing onmainover the last N landings (pushes and pull requests), plus the median wait from ready to land.bin/vgshell: the runner (run,restart), the plugin manager and the theme commands (theme list,theme apply <name>,theme reload,theme background next,theme add <git url>,theme update <name>,theme remove <name>;theme apply vgsrestores the defaults). Run it with no arguments for the command list.
-
No shim, fallback, alias or compatibility path, ever. A format change ships the in-place migration of the previous version in its commit, never a hand step, and keeps no old-form reader: D107.
-
Work targets
main. -
No branch protection, merge queue or commit/push gates. Two GitHub workflows exist; neither runs on a push or a pull request.
.github/workflows/nightly.ymlrunsscripts/validate --fullonmainon a schedule, while the repository variableNIGHTLYison, for the areas a hosted runner can run and reports only..github/workflows/kendex-refresh.yml, adopted unedited from kendex, runs on each kendex release, every 6 hours and by hand; itskendex/refreshpull request merges at once, and lanes rebase over it as over any landing. PRs are optional and may merge immediately; direct pushes are welcome. Do not arm Kendex guards or wait for absent CI. -
Review by risk. A change to code where a defect shows as a performance, stability, race, leak or lifetime problem (services, Quickshell or Hyprland IPC, processes and timers, file or socket watchers, object ownership and destruction, caches, concurrency, the plugin scan and publish path, the sandbox and smoke harness) runs one internal review round before the push. A change that is only layout, copy, styling, tokens, docs or a settings field runs none, save the reviewer-quality UI check of the screenshots any
QA_UI_PATHSchange runs (Jarvis 1792199489; not Drive lanes). The lane's done line names which applied and why. -
No bot review. No lane or pull request requests or waits for a bot review:
PR_REVIEW_GATEandREVIEW_GATE_MODEinkendex.settings.tomlstayoff. A bot review request from Kendex code goes tokendex report. -
Validate the final relevant diff once. After fixes, use
--changed <last-validated-commit>and reuse results for unchanged inputs; do not repeat a full suite at commit, push or PR submission. Unknown source inputs select the full area rather than silently skipping coverage. Shared workflow gate requirements do not apply here. -
A lane runs the fast areas
scripts/validateselects and, of the nested smoke, only the rows its change names with the rows those read. A batch run,scripts/main-run.sh, runs the full unit and qml areas on main, reports and gates nothing; the nightly run isnightly.ymlplusscripts/main-run.sh qml, the area a hosted runner cannot run. A lane whose files no other landing lane shares lands without an order:docs/decisions/D100-validation-selects-by-inputs.md. -
Hyprland is the only compositor; no compositor abstraction: D001.
-
Never start a second shell against the live session. Kill only a PID you started or whose /proc cwd is in your worktree. Validation runs in the nested sandbox only.
-
A change that adds a surface, a service or a plugin adds its validation row under
scripts/smoke/rows/in the same PR. -
No manual commands: a user-facing setup step is automatic or one click, a step that asks or elevates runs in a floating TUI or the requirement notice that button starts, a secret goes into a masked field VGS stores in libsecret, and the interface shows no command except a by-hand requirement notice for a step VGS cannot run on this system. A plugin README keeps commands behind Show command details.
scripts/check-user-commands.pyenforces the text:docs/decisions/D061-no-manual-commands.md. -
Setup automates every step it can; a step only the user can take needs a clear Settings path or the feature does not ship: D075.
-
Before writing or changing code, load the code-quality skill. Before writing a plugin, load the vgs-plugin skill.
- Before structural work, writing a plugin, a host or a capability provider, or adding a kind, a capability or a manifest key:
docs/architecture/overview.md. - Before touching the configuration files or their judge:
docs/architecture/configuration.md. - Before touching a token, the theme judge,
Theme, a component ofqs.Ui, a plugin-owned look, a pointer, keyboard or focus path, a Settings field, text a user reads, or any value a surface draws with:docs/architecture/design-system.md. - Before touching anything that starts, stops, measures or talks to the shell, or adding a watcher, a poller, a cache or a subprocess:
docs/architecture/runtime.md. - Before touching the Hyprland layer, a dispatch,
Compositor,Dispatch.jsor a shortcut:docs/architecture/hyprland.md. - Before touching the
tuicapability, a floating TUI, a package step, a system step, or any place text could become a command:docs/architecture/commands-are-data.md. - Before touching a password field, a stored token or any text that could carry a secret:
docs/architecture/secrets.md. - Before touching a theme package, its judge, a theme target, apply, follow or reload, the theme catalog, a wallpaper download, the wallpaper state or the background,
ThemeRunneror a theme view:docs/architecture/themes.md. - Before touching the licence,
VERSION, a package recipe, the installer,vgshell selfor an update:docs/architecture/distribution.md. - Before touching an idle stage, an inhibitor, an energy setting, a wake source or a power key:
docs/architecture/power.md. - Before touching the Jarvis daemon, its wire, a brain or a tool executor:
docs/architecture/jarvis.md; before any path by which content or a credential leaves it:docs/architecture/jarvis-outbound.md. - Before touching
scripts/validate, a row, its inputs or its verdict, a test's environment, the nested sandbox and its harness, a fault the smoke excuses, a latency or resident-size budget, or a Jarvis test:docs/architecture/validation.md. - Before writing a plugin, running validation, regenerating the README's plugin table or images, or changing a licence:
DEVELOPMENT.md. - When working under
shell/,shell/plugins/,shell/Ui/,shell/Commons/orscripts/: that directory'sAGENTS.md, which Claude Code loads natively. Pi and Codex load only the root-to-cwd chain, so an agent there reads the nested file first.
If you are a review agent reviewing code, read .github/instructions/code-review.md before you comment.