prometeu-studio/docs/packer/pull-requests/PR-20-asset-action-capabilities-and-register-first-delivery.md
2026-03-24 13:42:45 +00:00

4.8 KiB

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

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/**