response.success=Success
response.success.read=Fetched successfully
response.success.created=Created successfully
response.success.updated=Updated successfully
response.success.deleted=Deleted successfully
response.success.published=Published successfully
response.success.revoked=Revoked successfully
response.success.health=Service is up

validation.namespace.slug.notBlank=Slug cannot be blank
validation.namespace.slug.size=Slug must be between 2 and 64 characters
validation.namespace.displayName.notBlank=Display name cannot be blank
validation.namespace.displayName.size=Display name must not exceed 128 characters
validation.namespace.description.size=Description must not exceed 512 characters
validation.member.userId.notNull=User ID is required
validation.member.role.notNull=Role is required
validation.auth.local.username.notBlank=Username cannot be blank
validation.auth.local.password.notBlank=Password cannot be blank
validation.auth.local.email.notBlank=Email cannot be blank
validation.auth.local.currentPassword.notBlank=Current password cannot be blank
validation.auth.local.newPassword.notBlank=New password cannot be blank
validation.auth.local.email.invalid=Email format is invalid
validation.token.name.notBlank=Token name cannot be blank
validation.token.name.size=Token name must be at most 64 characters
validation.token.expiresAt.invalid=Expiration time format is invalid
validation.token.expiresAt.future=Expiration time must be in the future
error.token.name.duplicate=You already have a token with this name
error.token.notFound=Token not found: {0}

error.auth.required=Authentication required
error.auth.local.username.exists=Username already exists
error.auth.local.email.exists=Email already exists
error.auth.local.password.tooShort=Password must be at least 8 characters
error.auth.local.password.tooLong=Password must not exceed 128 characters
error.auth.local.password.tooWeak=Password must include at least 3 character types
error.auth.local.username.invalid=Username must be 3-64 characters and contain only letters, numbers, or underscores
error.auth.local.invalidCredentials=Incorrect username or password
error.auth.local.notEnabled=Local account login is not enabled for this user
error.auth.local.accountDisabled=This account has been disabled
error.auth.local.accountPending=This account is pending activation
error.auth.local.accountMerged=This account has been merged and can no longer be used to log in
error.auth.local.locked=Too many failed attempts. Please try again in {0} minute(s)
error.auth.login.throttled=Too many login attempts. Please try again in {0} minute(s)
error.auth.direct.disabled=Direct authentication compatibility is disabled
error.auth.direct.providerUnsupported=Unsupported direct authentication provider: {0}
error.auth.sessionBootstrap.disabled=Session bootstrap is disabled
error.auth.sessionBootstrap.providerUnsupported=Unsupported session bootstrap provider: {0}
error.auth.sessionBootstrap.notAuthenticated=No authenticated external session found
error.badRequest=Invalid request
error.forbidden=Forbidden
error.request.timeout=Request timed out
error.rateLimit.exceeded=Rate limit exceeded
error.storage.unavailable=Object storage is temporarily unavailable. Please try again later.
error.internal=An unexpected error occurred
error.slug.blank=Slug cannot be blank
error.slug.length=Slug length must be between {0} and {1} characters
error.slug.pattern=Slug must contain only lowercase letters, numbers, and hyphens, and must start and end with a letter or number
error.slug.doubleHyphen=Slug cannot contain consecutive hyphens
error.slug.reserved=Slug ''{0}'' is reserved and cannot be used
label.definition.too_many=Label definition limit reached ({0})
label.sort_order.empty=Sort order update payload cannot be empty
label.translation.empty=At least one label translation is required
label.translation.locale.blank=Label translation locale cannot be blank
label.translation.display_name.blank=Label translation display name cannot be blank
label.translation.locale.duplicate=Duplicate label translation locale: {0}
label.translation.locale.conflict=Duplicate label translation locale
error.namespace.slug.exists=Namespace slug ''{0}'' already exists
error.namespace.id.notFound=Namespace not found: {0}
error.namespace.slug.notFound=Namespace not found: {0}
error.namespace.membership.required=Namespace membership required
error.namespace.global.members.platformAdmin.required=Only platform user administrators can list global namespace members
error.namespace.admin.required=Namespace owner or admin role required
error.namespace.owner.required=Namespace owner role required
error.namespace.create.platformAdminRequired=Only SKILL_ADMIN or SUPER_ADMIN can create namespaces
error.namespace.delete.hasDependencies=Namespace cannot be deleted while it still contains skills or governance records
error.namespace.member.owner.assignDirect=Cannot assign OWNER role directly
error.namespace.member.alreadyExists=User is already a namespace member
error.namespace.member.notFound=Member not found
error.namespace.member.owner.remove=Cannot remove namespace owner
error.namespace.member.owner.setDirect=Cannot set OWNER role directly, use ownership transfer instead
error.namespace.member.search.tooShort=Search keyword must be at least 2 characters
error.namespace.owner.current.notFound=Current owner not found
error.namespace.owner.current.invalid=Current user is not the namespace owner
error.namespace.owner.new.notFound=New owner is not a namespace member
error.skill.metadata.content.empty=SKILL.md content cannot be empty
error.skill.metadata.frontmatter.missingStart=Missing frontmatter start marker ''---''
error.skill.metadata.frontmatter.missingContent=Missing frontmatter content after start marker
error.skill.metadata.frontmatter.missingEnd=Missing frontmatter end marker ''---''
error.skill.metadata.yaml.notMap=Frontmatter must be a YAML object
error.skill.metadata.yaml.invalid=Invalid YAML in frontmatter: {0}
error.skill.metadata.requiredField.missing=Missing required field: {0}
error.skill.publish.publisher.notMember=Publisher is not a member of namespace: {0}
error.skill.publish.package.invalid=Package validation failed: {0}
error.skill.publish.skillMd.notFound=SKILL.md not found
error.skill.publish.precheck.confirmRequired=Pre-publish warnings require confirmation before publishing:\n{0}
error.skill.publish.precheck.failed=Pre-publish validation failed: {0}
error.security.scanner.required=Security scanner must be enabled before publishing public or namespace-visible skills
error.skill.publish.archived=Archived skill must be restored before publishing: {0}
review.withdraw.not_pending=Only pending review submissions can be withdrawn: {0}
review.withdraw.not_submitter=Only the submitter can withdraw this review
review.approve.scan_in_progress=Security scan is still in progress. Approval is unavailable until scanning finishes.
review_task.not_found_for_version=No pending review submission found for version: {0}
error.skill.publish.summary.tooLong=Skill description must not exceed {0} characters
error.skill.notFound=Skill not found: {0}
error.skill.access.denied=Access denied to skill: {0}
error.skill.status.notActive=Skill is not active
error.skill.lifecycle.noPermission=Only the skill owner or namespace admin can manage this skill
error.skill.version.exists=Version already exists: {0}
error.skill.version.notFound=Version not found: {0}
error.skill.version.notPublished=Version is not published: {0}
error.skill.version.delete.unsupported=Only DRAFT, UPLOADED, REJECTED, or SCAN_FAILED versions can be deleted: {0}
error.skill.version.delete.lastVersion=Cannot delete the last remaining version: {0}
error.skill.version.compare.same=Cannot compare a version with itself
error.skill.report.reason.required=Please provide a report reason
error.skill.report.unavailable=This skill cannot be reported right now: {0}
error.skill.report.self=You cannot report your own skill
error.skill.report.duplicate=You already have a pending report for this skill
error.skill.report.notFound=Skill report not found: {0}
error.skill.report.alreadyHandled=This skill report has already been handled
error.skill.report.status.invalid=Unsupported skill report status: {0}
error.skill.version.latest.unavailable=No published version available for skill: {0}
error.skill.version.latest.notFound=Latest published version not found
error.skill.file.notFound=File not found: {0}
error.skill.tag.latest.reserved=Tag name ''latest'' is reserved
error.skill.tag.latest.delete=Tag name ''latest'' is reserved and cannot be deleted
error.skill.tag.notFound=Tag not found: {0}
error.skill.tag.targetVersion.notPublished=Target version must be published
error.skill.tag.version.missing=Tag does not point to a version: {0}
error.skill.tag.version.notFound=Version pointed by tag not found: {0}
error.skill.bundle.notFound=Published bundle not found in storage
error.skill.resolve.versionTag.conflict=Parameters version and tag cannot be used together
error.deviceAuth.userCode.invalid=Invalid or expired user code
error.deviceAuth.deviceCode.expired=Device code expired
error.deviceAuth.deviceCode.invalid=Device code expired or invalid
error.deviceAuth.deviceCode.used=Device code has already been used
error.admin.user.notFound=User not found: {0}
error.admin.user.role.invalid=Invalid role: {0}
error.admin.user.role.superAdmin.assignDenied=Only SUPER_ADMIN can mutate SUPER_ADMIN role state
error.admin.user.systemAccount.immutable=System accounts cannot be modified from user management
error.admin.user.status.invalid=Invalid user status: {0}
error.admin.user.status.unsupported=Only ACTIVE or DISABLED status can be managed here
error.skill.publish.nameConflict=A published skill with name ''{0}'' already exists in this namespace
error.skill.publish.nameConflict.private=A private skill with name ''{0}'' has already been published in this namespace
error.skill.approve.nameConflict=Cannot approve: a published skill with name ''{0}'' already exists in this namespace
error.skill.version.submit.notUploaded=Version ''{0}'' is not in UPLOADED status and cannot be submitted for review
error.skill.version.confirm.notUploaded=Version ''{0}'' is not in UPLOADED status and cannot be confirmed
error.skill.confirm.notPrivate=Only PRIVATE skills can use confirm-publish
error.skill.version.notDownloadable=Version ''{0}'' is not available for download

# Profile update
error.profile.displayName.length=Display name must be between 2 and 32 characters
error.profile.displayName.pattern=Display name can only contain Chinese characters, English letters, numbers, spaces, underscores, and hyphens
error.profile.noChanges=At least one field must be provided
response.profile.updated=Profile updated successfully
response.profile.pendingReview=Profile changes submitted for review

error.profileReview.notFound=Profile change request not found
error.profileReview.notPending=This request has already been reviewed
error.profileReview.commentRequired=Rejection reason is required
error.profileReview.commentTooLong=Rejection reason must not exceed 500 characters
error.profileReview.status.invalid=Invalid review status: {0}
error.profileReview.userDisabled=Cannot apply changes — user account is disabled

# Password reset
response.auth.password.reset.requested=If the account is eligible, a password reset verification code has been sent.
response.auth.password.reset.confirmed=Password has been reset successfully. Please sign in with your new password.
error.auth.password.reset.invalid.code=The verification code is invalid or has expired.
error.auth.password.reset.not.eligible=This account is not eligible for password reset.
error.auth.password.reset.no.credential=This account does not have a local credential.
error.auth.password.reset.email.failed=Failed to send password reset verification code. Please try again later.
validation.auth.password.reset.email.notBlank=Email cannot be blank
validation.auth.password.reset.email.invalid=Email format is invalid
validation.auth.password.reset.code.notBlank=Verification code cannot be blank
validation.auth.password.reset.code.invalid=Verification code must be 6 digits
validation.auth.password.reset.newPassword.notBlank=New password cannot be blank
promotion.target_skill_conflict=The target global skill "{0}" already exists
promotion.status.invalid=Unsupported promotion status: {0}
promotion.sort.field.invalid=Unsupported promotion sort field: {0}
promotion.sort.direction.invalid=Unsupported promotion sort direction: {0}
promotion.sort.pending_unsupported=Pending promotion requests do not support reviewed-time sorting
