# Concurrency, Observability, and Studio Adapter Boundary Decision

Status: Accepted
Date: 2026-03-11
Domain Owner: `docs/packer`
Cross-Domain Impact: `docs/studio`

## Context

The production `prometeu-packer` track introduces two architectural seams that must not remain implicit:

1. the packer will become the operational source of truth for asset summaries, diagnostics, mutation previews, and build lifecycle state;
2. Studio will consume that operational model through adapters instead of reconstructing packer semantics locally;
3. the event and concurrency model must stay coherent when the packer is integrated into the Studio `Assets` workspace and shell.

Without an explicit decision, the repository risks drifting into duplicated semantics:

- Studio deriving packer-facing summaries from filesystem heuristics;
- Studio inventing lifecycle meaning not present in packer events;
- concurrent mutation or build behavior becoming observable in inconsistent ways.

## Decision

The following direction is adopted:

1. `prometeu-packer` is the semantic owner of asset operational state.
2. Studio is a consumer and remapper of packer responses and events, not a competing source of packer truth.
3. The baseline packer write policy is a `single-writer semantic lane per project`.
4. Packer observability is packer-native and causality-preserving.
5. Studio adapters may reshape packer data for UI presentation, but may not invent packer semantics, causal relationships, or final outcomes absent from packer responses/events.

## Adopted Constraints

### 1. Summary and Response Authority

- asset `summary`, `details`, `diagnostics`, `preview`, and build/mutation lifecycle state originate in the packer;
- Studio may use packer responses directly or remap them into view models;
- Studio must not define an alternative packer summary model from direct filesystem inspection once the packer-backed path exists;
- UI-oriented phrasing or grouping is allowed only as a remapping of packer-owned semantics.

### 2. Concurrency Model

- coordination is project-scoped;
- unrelated projects are not forced into one global execution lane;
- `read/read` may run concurrently when reads observe a coherent snapshot;
- `read/write` must not expose torn intermediate state;
- `write/write` on the same project is serialized;
- `build/write` on the same project is serialized unless a future explicit transactional model supersedes this baseline;
- preview generation may run outside the final commit-critical section when safe, but final apply/commit remains serialized.

### 3. Event and Observability Model

- the packer emits the authoritative event stream for asset operations;
- each logical operation must carry a stable `operation_id`;
- events within one operation must carry monotonic `sequence`;
- baseline event payloads must preserve fields equivalent to:
  - `project_id`
  - `operation_id`
  - `sequence`
  - `kind`
  - `timestamp`
  - `summary`
  - `progress` when applicable
  - `affected_assets` when applicable
- event ordering must remain causally coherent for one operation;
- progress-like low-value repetition may be coalesced by sinks/adapters;
- terminal lifecycle markers must remain individually observable.

### 4. Studio Adapter Boundary

- Studio adapts packer events into the existing Studio event bus and workspace models;
- Studio may convert packer-native envelopes into Studio-native event types for shell/workspace consumption;
- that adapter layer must remain translational, not semantic-authoritative;
- Activity, progress, and staged mutation surfaces in Studio must reflect packer-native lifecycle, not replace it.

## Why This Direction Was Chosen

- It prevents split-brain semantics between packer and Studio.
- It keeps packer behavior testable outside JavaFX.
- It allows Studio UI iteration without moving domain rules into the UI layer.
- It gives concurrency and observability one owner, which is necessary for deterministic mutation and build behavior.

## Explicit Non-Decisions

This decision does not define:

- the final internal threading primitives or executor topology of `prometeu-packer`;
- a watch daemon or continuous background worker model;
- remote/shared cache coordination;
- cross-project scheduling policy beyond allowing separate projects to coordinate independently;
- final event transport beyond the local adapter/event sink model currently planned.

## Implications

- read adapters belong in the packer integration track, not in Studio-local filesystem services;
- mutation preview/apply semantics belong in packer services and only map into Studio staged UI models;
- Studio Activity and progress integration must preserve packer causality metadata, even if the UI renders a simplified form;
- tests must verify both same-project write serialization and event ordering through the Studio adapter path.

## Propagation Targets

Specs:

- [`../specs/5. Diagnostics, Operations, and Studio Integration Specification.md`](../specs/5.%20Diagnostics,%20Operations,%20and%20Studio%20Integration%20Specification.md)

Plans:

- [`../pull-requests/PR-04-workspace-scan-list-assets-and-studio-read-adapter.md`](../pull-requests/PR-04-workspace-scan-list-assets-and-studio-read-adapter.md)
- [`../pull-requests/PR-05-sensitive-mutations-preview-apply-and-studio-write-adapter.md`](../pull-requests/PR-05-sensitive-mutations-preview-apply-and-studio-write-adapter.md)
- [`../pull-requests/PR-09-event-lane-progress-and-studio-operational-integration.md`](../pull-requests/PR-09-event-lane-progress-and-studio-operational-integration.md)

Cross-domain references:

- [`../../studio/specs/4. Assets Workspace Specification.md`](../../studio/specs/4.%20Assets%20Workspace%20Specification.md)
- [`../../studio/pull-requests/PR-05e-assets-staged-mutations-preview-and-apply.md`](../../studio/pull-requests/PR-05e-assets-staged-mutations-preview-and-apply.md)

Implementation surfaces:

- future `prometeu-packer` service contracts and event sink abstractions
- Studio packer read/write/event adapters
- Studio Activity/progress mapping code

## Validation Notes

The decision is correctly implemented only when all of the following are true:

- the same packer operation can be replayed and observed without Studio inventing hidden state;
- conflicting writes on one project cannot commit concurrently;
- Activity/progress in Studio can be driven from packer-native events alone;
- Studio summaries are either direct packer outputs or remapped packer outputs, never independent semantic recomputation.
