102 lines
4.8 KiB
Markdown
102 lines
4.8 KiB
Markdown
# PR-20 Asset Action Capabilities and Register-First Delivery
|
|
|
|
Domain Owner: `docs/packer`
|
|
Cross-Domain Impact: `docs/studio`
|
|
|
|
## Briefing
|
|
|
|
The current `Assets` workspace still decides too much locally about which asset actions should appear and when they should be allowed.
|
|
|
|
That is the wrong long-term boundary.
|
|
|
|
The packer already owns asset semantics, registration state, build participation, and write execution. It should also own the capability decision for asset actions, while Studio remains a consumer that renders the actions exposed by the service.
|
|
|
|
This PR introduces a capability-based action contract driven by the packer, with `AssetAction.REGISTER` as the first delivered action end to end.
|
|
|
|
## Objective
|
|
|
|
Add a packer-owned asset action capability API and deliver the first action, `REGISTER`, through the full packer-to-Studio path.
|
|
|
|
## Dependencies
|
|
|
|
- [`./PR-15-snapshot-backed-asset-query-services.md`](./PR-15-snapshot-backed-asset-query-services.md)
|
|
- [`./PR-16-write-lane-command-completion-and-used-write-services.md`](./PR-16-write-lane-command-completion-and-used-write-services.md)
|
|
- [`./PR-17-studio-runtime-adapter-and-assets-workspace-consumption.md`](./PR-17-studio-runtime-adapter-and-assets-workspace-consumption.md)
|
|
- [`./PR-18-legacy-service-retirement-and-regression-hardening.md`](./PR-18-legacy-service-retirement-and-regression-hardening.md)
|
|
- [`./PR-19-api-surface-audit-model-separation-and-public-read-dtos.md`](./PR-19-api-surface-audit-model-separation-and-public-read-dtos.md)
|
|
|
|
## Scope
|
|
|
|
- define a public packer action contract for asset capabilities
|
|
- let the packer decide which actions are available for a given asset at a given moment
|
|
- let Studio render the action section from packer-provided capabilities instead of local semantic rules
|
|
- keep the capability contract stable even if the packer later moves to FSM or another internal decision model
|
|
- deliver `AssetAction.REGISTER` as the first supported action end to end
|
|
- keep the service-only wave focused on active functionality
|
|
|
|
## Non-Goals
|
|
|
|
- no FSM implementation
|
|
- no full action family rollout in the first delivery
|
|
- no doctor/build/reconcile action surfaces
|
|
- no speculative future actions without packer support
|
|
- no frontend-local capability engine
|
|
|
|
## Execution Method
|
|
|
|
1. Add a public action capability contract in `prometeu-packer-api`, including:
|
|
- `AssetAction` enum
|
|
- capability response shape for asset actions
|
|
- request/response messages for reading action capabilities
|
|
2. Model the response so the packer can expose at least:
|
|
- `action`
|
|
- `enabled`
|
|
- `visible`
|
|
- optional `reason`
|
|
3. Add a runtime-backed read path in `prometeu-packer-v1` that resolves action capabilities from the current asset state.
|
|
4. Keep the internal decision logic inside the packer implementation. Studio must not reconstruct capability semantics.
|
|
5. Add a write path for `AssetAction.REGISTER`.
|
|
6. Expose `REGISTER` only when the asset capability resolver says it is allowed.
|
|
7. Render the `Actions` section in Studio from the returned capabilities.
|
|
8. Execute `REGISTER` from Studio through the packer write path and refresh the asset workspace after completion.
|
|
|
|
## Register-First Delivery Rules
|
|
|
|
The first delivered action is:
|
|
|
|
- `AssetAction.REGISTER`
|
|
|
|
Expected initial capability behavior:
|
|
|
|
- unregistered assets may expose `REGISTER`
|
|
- registered assets must not expose `REGISTER`
|
|
- Studio must only show the `Register` button when the packer returns that capability
|
|
|
|
Other future actions such as `MOVE`, `DELETE`, `INCLUDE_IN_BUILD`, `EXCLUDE_FROM_BUILD`, `ENABLE_PRELOAD`, `DISABLE_PRELOAD`, and `CHANGE_CONTRACT` are intentionally deferred from code delivery in this PR unless needed to support the contract shape.
|
|
|
|
## Acceptance Criteria
|
|
|
|
- the packer API exposes an asset action capability contract
|
|
- Studio reads action capabilities from the packer instead of deciding them locally
|
|
- the first delivered action is `AssetAction.REGISTER`
|
|
- `REGISTER` is available only for unregistered assets
|
|
- `REGISTER` is not shown for registered assets
|
|
- Studio can trigger `REGISTER` through the packer service path and refresh the workspace after success
|
|
- the capability contract remains valid if packer internals later migrate to FSM or another orchestration model
|
|
|
|
## Validation
|
|
|
|
- packer unit tests for capability resolution
|
|
- packer tests for `REGISTER` execution
|
|
- Studio tests or smoke tests proving that action buttons are rendered from service-provided capabilities
|
|
- end-to-end validation for unregistered asset -> register -> refresh -> registered asset
|
|
|
|
## Affected Artifacts
|
|
|
|
- `prometeu-packer/prometeu-packer-api/src/main/java/p/packer/**`
|
|
- `prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/**`
|
|
- `prometeu-packer/prometeu-packer-v1/src/test/java/p/packer/**`
|
|
- `prometeu-studio/src/main/java/p/studio/**`
|
|
- `prometeu-studio/src/test/java/p/studio/**`
|
|
|