diff --git a/adapter-agility-digit/src/main/kotlin/dev/picasso/adapter/digit/DigitAdapter.kt b/adapter-agility-digit/src/main/kotlin/dev/picasso/adapter/digit/DigitAdapter.kt index 246240d6..1e20ba7e 100644 --- a/adapter-agility-digit/src/main/kotlin/dev/picasso/adapter/digit/DigitAdapter.kt +++ b/adapter-agility-digit/src/main/kotlin/dev/picasso/adapter/digit/DigitAdapter.kt @@ -62,7 +62,7 @@ class DigitAdapter( */ override fun accept(taskId: String, skillType: String, parameters: Map, startedAt: Instant): Acceptance { if (!identity.complete) { - return Acceptance.Refused(Refusal.IDENTITY_UNSET, "기체 신원이 비어 있다") + return Acceptance.Refused(Refusal.IDENTITY_UNSET, "기체 식별 정보가 비어 있다") } val required = REQUIRED[skillType] @@ -249,7 +249,7 @@ class DigitAdapter( // **여기서 멈춘다.** 새 액션을 얹으면 지워지지 않은 것과 함께 돈다. return Applied.Refused( Refusal.LINK_ERROR, - "remove-action 이 성공했다는데 액션이 아직 running 이다(컨테이너 거동) — 겹쳐 돌지 않게 갱신을 멈춘다", + "remove-action 이 성공했다는데 액션이 아직 running 이다(컨테이너 동작) — 겹쳐 돌지 않게 갱신을 멈춘다", ) } @@ -296,7 +296,7 @@ class DigitAdapter( current.state = TaskState.TASK_STATE_CANCELLED_RECOVERY_FAILED return Applied.Refused( Refusal.LINK_ERROR, - "remove-action 이 성공했다는데 액션이 아직 running 이다(컨테이너 거동)", + "remove-action 이 성공했다는데 액션이 아직 running 이다(컨테이너 동작)", ) } diff --git a/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitAdapter.kt b/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitAdapter.kt index e41cdad9..840c8345 100644 --- a/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitAdapter.kt +++ b/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitAdapter.kt @@ -128,7 +128,7 @@ class OrbitAdapter( // **플릿의 거절은 정준 분류로 못 옮긴다** — 이유가 문자열 하나로 오고 값 집합이 없다. is DispatchResult.Refused -> Acceptance.Refused( Refusal.VENDOR_REJECTED, - "플릿이 파견을 거절했다: ${outcome.detail}", + "플릿이 파견을 거부했다: ${outcome.detail}", FailureClass.FAILURE_CLASS_UNCLASSIFIED, outcome.detail, ) @@ -162,7 +162,7 @@ class OrbitAdapter( "ORBIT_RUN_EVENTS_UNREADABLE", FailureClass.FAILURE_CLASS_UNCLASSIFIED, it.message ?: "", - "실행은 끝났는데 사건을 못 읽어 성패를 모른다", + "실행은 끝났는데 실행 이벤트를 못 읽어 성패를 모른다", canAcceptNewTask = true, ) return current.state diff --git a/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitHttpLink.kt b/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitHttpLink.kt index 8efee385..553c820e 100644 --- a/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitHttpLink.kt +++ b/adapter-boston-dynamics-orbit/src/main/kotlin/dev/picasso/adapter/orbit/OrbitHttpLink.kt @@ -169,7 +169,7 @@ class OrbitHttpLink private constructor( base("$API/$path/$suffix").header("Accept", JSON).GET().build(), ) if (response.statusCode() / 100 != 2) { - error("Orbit 이 거절했다: HTTP ${response.statusCode()} ${response.body().take(ERROR_SNIPPET)}") + error("Orbit 이 거부했다: HTTP ${response.statusCode()} ${response.body().take(ERROR_SNIPPET)}") } val tree = mapper.readTree(response.body()) // 봉투가 둘이다 — 배열 그대로이거나 `resources` 안에 있다. diff --git a/adapter-boston-dynamics-spot/src/main/kotlin/dev/picasso/adapter/spot/SpotAdapter.kt b/adapter-boston-dynamics-spot/src/main/kotlin/dev/picasso/adapter/spot/SpotAdapter.kt index 9f7aaea8..bc5d63e5 100644 --- a/adapter-boston-dynamics-spot/src/main/kotlin/dev/picasso/adapter/spot/SpotAdapter.kt +++ b/adapter-boston-dynamics-spot/src/main/kotlin/dev/picasso/adapter/spot/SpotAdapter.kt @@ -88,7 +88,7 @@ class SpotAdapter( */ override fun accept(taskId: String, skillType: String, parameters: Map, startedAt: Instant): Acceptance { if (!identity.complete) { - return Acceptance.Refused(Refusal.IDENTITY_UNSET, "기체 신원이 비어 있다") + return Acceptance.Refused(Refusal.IDENTITY_UNSET, "기체 식별 정보가 비어 있다") } task?.takeIf { !it.state.isTerminal }?.let { @@ -140,7 +140,7 @@ class SpotAdapter( } val sources = acquisition.imageSources().getOrElse { - return Acceptance.Refused(Refusal.LINK_ERROR, "취득 능력을 못 받았다: ${it.message}") + return Acceptance.Refused(Refusal.LINK_ERROR, "취득 케이퍼빌리티를 못 받았다: ${it.message}") } if (sources.isEmpty()) { return Acceptance.Refused(Refusal.VENDOR_SURFACE_ABSENT, "취득할 영상 원천이 하나도 없다 — 찍을 것이 없다") @@ -155,7 +155,7 @@ class SpotAdapter( is AcquireResult.Rejected -> Acceptance.Refused( Refusal.VENDOR_REJECTED, - "AcquireData 를 로봇이 거절했다: ${result.status}", + "AcquireData 를 로봇이 거부했다: ${result.status}", failureClass = FailureClass.FAILURE_CLASS_UNCLASSIFIED, vendorDetail = "AcquireDataResponse.status=${result.status.name}", ) @@ -173,7 +173,7 @@ class SpotAdapter( val command = link.command ?: return Acceptance.Refused( Refusal.VENDOR_SURFACE_ABSENT, - "명령 계층이 없다 — 받아 놓고 아무것도 안 하는 것이 가장 나쁘므로 거절한다", + "명령 계층이 없다 — 받아 놓고 아무것도 안 하는 것이 가장 나쁘므로 거부한다", ) val duration = number(parameters, P_DURATION) @@ -310,7 +310,7 @@ class SpotAdapter( is LeaseResult.Ok -> null is LeaseResult.Rejected -> { authorityLost = result.status - Acceptance.Refused(Refusal.CONTROL_AUTHORITY_LOST, "미션 적재가 리스로 거절됐다: ${result.status}") + Acceptance.Refused(Refusal.CONTROL_AUTHORITY_LOST, "미션 적재가 리스로 거부됐다: ${result.status}") } is LeaseResult.Failed -> Acceptance.Refused(Refusal.LINK_ERROR, "미션 적재가 실패했다: ${result.cause.message}") @@ -325,11 +325,11 @@ class SpotAdapter( ): Acceptance = when (result) { is LeaseResult.Rejected -> { authorityLost = result.status - Acceptance.Refused(Refusal.CONTROL_AUTHORITY_LOST, "리스가 거절됐다: ${result.status}") + Acceptance.Refused(Refusal.CONTROL_AUTHORITY_LOST, "리스가 거부됐다: ${result.status}") } is LeaseResult.Failed -> - Acceptance.Refused(Refusal.LINK_ERROR, "남쪽 호출이 실패했다: ${result.cause.message}") + Acceptance.Refused(Refusal.LINK_ERROR, "사우스바운드 호출이 실패했다: ${result.cause.message}") is LeaseResult.Ok -> { task = RunningTask(taskId, startedAt, layer, durationSeconds, TaskState.TASK_STATE_RUNNING) @@ -582,7 +582,7 @@ class SpotAdapter( Layer.MISSION -> updateMission(current, parameters) Layer.ACQUISITION -> Applied.Refused( Refusal.NO_VENDOR_PRIMITIVE, - "취득은 멈춤이 보장되지 않는다 — CancelAcquisition 이 STATUS_FAILED_TO_CANCEL 로 거절할 수 있고, " + + "취득은 멈춤이 보장되지 않는다 — CancelAcquisition 이 STATUS_FAILED_TO_CANCEL 로 거부할 수 있고, " + "그러면 갱신이 취득 둘을 만든다", ) Layer.COMMAND -> updateCommand(current, parameters, at) @@ -712,7 +712,7 @@ class SpotAdapter( Applied.Ok } CancelAcquisitionStatus.STATUS_FAILED_TO_CANCEL -> - Applied.Refused(Refusal.VENDOR_REJECTED, "로봇이 취득 취소를 거절했다 — 취득은 계속된다(CancelAcquisitionResponse.status=${answer.name})") + Applied.Refused(Refusal.VENDOR_REJECTED, "로봇이 취득 취소를 거부했다 — 취득은 계속된다(CancelAcquisitionResponse.status=${answer.name})") CancelAcquisitionStatus.STATUS_REQUEST_ID_DOES_NOT_EXIST -> Applied.Refused(Refusal.NO_TASK, "로봇이 이 취득 요청을 모른다(CancelAcquisitionResponse.status=${answer.name})") CancelAcquisitionStatus.STATUS_UNKNOWN -> @@ -778,12 +778,12 @@ class SpotAdapter( is LeaseResult.Rejected -> { authorityLost = result.status onReject() - Applied.Refused(Refusal.CONTROL_AUTHORITY_LOST, "리스가 거절됐다: ${result.status}") + Applied.Refused(Refusal.CONTROL_AUTHORITY_LOST, "리스가 거부됐다: ${result.status}") } is LeaseResult.Failed -> { onReject() - Applied.Refused(Refusal.LINK_ERROR, "남쪽 호출이 실패했다: ${result.cause.message}") + Applied.Refused(Refusal.LINK_ERROR, "사우스바운드 호출이 실패했다: ${result.cause.message}") } } diff --git a/adapter-core/src/main/kotlin/dev/picasso/adapter/core/SiteBinding.kt b/adapter-core/src/main/kotlin/dev/picasso/adapter/core/SiteBinding.kt index bb7dad26..0c6dee11 100644 --- a/adapter-core/src/main/kotlin/dev/picasso/adapter/core/SiteBinding.kt +++ b/adapter-core/src/main/kotlin/dev/picasso/adapter/core/SiteBinding.kt @@ -163,7 +163,7 @@ object SiteBindingCheck { AXES.mapNotNull { (axis, active, of) -> mismatch(axis, active(source), of, names, source) } .joinToString(" · ") + ". 재등록하기 전까지 이 자리로 보내지 않는다" - else -> error("결속 검사가 내지 않는 거절이다: $refusal") + else -> error("결속 검사가 내지 않는 거부다: $refusal") } private fun mismatch( diff --git a/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostServices.kt b/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostServices.kt index 2b31f27a..442987df 100644 --- a/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostServices.kt +++ b/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostServices.kt @@ -72,7 +72,7 @@ internal class Routing(private val robots: Map) { fun enter(header: MessageHeader): HostedRobot { val compatibility = RequestHeaders.compatibility(header) if (compatibility.blocking) { - throw Status.FAILED_PRECONDITION.withDescription("계약 개정판이 호환되지 않는다: $compatibility").asRuntimeException() + throw Status.FAILED_PRECONDITION.withDescription("계약 리비전이 호환되지 않는다: $compatibility").asRuntimeException() } if (header.robotId.isBlank()) { throw Status.INVALID_ARGUMENT.withDescription("요청 헤더에 robot_id가 없다 — §5.5는 gRPC 요청에 싣는다").asRuntimeException() diff --git a/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostedRobot.kt b/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostedRobot.kt index 54945f08..1bcacc79 100644 --- a/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostedRobot.kt +++ b/adapter-host/src/main/kotlin/dev/picasso/adapter/host/HostedRobot.kt @@ -223,7 +223,7 @@ class HostedRobot( current?.takeIf { !it.terminal }?.let { return StartOutcome.Rejected( RejectionCode.REJECTION_CODE_INVALID_TRANSITION, - "이미 도는 태스크가 있다: ${it.taskId} — 실물은 배타적 제어 모델이다(§4.9)", + "이미 도는 태스크가 있다: ${it.taskId} — 실제 하드웨어는 배타적 제어 모델이다(§4.9)", ) } diff --git a/adapter-unitree-g1/src/main/kotlin/dev/picasso/adapter/g1/G1Adapter.kt b/adapter-unitree-g1/src/main/kotlin/dev/picasso/adapter/g1/G1Adapter.kt index 774cd988..14c591b2 100644 --- a/adapter-unitree-g1/src/main/kotlin/dev/picasso/adapter/g1/G1Adapter.kt +++ b/adapter-unitree-g1/src/main/kotlin/dev/picasso/adapter/g1/G1Adapter.kt @@ -67,7 +67,7 @@ class G1Adapter( if (!identity.complete) { return Acceptance.Refused( Refusal.IDENTITY_UNSET, - "기체 신원이 비어 있다 — G1은 신원을 말하지 않으므로 설정으로만 온다", + "기체 식별 정보가 비어 있다 — G1은 식별 정보를 말하지 않으므로 설정으로만 온다", ) } if (skillType != SKILL) { @@ -89,7 +89,7 @@ class G1Adapter( ?: return Acceptance.Refused( Refusal.VENDOR_SURFACE_ABSENT, "고수준 서비스가 없다 — 시뮬레이터이거나 ai_sport 가 안 떠 있다. " + - "받아 놓고 아무것도 안 하는 것이 가장 나쁘므로 거절한다", + "받아 놓고 아무것도 안 하는 것이 가장 나쁘므로 거부한다", ) task?.takeIf { !it.state.isTerminal }?.let { @@ -139,7 +139,7 @@ class G1Adapter( } return Acceptance.Refused( Refusal.VENDOR_REJECTED, - "SetVelocity 를 로봇이 거절했다: ${e.message}", + "SetVelocity 를 로봇이 거부했다: ${e.message}", failureClass = failureClass, vendorDetail = "${e.error?.name ?: "unnamed"} code=${e.rawCode}", ) @@ -379,7 +379,7 @@ class G1Adapter( * 하나이고 그것은 배터리이지 일이 아니다. 시간으로 나누면 그 숫자는 우리가 지은 것이다(§15.108). */ override fun progress(): ProgressObservation = ProgressObservation.NotObservable( - "벤더 표면에 태스크 진척이 없다 — 퍼센트는 AgvBmsState_.battery_percentage 뿐이고 그것은 배터리다", + "벤더 인터페이스에 태스크 진척이 없다 — 퍼센트는 AgvBmsState_.battery_percentage 뿐이고 그것은 배터리다", ) /** diff --git a/client/src/main/kotlin/dev/picasso/client/cli/Main.kt b/client/src/main/kotlin/dev/picasso/client/cli/Main.kt index 04ecb717..1aa09dc7 100644 --- a/client/src/main/kotlin/dev/picasso/client/cli/Main.kt +++ b/client/src/main/kotlin/dev/picasso/client/cli/Main.kt @@ -110,7 +110,7 @@ fun main(args: Array) { if (!negotiated.accepted) { // **거절을 삼키지 않는다.** 사유가 유일한 산출물이다(§5.4). negotiated.rejectionsList.forEach { - err.println("협상 거절: ${it.code} — ${it.detail}") + err.println("협상 거부: ${it.code} — ${it.detail}") } exitProcess(ClientCli.REJECTED) } @@ -120,7 +120,7 @@ fun main(args: Array) { ) if (started.hasRejection()) { val rejection = started.rejection - err.println("태스크 거절: ${rejection.code} — ${rejection.detail}") + err.println("태스크 거부: ${rejection.code} — ${rejection.detail}") if (rejection.code == RejectionCode.REJECTION_CODE_UNSPECIFIED) exitProcess(1) exitProcess(ClientCli.REJECTED) } diff --git a/contracts/src/main/kotlin/dev/picasso/contracts/wire/ContractIdentity.kt b/contracts/src/main/kotlin/dev/picasso/contracts/wire/ContractIdentity.kt index a5dcc62f..1febdb57 100644 --- a/contracts/src/main/kotlin/dev/picasso/contracts/wire/ContractIdentity.kt +++ b/contracts/src/main/kotlin/dev/picasso/contracts/wire/ContractIdentity.kt @@ -34,15 +34,15 @@ object ContractIdentity { /** 시험이 부재를 확인할 수 있도록 스트림을 인자로 받는다. */ internal fun from(stream: InputStream?): Pair { val properties = Properties() - (stream ?: error("계약 신원 리소스를 찾을 수 없다: $RESOURCE")).use(properties::load) + (stream ?: error("계약 식별 정보 리소스를 찾을 수 없다: $RESOURCE")).use(properties::load) val semver = properties.getProperty("semver").orEmpty() val digest = properties.getProperty("digest").orEmpty() // 파일은 있는데 키가 비는 경우가 있다 — 굽는 태스크가 반쯤 돈 경우다. // 파일 존재만 보는 구현은 그것을 통과시킨다. - check(semver.isNotBlank()) { "계약 신원에 semver가 없다: $RESOURCE" } - check(digest.isNotBlank()) { "계약 신원에 digest가 없다: $RESOURCE" } + check(semver.isNotBlank()) { "계약 식별 정보에 semver가 없다: $RESOURCE" } + check(digest.isNotBlank()) { "계약 식별 정보에 digest가 없다: $RESOURCE" } return semver to digest } diff --git a/gate/src/main/kotlin/dev/picasso/gate/checks/Check04CrossRef.kt b/gate/src/main/kotlin/dev/picasso/gate/checks/Check04CrossRef.kt index 11321077..c476aa48 100644 --- a/gate/src/main/kotlin/dev/picasso/gate/checks/Check04CrossRef.kt +++ b/gate/src/main/kotlin/dev/picasso/gate/checks/Check04CrossRef.kt @@ -38,7 +38,7 @@ class Check04CrossRef : GateCheck { if (def == null) { findings += Finding( id, Severity.ERROR, - "계약에 없는 능력을 선언했다: ${s.skillType}@${s.major}. " + + "계약에 없는 케이퍼빌리티를 선언했다: ${s.skillType}@${s.major}. " + "계약이 아는 것: ${index.skillTypes().sorted().joinToString(", ")}", doc.locationOf("/skills/$i"), ) diff --git a/gate/src/main/kotlin/dev/picasso/gate/checks/Check06Vocabulary.kt b/gate/src/main/kotlin/dev/picasso/gate/checks/Check06Vocabulary.kt index ca5a61e3..e575711b 100644 --- a/gate/src/main/kotlin/dev/picasso/gate/checks/Check06Vocabulary.kt +++ b/gate/src/main/kotlin/dev/picasso/gate/checks/Check06Vocabulary.kt @@ -23,7 +23,7 @@ import dev.picasso.profile.ProfileDocument class Check06Vocabulary : GateCheck { override val id = "6" - override val name = "능력 어휘 파괴와 확장·축소 분류" + override val name = "케이퍼빌리티 어휘 파괴와 확장·축소 분류" override val requires = setOf(Resource.PROFILE_DOCUMENT, Resource.BASELINE) override fun run(input: GateInput): CheckResult { @@ -115,7 +115,7 @@ class Check06Vocabulary : GateCheck { val same = siblings.firstOrNull { it.major == old.major } if (same == null) { - val label = if (siblings.any { it.major > old.major }) "major 증가" else "능력 제거" + val label = if (siblings.any { it.major > old.major }) "major 증가" else "케이퍼빌리티 제거" out += shrink(location, "$label: ${old.skillType}@${old.major}", old, registry, skipped) return@forEach } @@ -219,7 +219,7 @@ class Check06Vocabulary : GateCheck { return Finding( id, Severity.WARNING, "$what 가 $from → $to" + - if (withdrawn) " — 능력 철회다. §5.2가 분류하지 않아 막지 않는다" else "", + if (withdrawn) " — 케이퍼빌리티 철회다. §5.2가 분류하지 않아 막지 않는다" else "", location, ) } @@ -401,7 +401,7 @@ class Check06Vocabulary : GateCheck { .map { field -> Finding( id, Severity.WARNING, - "투영 필드가 바뀌었다: $field (${oldTree.get(field)} → ${newTree.get(field)})" + + "프로젝션 필드가 바뀌었다: $field (${oldTree.get(field)} → ${newTree.get(field)})" + if (field == EXCLUSIVE) { " — 소비자는 이제 자신이 유일한 명령자임을 전제해야 한다(§4.9)" } else { diff --git a/gate/src/main/kotlin/dev/picasso/gate/checks/Check07ModelBranching.kt b/gate/src/main/kotlin/dev/picasso/gate/checks/Check07ModelBranching.kt index 1123127a..09241649 100644 --- a/gate/src/main/kotlin/dev/picasso/gate/checks/Check07ModelBranching.kt +++ b/gate/src/main/kotlin/dev/picasso/gate/checks/Check07ModelBranching.kt @@ -126,7 +126,7 @@ class Check07ModelBranching : GateCheck { needles.filter { it in line }.map { needle -> Finding( id, Severity.ERROR, - "출하 소스에 기종 좌표가 있다: '$needle' " + + "프로덕션 소스에 기종 좌표가 있다: '$needle' " + "— A-1의 '같은 클라이언트 코드'가 깨진다(설계 §11.2의 7번)", "$label:${index + 1}", ) diff --git a/gate/src/main/kotlin/dev/picasso/gate/checks/Check11OutboundScope.kt b/gate/src/main/kotlin/dev/picasso/gate/checks/Check11OutboundScope.kt index c7d79545..d59b7c64 100644 --- a/gate/src/main/kotlin/dev/picasso/gate/checks/Check11OutboundScope.kt +++ b/gate/src/main/kotlin/dev/picasso/gate/checks/Check11OutboundScope.kt @@ -81,7 +81,7 @@ class Check11OutboundScope : GateCheck { listOf( Finding( id, Severity.ERROR, - "출하 소스에서 아웃바운드를 여는 자리를 하나도 못 찾았다 — 탐색 방법이 낡았다", + "프로덕션 소스에서 아웃바운드를 여는 자리를 하나도 못 찾았다 — 탐색 방법이 낡았다", MAIN, ), ), diff --git a/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionSuites.kt b/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionSuites.kt index 6c150779..9decfaeb 100644 --- a/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionSuites.kt +++ b/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionSuites.kt @@ -108,7 +108,7 @@ class RevisionSuites( val actual = client.capabilities(ROBOT) if (actual != expected) { failures += SuiteFailure( - "CONTRACT.capabilities", "프로파일의 투영", + "CONTRACT.capabilities", "프로파일의 프로젝션", "응답 스킬=${actual.skillsList.map { "${it.skillType}@${it.major}.${it.minor}" }}", ) } @@ -126,7 +126,7 @@ class RevisionSuites( /** 멈춘 상태가 계약상 올바른가. 올바르면 널, 아니면 관측값이다. */ private fun verdict(run: TaskRun, skill: SkillDeclaration, doc: ProfileDocument): String? { - run.rejection?.let { return "거절: $it" } + run.rejection?.let { return "거부: $it" } val last = run.follower!!.updates.lastOrNull() ?: return "갱신 없음" return when (last.state) { TaskState.TASK_STATE_SUCCEEDED -> null @@ -208,7 +208,7 @@ class RevisionSuites( ): RejectionCode? = harness(document).use { h -> val client = h.client(CLIENT) val started = client.start(ROBOT, "negative", 1, skill.skillType, MinimalParameters.of(skill, requiredOptionalKeys(expected))) - if (started.hasRejection()) error("유효한 태스크가 거절됐다: ${started.rejection.code} ${started.rejection.detail}") + if (started.hasRejection()) error("유효한 태스크가 거부됐다: ${started.rejection.code} ${started.rejection.detail}") control(client, started.handle) } diff --git a/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionTestRunner.kt b/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionTestRunner.kt index 94d9be52..b08f717a 100644 --- a/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionTestRunner.kt +++ b/harness/src/main/kotlin/dev/picasso/harness/revision/RevisionTestRunner.kt @@ -149,7 +149,7 @@ class RevisionTestRunner( if (attempt == 0) "요청 ${claimed.requestId} 는 이미 끝났다" else "요청 ${claimed.requestId} 는 앞 보고가 반영됐다", ) ReportReply.NotClaimer -> log("요청 ${claimed.requestId} 는 이 실행기가 집은 것이 아니다 — 버린다") - is ReportReply.Refused -> log("요청 ${claimed.requestId} 보고 거절 ${reply.status}: ${reply.body}") + is ReportReply.Refused -> log("요청 ${claimed.requestId} 보고 거부 ${reply.status}: ${reply.body}") } return } diff --git a/mimic/src/main/kotlin/dev/picasso/mimic/engine/ParameterCheck.kt b/mimic/src/main/kotlin/dev/picasso/mimic/engine/ParameterCheck.kt index 833760b9..59094149 100644 --- a/mimic/src/main/kotlin/dev/picasso/mimic/engine/ParameterCheck.kt +++ b/mimic/src/main/kotlin/dev/picasso/mimic/engine/ParameterCheck.kt @@ -124,7 +124,7 @@ object ParameterCheck { ValueType.VALUE_TYPE_BOOL -> Unit ValueType.VALUE_TYPE_UNSPECIFIED, ValueType.UNRECOGNIZED -> - error("선언의 value_type이 미정이다: $key — 투영이 이것을 만들 수 없다") + error("선언의 value_type이 미정이다: $key — 프로젝션이 이것을 만들 수 없다") } return problems diff --git a/mimic/src/main/kotlin/dev/picasso/mimic/engine/TaskHost.kt b/mimic/src/main/kotlin/dev/picasso/mimic/engine/TaskHost.kt index f36413bd..0ee4e274 100644 --- a/mimic/src/main/kotlin/dev/picasso/mimic/engine/TaskHost.kt +++ b/mimic/src/main/kotlin/dev/picasso/mimic/engine/TaskHost.kt @@ -715,7 +715,7 @@ class TaskHost( .setCanContinueCurrentTask(false) .setCanAcceptNewTask(false) .setErrorHint( - "종료한 태스크를 로봇이 계속 수행 중이다. 계약과 실물이 어긋나 있으니 " + + "종료한 태스크를 로봇이 계속 수행 중이다. 계약과 실제 하드웨어가 어긋나 있으니 " + "현장에서 로봇을 정지시키고 어댑터의 래치 처리를 확인하십시오.", ) .addReferences( diff --git a/mimic/src/main/kotlin/dev/picasso/mimic/profile/ProfileSource.kt b/mimic/src/main/kotlin/dev/picasso/mimic/profile/ProfileSource.kt index 3c6bfd26..42456ec7 100644 --- a/mimic/src/main/kotlin/dev/picasso/mimic/profile/ProfileSource.kt +++ b/mimic/src/main/kotlin/dev/picasso/mimic/profile/ProfileSource.kt @@ -42,7 +42,7 @@ class FileProfileSource(private val schemaPath: Path) : ProfileSource { private val schema: JsonSchema by lazy { val text = runCatching { Files.readString(schemaPath) }.getOrElse { - throw ProfileRejected("능력 프로파일 스키마를 읽을 수 없다: $schemaPath (${it.message})") + throw ProfileRejected("케이퍼빌리티 프로파일 스키마를 읽을 수 없다: $schemaPath (${it.message})") } JsonSchemaFactory .getInstance(SpecVersion.VersionFlag.V202012) diff --git a/mimic/src/main/kotlin/dev/picasso/mimic/transport/RobotRegistry.kt b/mimic/src/main/kotlin/dev/picasso/mimic/transport/RobotRegistry.kt index 83453bb0..1932efd2 100644 --- a/mimic/src/main/kotlin/dev/picasso/mimic/transport/RobotRegistry.kt +++ b/mimic/src/main/kotlin/dev/picasso/mimic/transport/RobotRegistry.kt @@ -69,7 +69,7 @@ class RobotRegistry( val compatibility = RequestHeaders.compatibility(header) if (compatibility.blocking) { throw Status.FAILED_PRECONDITION - .withDescription("계약 개정판이 호환되지 않는다: $compatibility") + .withDescription("계약 리비전이 호환되지 않는다: $compatibility") .asRuntimeException() } diff --git a/picasso/src/main/kotlin/dev/picasso/middleware/AdmissionGate.kt b/picasso/src/main/kotlin/dev/picasso/middleware/AdmissionGate.kt index 9e8952c0..ba90ea51 100644 --- a/picasso/src/main/kotlin/dev/picasso/middleware/AdmissionGate.kt +++ b/picasso/src/main/kotlin/dev/picasso/middleware/AdmissionGate.kt @@ -111,7 +111,7 @@ internal class AdmissionGate( val where = unit.destination ?: continue if (floors.ownerOf(where) != FloorOwner.Unowned) continue return Submission.Rejected( - "자리 $where 의 바닥에 소유자가 없다 — 승인할 쪽이 없으므로 보내지 않는다(자원 소유 대장)", + "자리 $where 의 바닥에 소유자가 없다 — 승인할 쪽이 없으므로 보내지 않는다(자원 소유 레지스터)", ) } return null diff --git a/picasso/src/main/kotlin/dev/picasso/middleware/Approval.kt b/picasso/src/main/kotlin/dev/picasso/middleware/Approval.kt index 8ee0ac79..3e17250e 100644 --- a/picasso/src/main/kotlin/dev/picasso/middleware/Approval.kt +++ b/picasso/src/main/kotlin/dev/picasso/middleware/Approval.kt @@ -138,7 +138,7 @@ sealed interface ApprovalOutcome { ) : ApprovalOutcome { init { require((refusal == ApprovalRefusal.CONSUMED) == (consumed != null)) { - "소모 기록은 CONSUMED 거절에만, 그리고 반드시 실린다: $refusal · ${consumed != null}" + "소모 기록은 CONSUMED 거부에만, 그리고 반드시 실린다: $refusal · ${consumed != null}" } } } diff --git a/picasso/src/main/kotlin/dev/picasso/middleware/Middleware.kt b/picasso/src/main/kotlin/dev/picasso/middleware/Middleware.kt index 24488c3f..a86a8d20 100644 --- a/picasso/src/main/kotlin/dev/picasso/middleware/Middleware.kt +++ b/picasso/src/main/kotlin/dev/picasso/middleware/Middleware.kt @@ -419,7 +419,7 @@ class Middleware( if (existing != null) return revise(existing, order) val active = mission ?: missions.active(order.workMasterId) - ?: return Submission.Rejected("모르는 논리적 능력이다: ${order.workMasterId}") + ?: return Submission.Rejected("모르는 논리적 케이퍼빌리티다: ${order.workMasterId}") val capability = active.capability evidenceRefusal(order, capability)?.let { return it } @@ -799,7 +799,7 @@ class Middleware( // **카탈로그를 한 번 읽고 그 쌍을 작업 수락까지 넘긴다.** 관문에 댄 계획과 실행이 쥘 계획이 같은 버전이어야 // 한다 — 그 사이에 활성화가 끼면 관문이 본 적 없는 단위가 나간다. val mission = missions.active(order.workMasterId) - ?: return Submission.Rejected("모르는 논리적 능력이다: ${order.workMasterId}") + ?: return Submission.Rejected("모르는 논리적 케이퍼빌리티다: ${order.workMasterId}") val planned = mission.capability.plan(order) val refusals = linkedMapOf() val missing = linkedMapOf() @@ -1893,7 +1893,7 @@ class Middleware( val kept = if (declared == null) emptyMap() else wanted.filterKeys { it in declared } (wanted.keys - kept.keys).forEach { key -> if (!droppedOptionals.add(robot to key)) return@forEach - val why = if (declared == null) "능력을 못 물어봤다" else "이 기종이 선언하지 않는다" + val why = if (declared == null) "케이퍼빌리티를 못 물어봤다" else "이 기종이 선언하지 않는다" execution.trail("OPTIONAL_NOT_SENT", "$key: $why — 요구하지 않고 보낸다") } return base + kept diff --git a/picasso/src/main/kotlin/dev/picasso/middleware/RemedyDesk.kt b/picasso/src/main/kotlin/dev/picasso/middleware/RemedyDesk.kt index ec735bef..9f57390d 100644 --- a/picasso/src/main/kotlin/dev/picasso/middleware/RemedyDesk.kt +++ b/picasso/src/main/kotlin/dev/picasso/middleware/RemedyDesk.kt @@ -109,7 +109,7 @@ internal class RemedyDesk( if (approval) { note(robotId, jobOrderId, RemedyOutcome.Found(remedy.steps)) return rejection.copy( - reason = "${rejection.reason} — 승인 시점의 거절이라 서 있는 제안을 바꾸지 않았다", + reason = "${rejection.reason} — 승인 시점의 거부라 활성 제안을 바꾸지 않았다", remedy = null, ) } @@ -272,7 +272,7 @@ internal class RemedyDesk( val declared = robots.capabilities(robotId)?.skillsList?.associateBy { it.skillType } ?: return Judgment.No( ApprovalRefusal.CAPABILITY_UNKNOWN, - "능력을 못 물어봤다 — 조치가 실행 가능한지 확인할 수 없다", + "케이퍼빌리티를 못 물어봤다 — 조치가 실행 가능한지 확인할 수 없다", ) val parameters: List> @@ -280,7 +280,7 @@ internal class RemedyDesk( if (given.size != steps.size) { return Judgment.No( ApprovalRefusal.VALUE_NOT_DECLARED, - "걸음 수와 파라미터 수가 다르다: ${steps.size} != ${given.size}", + "단계 수와 파라미터 수가 다르다: ${steps.size} != ${given.size}", ) } steps.forEachIndexed { at, step -> diff --git a/picasso/src/main/kotlin/dev/picasso/middleware/mission/DefinedCapability.kt b/picasso/src/main/kotlin/dev/picasso/middleware/mission/DefinedCapability.kt index 43781694..9e04b386 100644 --- a/picasso/src/main/kotlin/dev/picasso/middleware/mission/DefinedCapability.kt +++ b/picasso/src/main/kotlin/dev/picasso/middleware/mission/DefinedCapability.kt @@ -44,7 +44,7 @@ class DefinedCapability(val definition: MissionDefinition) : LogicalCapability { // **선언 없는 신원 대조를 기본값으로 메우지 않는다.** 메우면 검증기가 없앤 암묵이 이 길로 돌아온다. definition.steps.filterIsInstance().forEach { step -> require(!MissionValidator.needsSourceObservation(step) || step.sourceObservation != null) { - "검증을 거치지 않은 정의다: ${step.id} 가 출발 자리의 신원을 대는데 출발 관측 선언이 없다" + "검증을 거치지 않은 정의다: ${step.id} 가 출발 자리의 식별 정보를 대는데 출발 관측 선언이 없다" } require(!MissionValidator.needsDestinationObservation(step) || step.destinationObservation != null) { "검증을 거치지 않은 정의다: ${step.id} 가 목적지에 둘 것의 식별 정보를 대는데 목적지 관측 선언이 없다" diff --git a/picasso/src/main/kotlin/dev/picasso/middleware/mission/MissionValidator.kt b/picasso/src/main/kotlin/dev/picasso/middleware/mission/MissionValidator.kt index 8acafbe6..1c58a648 100644 --- a/picasso/src/main/kotlin/dev/picasso/middleware/mission/MissionValidator.kt +++ b/picasso/src/main/kotlin/dev/picasso/middleware/mission/MissionValidator.kt @@ -83,7 +83,7 @@ enum class MissionRefusalKind(val owner: RefusalOwner, val nextAction: String) { * 관문이 그 선언을 읽지 않고, 기대 신원이 없으면 `REQUIRED` 가 신원 대조 없이 설비의 침묵만 막는다. 어느 쪽이든 적은 뜻과 * 도는 뜻이 다르다. */ - SOURCE_OBSERVATION_UNUSED(RefusalOwner.ENGINEER, "출발 관측 선언을 지우거나 출발 자리와 기대 신원을 함께 적는다"), + SOURCE_OBSERVATION_UNUSED(RefusalOwner.ENGINEER, "출발 관측 선언을 지우거나 출발 자리와 기대 식별 정보를 함께 적는다"), /** * 목적지 관측 검사 — 기대 식별 정보와 목적지를 둘 다 대는 단위 노드가 `destinationObservation` 을 선언하지 않았다(§15.235). @@ -261,7 +261,7 @@ object MissionValidator { ) !needsSourceObservation(unit) && declared != null -> MissionRefusal( MissionRefusalKind.SOURCE_OBSERVATION_UNUSED, unit.id, "sourceObservation=${declared.name}", - "선언 없음(출발 자리와 기대 신원이 둘 다 있는 노드만 선언한다)", at, + "선언 없음(출발 자리와 기대 식별 정보가 둘 다 있는 노드만 선언한다)", at, ) else -> null } diff --git a/picasso/src/test/kotlin/dev/picasso/middleware/RemedyApprovalTest.kt b/picasso/src/test/kotlin/dev/picasso/middleware/RemedyApprovalTest.kt index 9c766b8c..685c5066 100644 --- a/picasso/src/test/kotlin/dev/picasso/middleware/RemedyApprovalTest.kt +++ b/picasso/src/test/kotlin/dev/picasso/middleware/RemedyApprovalTest.kt @@ -143,7 +143,7 @@ class RemedyApprovalTest { val answer = assertIs( w.mw.approveRemedy(ROBOT, "PATROL-1", emptyList(), OPERATOR), ) - assertTrue(answer.reason.contains("걸음 수와 파라미터 수가 다르다"), answer.reason) + assertTrue(answer.reason.contains("단계 수와 파라미터 수가 다르다"), answer.reason) } } diff --git a/registry/src/main/kotlin/dev/picasso/registry/binding/BindingService.kt b/registry/src/main/kotlin/dev/picasso/registry/binding/BindingService.kt index e5a0e472..18ad7235 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/binding/BindingService.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/binding/BindingService.kt @@ -154,7 +154,7 @@ class BindingService(private val db: Db) { Activation.AlreadyActive -> ActivateOutcome.Refused( "활성화할 수 있는 상태가 아니다: ${RevisionStatus.ACTIVE} (가능: $ACTIVATABLE)", ) - Activation.Unknown -> ActivateOutcome.Refused("없는 개정판이다: $profileRevisionId") + Activation.Unknown -> ActivateOutcome.Refused("없는 리비전이다: $profileRevisionId") is Activation.Refused -> ActivateOutcome.Refused( if (outcome.status !in ACTIVATABLE) { "활성화할 수 있는 상태가 아니다: ${outcome.status} (가능: $ACTIVATABLE)" @@ -228,7 +228,7 @@ class BindingService(private val db: Db) { ): BindOutcome = db.transaction { c -> if (statusOf(c, profileRevisionId) != RevisionStatus.ACTIVE) { return@transaction BindOutcome.Refused( - "활성 개정판이 아니다: $profileRevisionId (${statusOf(c, profileRevisionId)})", + "활성 리비전이 아니다: $profileRevisionId (${statusOf(c, profileRevisionId)})", ) } diff --git a/registry/src/main/kotlin/dev/picasso/registry/diag/DiagnosticsService.kt b/registry/src/main/kotlin/dev/picasso/registry/diag/DiagnosticsService.kt index 945ce104..7cd0de5f 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/diag/DiagnosticsService.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/diag/DiagnosticsService.kt @@ -493,7 +493,7 @@ class DiagnosticsService( ).use { s -> s.setLong(1, profileRevisionId) s.executeQuery().use { rs -> - require(rs.next()) { "없는 개정판이다: $profileRevisionId" } + require(rs.next()) { "없는 리비전이다: $profileRevisionId" } rs.getInt(1) to rs.getString(2) } } diff --git a/registry/src/main/kotlin/dev/picasso/registry/ingest/HandshakeIngestService.kt b/registry/src/main/kotlin/dev/picasso/registry/ingest/HandshakeIngestService.kt index 37f4e6f1..e452264a 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/ingest/HandshakeIngestService.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/ingest/HandshakeIngestService.kt @@ -63,11 +63,11 @@ class HandshakeIngestService( val rejections = response.rejectionsList if (response.accepted && rejections.isNotEmpty()) { return HandshakeIngestOutcome.Refused( - "성공인데 거절이 ${rejections.size}건 실려 있다", + "성공인데 거부가 ${rejections.size}건 실려 있다", ) } if (!response.accepted && rejections.isEmpty()) { - return HandshakeIngestOutcome.Refused("실패인데 거절 사유가 없다") + return HandshakeIngestOutcome.Refused("실패인데 거부 사유가 없다") } val requirements = request.requirement.requirementsList diff --git a/registry/src/main/kotlin/dev/picasso/registry/ingest/TaskIngestService.kt b/registry/src/main/kotlin/dev/picasso/registry/ingest/TaskIngestService.kt index c8cb9c0c..b17c308d 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/ingest/TaskIngestService.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/ingest/TaskIngestService.kt @@ -107,7 +107,7 @@ class TaskIngestService(private val db: Db) { ?: return@transaction TaskIngestOutcome( 0, listOf( - "모르는 개정판이다: ${header.profileRef.profileId}" + + "모르는 리비전이다: ${header.profileRef.profileId}" + "#${header.profileRef.revision}", ), ) @@ -134,7 +134,7 @@ class TaskIngestService(private val db: Db) { if (skillTypeId == null) { // **그 행만 건너뛴다.** 메시지 전체를 버리면 스킬 하나가 낯설다는 // 이유로 같은 로봇의 다른 태스크가 드레인에서 통째로 사라진다. - skipped += "개정판 $revisionId 이 선언하지 않은 스킬이다: $skillType" + skipped += "리비전 $revisionId 이 선언하지 않은 스킬이다: $skillType" return false } if (taskId.isBlank()) { diff --git a/registry/src/main/kotlin/dev/picasso/registry/plan/ChangePlanService.kt b/registry/src/main/kotlin/dev/picasso/registry/plan/ChangePlanService.kt index 08e06e39..f3c9f5a6 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/plan/ChangePlanService.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/plan/ChangePlanService.kt @@ -305,16 +305,16 @@ class ChangePlanService( val detail = when (intent) { Intent.REMOVE_CAPABILITY, Intent.MIGRATE_MAJOR -> { val successor = requireNotNull(successorRevisionId) { - "$intent 의 APPLY 는 활성화할 개정판을 요구한다 — " + - "그 스킬을 뺀 새 개정판이다(§9.5)" + "$intent 의 APPLY 는 활성화할 리비전을 요구한다 — " + + "그 스킬을 뺀 새 리비전이다(§9.5)" } // **활성화는 `BindingService`가 한다.** 여기서 status를 직접 // 쓰면 §8.4 ③의 승인 조건(TESTED/SUPERSEDED, 세 스위트 PASS)을 // 지나지 않는 두 번째 활성화 경로가 생긴다. when (val outcome = bindings.activate(successor, actor)) { - is ActivateOutcome.Activated -> "개정판 $successor 활성화" + is ActivateOutcome.Activated -> "리비전 $successor 활성화" is ActivateOutcome.Refused -> throw IllegalStateException( - "후계 개정판을 활성화할 수 없다: ${outcome.detail}", + "후계 리비전을 활성화할 수 없다: ${outcome.detail}", ) } } @@ -328,7 +328,7 @@ class ChangePlanService( "(SELECT (target->>'profile_revision_id')::bigint " + " FROM change_plan WHERE plan_id = ?)", ).use { it.setLong(1, planId); it.executeUpdate() } - "개정판 폐기" + "리비전 폐기" } } diff --git a/registry/src/main/kotlin/dev/picasso/registry/plan/Preconditions.kt b/registry/src/main/kotlin/dev/picasso/registry/plan/Preconditions.kt index 471af273..aa5ebbb3 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/plan/Preconditions.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/plan/Preconditions.kt @@ -305,10 +305,10 @@ class Preconditions( CheckType.SUCCESSOR_ACTIVE, ok, when { - status == null -> "후계 개정판 $successor 이 없다" - status != "ACTIVE" -> "후계 개정판이 활성이 아니다: $status" - bound == 0 -> "후계 개정판에 붙은 기체가 없다 — 지우면 아무도 못 쓴다" - else -> "후계 개정판이 활성이고 기체 $bound 대가 붙어 있다" + status == null -> "후계 리비전 $successor 이 없다" + status != "ACTIVE" -> "후계 리비전이 활성이 아니다: $status" + bound == 0 -> "후계 리비전에 붙은 기체가 없다 — 지우면 아무도 못 쓴다" + else -> "후계 리비전이 활성이고 기체 $bound 대가 붙어 있다" }, ) } diff --git a/registry/src/main/kotlin/dev/picasso/registry/revision/RevisionService.kt b/registry/src/main/kotlin/dev/picasso/registry/revision/RevisionService.kt index 08665728..9f7f9b5b 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/revision/RevisionService.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/revision/RevisionService.kt @@ -67,7 +67,7 @@ class RevisionService( // **거꾸로 가거나 같은 번호는 거부한다.** 허용하면 같은 좌표가 // 두 문서를 가리키고, `profile_ref`로 재현할 수 없게 된다. return@transaction SubmitOutcome.Rejected( - "개정판 번호가 단조 증가하지 않는다: 받은 값=${parsed.revision}, 현재 최대=$highest", + "리비전 번호가 단조 증가하지 않는다: 받은 값=${parsed.revision}, 현재 최대=$highest", ) } diff --git a/registry/src/main/kotlin/dev/picasso/registry/testing/TestRequestService.kt b/registry/src/main/kotlin/dev/picasso/registry/testing/TestRequestService.kt index 37b4f668..a45c9ec1 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/testing/TestRequestService.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/testing/TestRequestService.kt @@ -86,7 +86,7 @@ class TestRequestService( fun request(profileRevisionId: Long, actor: String): Long = when (val outcome = requestTest(profileRevisionId, actor)) { is TestRequested.Created -> outcome.requestId is TestRequested.Existing -> outcome.requestId - TestRequested.UnknownRevision -> throw IllegalArgumentException("없는 개정판이다: $profileRevisionId") + TestRequested.UnknownRevision -> throw IllegalArgumentException("없는 리비전이다: $profileRevisionId") is TestRequested.NotTestable -> throw IllegalStateException("시험할 수 없는 상태다: ${outcome.status}") } diff --git a/registry/src/main/kotlin/dev/picasso/registry/web/BindingOperationsController.kt b/registry/src/main/kotlin/dev/picasso/registry/web/BindingOperationsController.kt index c09f46b0..ee862d4b 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/web/BindingOperationsController.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/web/BindingOperationsController.kt @@ -35,16 +35,16 @@ class BindingOperationsController(private val bindings: BindingService) { .body(mapOf("robot_binding_id" to outcome.bindingId, "unbound_binding_id" to outcome.unbound)) is Binding.AlreadyBound -> ResponseEntity.ok(mapOf("robot_binding_id" to outcome.bindingId, "already" to true)) Binding.UnknownRobot -> notFound("UNKNOWN_ROBOT", "모르는 기체다: $robotId") - Binding.UnknownRevision -> notFound("UNKNOWN_REVISION", "없는 개정판이다: $revision") + Binding.UnknownRevision -> notFound("UNKNOWN_REVISION", "없는 리비전이다: $revision") Binding.UnknownBuild -> notFound("UNKNOWN_BUILD", "없는 어댑터 빌드다: $build") Binding.RobotRetired -> conflict(mapOf("reason" to "ROBOT_RETIRED", "error" to "퇴역한 기체다 — 묶으려면 복귀시킨다")) is Binding.RevisionNotActive -> conflict( - mapOf("reason" to "REVISION_NOT_ACTIVE", "error" to "활성 개정판이 아니다", "status" to outcome.status.name), + mapOf("reason" to "REVISION_NOT_ACTIVE", "error" to "활성 리비전이 아니다", "status" to outcome.status.name), ) is Binding.ContractTooOld -> conflict( mapOf( "reason" to "CONTRACT_TOO_OLD", - "error" to "빌드의 계약 semver 가 개정판의 스킬보다 낮다", + "error" to "빌드의 계약 semver 가 리비전의 스킬보다 낮다", "contract_semver" to outcome.contractSemver, "too_new" to outcome.tooNew.map { (skill, since) -> mapOf("skill_type" to skill, "introduced_in_semver" to since) }, ), diff --git a/registry/src/main/kotlin/dev/picasso/registry/web/RevisionOperationsController.kt b/registry/src/main/kotlin/dev/picasso/registry/web/RevisionOperationsController.kt index f2b01808..9f19e006 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/web/RevisionOperationsController.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/web/RevisionOperationsController.kt @@ -62,7 +62,7 @@ class RevisionOperationsController( ResponseEntity.ok(stored(outcome.profileRevisionId, outcome.revision, outcome.status.name, outcome.reasons)) is Submitted.NotMonotonic -> ResponseEntity.status(HttpStatus.CONFLICT).body( mapOf( - "error" to "개정판 번호가 단조 증가하지 않는다(같은 번호에 다른 문서 포함)", + "error" to "리비전 번호가 단조 증가하지 않는다(같은 번호에 다른 문서 포함)", "received" to outcome.received, "highest" to outcome.highest, ), @@ -122,7 +122,7 @@ class RevisionOperationsController( ), ) Activation.Unknown -> - ResponseEntity.status(HttpStatus.NOT_FOUND).body(mapOf("error" to "없는 개정판이다: $profileRevisionId")) + ResponseEntity.status(HttpStatus.NOT_FOUND).body(mapOf("error" to "없는 리비전이다: $profileRevisionId")) } private fun stored(id: Long, revision: Int, status: String, reasons: List): Map = diff --git a/registry/src/main/kotlin/dev/picasso/registry/web/TestRequestController.kt b/registry/src/main/kotlin/dev/picasso/registry/web/TestRequestController.kt index a13edfd6..7b7d9552 100644 --- a/registry/src/main/kotlin/dev/picasso/registry/web/TestRequestController.kt +++ b/registry/src/main/kotlin/dev/picasso/registry/web/TestRequestController.kt @@ -35,7 +35,7 @@ class TestRequestController(private val requests: TestRequestService) { is TestRequested.Created -> ResponseEntity.status(HttpStatus.CREATED).body(mapOf("request_id" to outcome.requestId)) is TestRequested.Existing -> ResponseEntity.ok(mapOf("request_id" to outcome.requestId)) TestRequested.UnknownRevision -> - ResponseEntity.status(HttpStatus.NOT_FOUND).body(mapOf("error" to "없는 개정판이다: $profileRevisionId")) + ResponseEntity.status(HttpStatus.NOT_FOUND).body(mapOf("error" to "없는 리비전이다: $profileRevisionId")) is TestRequested.NotTestable -> ResponseEntity.status(HttpStatus.CONFLICT).body( mapOf("error" to "시험할 수 없는 상태다", "status" to outcome.status), ) diff --git a/registry/src/test/kotlin/dev/picasso/registry/IngestTest.kt b/registry/src/test/kotlin/dev/picasso/registry/IngestTest.kt index 03971867..fb0370a3 100644 --- a/registry/src/test/kotlin/dev/picasso/registry/IngestTest.kt +++ b/registry/src/test/kotlin/dev/picasso/registry/IngestTest.kt @@ -279,7 +279,7 @@ class IngestTest { val outcome = tasks.record(unknown) assertEquals(0, outcome.recorded) - assertTrue(outcome.skipped.single().contains("모르는 개정판"), "${outcome.skipped}") + assertTrue(outcome.skipped.single().contains("모르는 리비전"), "${outcome.skipped}") } @Test diff --git a/uplink/src/main/kotlin/dev/picasso/uplink/report/HttpLiveness.kt b/uplink/src/main/kotlin/dev/picasso/uplink/report/HttpLiveness.kt index 7feb636b..d5d2a2fe 100644 --- a/uplink/src/main/kotlin/dev/picasso/uplink/report/HttpLiveness.kt +++ b/uplink/src/main/kotlin/dev/picasso/uplink/report/HttpLiveness.kt @@ -114,7 +114,7 @@ class HttpLiveness( val response = client.send(request, HttpResponse.BodyHandlers.ofString()) if (response.statusCode() !in 200..299) { - error("생존 보고가 거절됐다: ${response.statusCode()} ${response.body()}") + error("생존 보고가 거부됐다: ${response.statusCode()} ${response.body()}") } }