3.6 KiB
3.6 KiB
Runtime Ownership and Studio Boundary
Original Problem
Once the packer stopped being just a set of direct filesystem helpers, the repository needed a clear answer for three things:
- who owns operational asset semantics;
- how concurrent reads and writes stay coherent;
- how Studio consumes packer state without duplicating domain logic.
Without that boundary, the system would drift into split-brain behavior between packer services and Studio UI code.
Consolidated Decision
The packer is the semantic owner of operational asset state. Studio is a consumer of packer responses, commands, and events.
The stable boundary is:
- filesystem-first authoring workspace;
- project-scoped runtime snapshot for reads;
- single-writer semantic lane per project for commit-bearing operations;
- packer-native observability with causal ordering;
- Studio adapters that translate for presentation but do not invent semantics.
Final Model
1. Filesystem-First Runtime
- the workspace on disk remains the durable source of truth;
- the runtime snapshot is an operational projection used for coherent reads and write coordination;
- divergence between runtime state and filesystem state must become explicit packer state, not silent repair.
2. Concurrency Model
read/readmay run concurrently when both observe one coherent snapshot;read/writemust not expose torn intermediate state;write/writeon the same project is serialized;- build-bearing operations share the same project-scoped coordination story.
3. Event Ownership
- packer events are authoritative for lifecycle, progress, and outcomes;
- each logical operation carries stable causality through
operation_idand monotonicsequence; - sinks may coalesce noisy progress updates, but terminal lifecycle events remain observable.
4. Studio Adapter Rule
- Studio may remap packer data into workspace and shell view models;
- Studio must not recreate packer summaries, mutation semantics, or reconcile semantics from local heuristics;
- adapter code is translational, not semantic-authoritative.
Examples
Example: Mutation preview in Studio
The preview may be rendered in Studio-specific components, but the semantic meaning of:
- blockers,
- warnings,
- registry mutations,
- filesystem mutations,
- final apply outcome
must still come from the packer.
Example: Activity and progress
If the UI shows a simplified progress bar or activity feed, that is fine. What is not fine is for Studio to infer a successful final outcome without a packer-native terminal event or response.
Common Pitfalls and Anti-Patterns
- Rebuilding packer summaries from navigator rows or local filesystem scans.
- Treating adapter code as a second owner of mutation or reconcile rules.
- Hiding divergence by silently refreshing state without surfacing the transition.
- Allowing same-project writes to race because the caller "already validated" earlier.
- Collapsing event causality into UI-local state that cannot be replayed or tested outside Studio.