Repository navigation
feat(runtime): replace family snapshots with session-owned settings in session metadata - #46
Merged
osovv merged 7 commits intoNov 8, 2026
Conversation
Replace the snapshot store and bind/guard machinery with a session-owned settings service: the resolved roles, orchestration profile, and plugin toggles of the effective configuration are recorded under one metadata key of the family root on first resolution, resolved through host-verified lineage for every member, and merged back through read-modify-write so foreign metadata survives the native replace-semantics write. Birth reads the effective configuration fresh because vvoc.json edits emit no host config event. Legacy bindings migrate once into root metadata and the old directories are pruned only after a fully successful pass.
Every native plugin consumer (workflow, model-roles, system-context- injection, guardian, hashline-edit, spec-guard, analytics, tool-history- compaction, peak-hours, web-tools, secrets-redaction) reads its family policy from the shared settings service instead of the removed snapshot configFor/accept pair; the workflow runtime surface narrows to the settings service and the integration suites cover birth stability, family-scoped changes, and creation-level role application.
Add `vvoc session set --session <id>` (preset, profile, role, plugin toggle, or pull-defaults) and the native TUI /vv-settings command sharing the same action parser; both resolve lineage to the family root and perform a single metadata read-modify-write, so only the named family changes. Drop the --force/--session rebind flags from preset, role, and plugin commands together with the rebind marker store and /vv-rebind.
The fixture control plane forwards to the family-settings service (/settings, /family) instead of the removed admission and snapshot endpoints; cases assert lazy metadata birth, config-change isolation, lineage, restart persistence, and role payloads without qualified snapshot variants or per-request session attribution; the restart-replay case proves the persisted record survives a real host restart byte-identically. The host pin targets the newest verified host (2.2.5) with the published binary's sha256, and the source commit is no longer claimed by default because the published binary carries no verifiable commit metadata.
Rewrite the binding/rebind/--force contract paragraphs, the plugin table row, and the startup-snapshot note around session-owned settings and the new explicit change commands; the GRACE graph and verification entries describe the settings service, the deleted machinery, the new command surfaces, and the rewritten scenarios.
…rift notes The guard error class no longer exists; the distinct-context smoke now asserts the absence of family-binding admission failures in the host log without naming the deleted class.
…ion-owned settings
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why the change
The snapshot-plus-guard mechanism kept freezing configuration into a side store and then proving every request against that copy, which produced recurring runtime incidents, so families now simply live with their own settings recorded in native session metadata.
Special things to note
bindings/,snapshots/, andrebind/directories; a failed write keeps them and retries on the next start. The old snapshot store is never read afterwards.src/hosts.json) with the published binary's sha256; fresh live evidence for 2.2.6 was not obtainable in this environment, so the verified list is unchanged and the pin is override-driven (VVOC_E2E_V2_HOST_SHA256/VVOC_E2E_V2_SOURCE_COMMIT, the source commit is no longer claimed by default because the published binary carries no verifiable commit metadata).Change outline
Settings live under one metadata key of the family root; every write is a read-modify-write so foreign metadata survives the native replace-semantics write:
The guard machinery is deleted outright —
snapshot-store.ts,snapshots.ts, the rebind marker store,/vv-rebind, and the--forceflags are gone, so the bind/admission error class can no longer occur:All plugin consumers (workflow, model-roles, system-context-injection, guardian, and the rest) resolve the projected family config through the one settings service; credentials keep coming from the live configuration and are never persisted in metadata. The real-host e2e harness asserts birth stability, config-change isolation, restart persistence, and lineage instead of snapshot ids.