docs(vrs): define no-CAS launch drift boundary - #77
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9dbe863c65
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
2ba57f2 to
652b71c
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 652b71c96e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Make launch drift visible without making it disruptive, and keep replacing live work an explicitly selected operation. R29 derives a versioned desired launch fingerprint from the minimal effective fields st2 already passes to a task. Only an st2 launch records an observed fingerprint, bound to that launch's exact runtime identity and creation incarnation; a missing or mismatched binding reports `unknown`. Healthy drifted and unknown tasks are adopted without implicit restart, so R11's nondisruptive adoption is preserved. R30 keeps ordinary recovery ordinary: an absent or dead active task launches from the latest current declaration, and replacing live work is a separate operation fenced by catalog, host, effective PTY root, task set, and an exact runtime identity recheck immediately before disruption. Every behavior remains complete with an ordinary catalog folder and without CAS, captured generations, or replacement journals. Numbered R29/R30 by appending: R20-R28 are in use, and the R12/R18 gaps are left as gaps so existing references stay unambiguous. agent-tool: Claude Code agent-tool-version: 2.1.220 agent-runtime: Claude Code 2.1.220 agent-session-lookup: unavailable tooling-profile: dotfiles@unknown-dirty
0e7e317 to
0581ca9
Compare
|
Refreshed onto current Requirement IDs moved to R29/R30. This branch was written on 2026-07-30 against a
The They are numbered by appending rather than by filling the The branch is now one commit. It was six, and the intermediate commits proposed a contract this branch's own tip no longer holds — The content is unchanged from the reduced contract at Posted on behalf of @schickling
|
Why
A healthy task is currently adopted by stable identity even when its current Agent Spec would launch it differently. That preserves R11 control-plane replacement safety, but desired-versus-running drift is invisible. Restarting on every declaration edit would be destructive, while making recovery depend on captured generations, journals, or CAS would make the ordinary catalog insufficient.
Nathan’s boundary is explicit: every st2 behavior and ordinary workflow must remain complete with a plain copied or synchronized catalog folder and without CAS. CAS needs separate review and may only be additive publication, history, or storage optimization.
What
Reduce the proposal to a minimal protected VRS contract:
unknown;converged,drifted, andunknown;The prior captured-generation design is deliberately removed: no immutable old-generation launch snapshot, content-addressed boot-input capture, durable journal, operation ID, phase machine, terminal receipt, exact old-generation crash replay, or atomic old-to-new runtime transition.
Scope
Docs only:
docs/vrs/requirements.mdanddocs/vrs/spec.md. No runtime, catalog, rollout, database, or CAS implementation.Validation
Exact head:
0e7e317ee4adf354bc0e1273ad9f0bab5f5f1b4916097daac413ea0babd128f58f710b3d00b38488git diff --check origin/main: passcargo test --workspace --all-targets -- --test-threads=1: passcargo clippy --workspace --all-targets -- -D warnings: passcargo doc --workspace --no-deps: pass with 5 pre-existing warningsnix flake check --print-build-logs: unavailable because this host has nonixexecutableRelated: #30, #40, #41, #44, #60.