Shared Resource Model

SkillCloud & infra

Work on Luxury Yacht canonical Kubernetes resource identity, status presentation, facts, ResourceLink relationships, DTO projection, table/detail/object-map parity, and shared resource model tests

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Shared Resource Model skill

What this skill tells your AI

The instructions your AI receives, as published by luxury-yacht/app in .agents/skills/shared-resource-model/SKILL.md and read by ahel’s review.

Use this when touching canonical object identity, resource status, statusPresentation, lifecycle, facts, owner/relationship links, ResourceLink, event involved-object identity, DTO projection, or parity across refresh rows, streams, object panel details, and object map nodes/edges.

Read First

  1. AGENTS.md
  2. backend/AGENTS.md
  3. frontend/AGENTS.md for frontend consumers
  4. docs/architecture/shared-resource-model.md
  5. docs/architecture/resource-kind-registry.md for the per-kind package + registry layout (where identity, model, facts, and DTO live)
  6. docs/architecture/catalog.md when identity/existence is involved
  7. docs/architecture/refresh-system.md when rows, streams, events, or object details consume the model

Backend Entry Points

  • backend/resources/<kind> — per-kind identity.go, descriptor.go, model.go, facts.go, dto.go (the single definition of a kind)
  • backend/resourcemodel — shared status/facts/link primitives + relationship index that the per-kind models build on
  • backend/resourcekind, backend/resourcecontract, backend/kind/kindregistry — identity leaf, the built-in identity contract, and the kind registry
  • backend/refresh/snapshot
  • backend/resource_gateway.go — request-shaped detail/action owner
  • backend/resources/types — shared cross-kind DTO field types
  • backend/object_detail_provider.go — ResourceGateway detail dispatch (generated bindings)

Frontend Entry Points

  • frontend/src/shared/utils/backendStatusPresentation.ts
  • frontend/src/shared/utils/resourceLinkIdentity.ts
  • frontend/src/modules/object-panel
  • frontend/src/modules/object-map
  • Refresh/table consumers under frontend/src/modules/* and frontend/src/core/refresh/types.ts

Checklist

  • Object refs crossing boundaries include clusterId, group, version, kind, and namespace/name for concrete objects.
  • Backend GVK/GVR/scope lookups use the object catalog ResourceResolver. Built-ins use their real group/version from the catalog seed; CRDs preserve group/version from discovery, catalog, owner refs, HPA targets, events, or manifests.
  • Primary status is computed once in backend model code and projected as status, statusState, statusPresentation, and optional statusReason.
  • Frontend renders backend presentation fields instead of deriving primary status classes.
  • Relationships use ResourceLink; incomplete source refs become display-only refs rather than unsafe navigation links.
  • Facts stay semantic until the final DTO/table formatting boundary.
  • Table rows, stream rows, object panel details, events, and object-map payloads stay consistent when they render the same resource family.
  • Tests cover model status/facts/links and every changed projection.

Validation

Use focused checks while iterating:

mise exec -- go test ./backend/resourcemodel ./backend/refresh/snapshot ./backend/resources/... ./backend
mise exec -- npm run typecheck --prefix frontend
mise exec -- npm run test --prefix frontend -- backendStatusPresentation resourceLinkIdentity object-map object-panel

Then follow the root final validation gate.

Signals

GitHub stars
435
Forks
23
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
shared-resource-model
Source
github.com/luxury-yacht/app