Skip to content

feat(install)!: always delegate play install, update, and repair to rote - #22

Open
roberts-pumpurs wants to merge 4 commits into
mainfrom
rob/rote-managed-install
Open

roberts-pumpurs wants to merge 4 commits into
mainfrom
rob/rote-managed-install

Conversation

@roberts-pumpurs

@roberts-pumpurs roberts-pumpurs commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Play ships its own installer and repair commands, and they fight rote install play over the same launchers and skill links.

This is the Play side of the rote install stack (modiqo/rote#2819 to modiqo/rote#2845). Merge it after the rote release that ships that stack, because every entry point here calls rote install play.

Before

rote install play   # Play under ~/.rote/play/current
play update         # runs Play's install.sh, which runs play-bootstrap

play update, play restore, play-activate, and install-all install a second copy under ~/.local/share/modiqo/play and repoint the ~/.local/bin launchers and <skills root>/play links at it. The next rote update points them back, so the active Play flips between copies with no message. The play@play-skills plugin carries a third copy, a full repo mirror.

rote's install also finds no play-setup to run, and play-intercept rejects the --harness cursor that rote's Cursor hook passes (inferred from code, not reproduced).

flowchart LR
  update["play update or install.sh"]
  repair["play restore, play-activate, install-all"]
  rote["rote install play"]
  copy[".local/share/modiqo/play copy"]
  current[".rote/play/current"]
  links["launchers and skill links"]
  plugin["play-skills plugin"]
  mirror["full repo mirror in the plugin"]
  update --> copy
  repair --> copy
  copy --> links
  rote --> current
  current --> links
  plugin --> mirror
  update ~~~ rote
  plugin ~~~ current
  classDef bad fill:#f8d7da,stroke:#b02a37,color:#000
  class copy,mirror,repair bad
  linkStyle 0,1,2 stroke:#b02a37,stroke-width:2px
Loading

After

Run the same commands. Only rote places Play.

  • play update runs rote install play with its arguments. Without rote on PATH it prints curl -fsSL https://getrote.dev/install | bash and exits 1.
  • install.sh is a shim: no rote runs the rote installer, a rote without install play --from runs rote update first, then it runs rote install play. just install runs rote install play --from ..
  • The marketplace plugin is a pointer SKILL.md that reads ~/.rote/play/current/SKILL.md, or tells the user to run rote install play.
  • New play-setup seeds the routing policy, journal settings, and model assets and prints play.setup/v1. rote runs it after placing Play and rolls back a release whose model_assets step fails.
  • play-intercept prompt --harness cursor prints {"continue": true}.
  • Preflight hints and the Grok pointer name rote install play and read ~/.rote/play/current.
flowchart LR
  update["play update or install.sh"]
  repair["play restore, play-activate, install-all"]
  rote["rote install play"]
  copy[".local/share/modiqo/play copy"]
  current[".rote/play/current"]
  links["launchers and skill links"]
  plugin["play-skills plugin"]
  mirror["full repo mirror in the plugin"]
  update ~~~ copy
  repair ~~~ copy
  copy ~~~ links
  rote --> current
  current --> links
  plugin ~~~ mirror
  update --> rote
  plugin --> current
  classDef gone fill:#eeeeee,stroke:#999999,stroke-dasharray:4 3,color:#777777
  classDef added fill:#d1e7dd,stroke:#146c43,color:#000
  class copy,mirror,repair gone
  class update,plugin added
  linkStyle 6,7 stroke:#146c43,stroke-width:2px
Loading

Grey dashed parts are removed. Green parts now hand off to rote's single copy at ~/.rote/play/current.

Compatibility

  • Breaking: play backup and play restore are removed. Run rote install play to repair an install.
  • Breaking: play-bootstrap, play-activate, install-all, and play-profile are removed, with the just recipes that wrapped them (bootstrap-plan, bootstrap-apply, install-copy, update, plan, uninstall, status, status-roots, verify-profile).
  • Breaking: play update requires rote.
  • play@play-skills is still published so marketplaces list Play; rote removes it once it links the real skill.

Validation

In a sandboxed home on macOS arm64, rote at the stack tip installed this branch with just barebones-install-sh --non-tty --play-from <checkout>. Setup reported READY, Play LOCAL CHECKOUT. ~/.rote/play/verify.log showed play-setup creating routing_policy, journal_settings, and model_assets. The Cursor hook rote wrote to ~/.cursor/hooks.json printed {"continue": true}.

BREAKING CHANGE: play backup, play restore, play-bootstrap, play-activate, install-all, play-profile, and their just recipes are removed, and play update now requires rote. Install, update, and repair Play with rote install play.

…ges play

When ${ROTE_HOME:-~/.rote}/play/install.json exists (a nonempty ROTE_HOME
wins), or Play runs from a rote play/versions/ release, rote owns the
installation:

- play update prints "Play is managed by rote. Running: rote install play"
  and execs rote; it rejects legacy installer options and reports the record
  and command when rote is not on PATH. It never falls back to install.sh.
- install.sh, play-bootstrap install/apply, install-all install,
  play-profile install/play-activate, and recovery restore refuse before
  writing and name rote install play. Preflight repair hints do the same.
- New scripts/bin/play-setup [--json] idempotently seeds the routing policy,
  journal settings, and Journey model assets and prints play.setup/v1.
- play-intercept prompt --harness cursor answers beforeSubmitPrompt with
  {"continue": true}; Cursor cannot receive injected context there.
- The Grok pointer prefers ${ROTE_HOME:-$HOME/.rote}/play/current/SKILL.md.
- Drop the call to the nonexistent rote telemetry record-play-install.
rote owns Play under ${ROTE_HOME:-~/.rote}/play/{versions,current,install.json},
so Play no longer decides whether rote manages it.

- play update runs `rote install play` with its arguments; without rote on
  PATH it names the rote installer (curl -fsSL https://getrote.dev/install | bash).
- install.sh is a shim: no rote -> rote's installer (which installs Play);
  rote without `install play --from` -> `rote update`, then check again;
  then `rote install play "$@"`. It never falls back to an old installer.
- just install runs `rote install play --from .` (live dev install).
- Preflight repair hints always say `rote install play`; its install-target
  prompt is gone. The Grok pointer reads only
  ${ROTE_HOME:-$HOME/.rote}/play/current/SKILL.md.

Delete Play's installer and recovery machinery, which has no runtime caller:
play-bootstrap (install/plan/apply/backup/restore, guided UI, marketplace
convergence, snapshots, receipts), play-activate, scripts/harness/install-all,
scripts/harness/play-profile, rote_ownership, `play backup`/`play restore`,
the install-marker package-index record, hosted-harness and installer-only
harness metadata, their tests, and the obsolete justfile recipes. README,
SKILL.md, and references describe install and update through rote.

BREAKING CHANGE: play backup, play restore, play-bootstrap, play-activate,
install-all, play-profile, and the just plan/update/uninstall/status recipes
are removed; use `rote install play` and `play update`.
@roberts-pumpurs
roberts-pumpurs force-pushed the rob/rote-managed-install branch from 2571db4 to 5f7ce2d Compare October 6, 2026 12:35
@roberts-pumpurs roberts-pumpurs changed the title feat(install): defer play installs and updates to rote when rote manages play feat(install)!: always delegate play install, update, and repair to rote Oct 6, 2026
The play@play-skills plugin now ships only a pointer skill (root SKILL.md frontmatter plus agents/openai.yaml) that reads ${ROTE_HOME:-~/.rote}/play/current/SKILL.md or gives the rote install command. package-plugin generates and checks the pointer instead of mirroring the repository.
@roberts-pumpurs
roberts-pumpurs force-pushed the rob/rote-managed-install branch from d4c9dd6 to f9494e7 Compare October 8, 2026 09:07
rote install play has no --pinned flag and no pinned Play version: it installs the latest
stable release and never downgrades. play update --pinned failed with an unknown-flag error.
The play update help, the README, and the pass-through test now use flags rote accepts. The
README also stops claiming rote registers a Tulving MCP server; it installs Tulving and uv
into ~/.rote/bin.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant