Start from the synthetic reference service. A module package is the single portable manifest that the platform reads:
cp -r reference/synthetic-service my-serviceThen change names, execution profile, service class, API contract, diagnostics, and docs references. Add CRD bindings, meters, or a portal route only when they apply. Keep lifecycle applicability and evidence surfaces complete.
metadata: name, display name, owner, version.service.spec: execution profile, public product API, capabilities, lifecycle applicability, automation, billing applicability, gateway routes, workload identity, policies, data lifecycle, states, support, and evidence bundles; dependencies, analytics, portal/UI, and Kubernetes bindings only when applicable.billing: meters, cost meters, and idempotent events when billing is supported; otherwise declarenot_applicablewith a reason and omit the connector.catalog: class, visibility, portability, plans.tenantAccess: entitlements and permissions.durability: state class, data classes, backup policy, recovery objective.distribution: release contract metadata;federationandcommercialdeclaresupportedornot_applicable, with complete metadata only when supported.
Run conformance before publishing:
go run ./cmd/ocsctl conformance ./my-service/module-package.json