Jira는 튜링 완전
Source: Hacker News
계산 모델 매핑
Minsky 레지스터 머신은 두 개의 무한 카운터와 라벨이 붙은 유한 개의 명령만 필요합니다:
INC r; goto SDEC r; if r == 0 goto S else goto S'
일반 영어로 풀어보면:
- 레지스터 R을 증가시키고, 그 다음 상태 S로 이동
- 레지스터 R을 감소시킨다; R가 0이면 제로‑상태 S로, 아니면 비‑제로‑상태 S’로 이동
레지스터 A의 값을 레지스터 B에 더하는 Minsky 프로그램은 다음과 같습니다:
1. DEC A; if A == 0 goto 3 else goto 2
2. INC B; goto 1
3. HALT
Minsky는 이 모델이 튜링 완전함을 1967년에 증명했습니다. 따라서 이를 Jira 자동화 언어로 구현하면 환원성을 입증하게 됩니다.
Jira 로 매핑
| Minsky Machine | Jira |
|---|---|
| 레지스터 A | Bug 유형의 연결된 이슈 수 |
| 레지스터 B | Task 유형의 연결된 이슈 수 |
| 프로그램 카운터 | 단일 Epic 이슈의 상태 |
| 디스패치 테이블 | 각 명령 상태마다 하나씩 존재하는 Jira Automation 규칙 |
| 클록 | 자동화에 의해 트리거되는 전이, 혹은 체인 한계 초과 시 외부 재트리거 |
Epic의 상태가 현재 명령을 인코딩합니다. 자동화 규칙은 연결된 이슈 수를 검사하고 다음 상태를 결정합니다. INC와 DEC는 해당 유형의 연결 이슈를 생성하거나 삭제함으로써 구현됩니다. 조건 분기는 JQL‑조건 규칙을 사용해 구현됩니다.
구현: 덧셈
아래는 하나의 에픽, 연결된 이슈, 그리고 각 명령 상태마다 하나의 자동화 규칙(공간 설정 → 자동화)을 사용한 최소 작업 구현 예시입니다.
1. 워크플로우 생성
BACKLOG, TODO, DEV, PROD 상태를 가진 Jira 워크플로우를 만들고, 모든 상태가 서로 전환될 수 있도록 설정합니다. BACKLOG 상태의 에픽을 하나 생성합니다.
2. TODO용 규칙 생성
논리: DEC A; if A = 0 halt, else goto DEV.
- 트리거: 에픽 상태가
TODO로 변경될 때. - 조건: 연결된 버그가 하나라도 존재하면: 버그 하나를 삭제하고 에픽을
DEV로 전환. - 그 외: 에픽을
PROD로 전환(중단).
3. DEV용 규칙 생성
논리: INC B; goto TODO.
- 트리거: 에픽 상태가
DEV로 변경될 때. - 동작: 새로운 작업(Task)을 생성하고 에픽에 연결.
- 전환: 에픽을
TODO로 전환.
두 규칙 모두 “Allow rule to trigger other rules”(다른 규칙을 트리거하도록 허용) 옵션이 활성화되어 있습니다.

4. 레지스터 초기화
에픽에 버그 2개(A = 2)와 작업 3개(B = 3)를 연결합니다.
5. 머신 부트스트랩
에픽을 TODO 로 전환하여 연쇄 작동을 시작합니다. 전환 순서는 다음과 같습니다:
(2,3) TODO →
(1,3) DEV →
(1,4) TODO →
(0,4) DEV →
(0,5) TODO →
(0,5) PROD
실제 *.atlassian.net 인스턴스에서 기록된 내용입니다.
에픽은 PROD 상태에서 버그 0개와 작업 5개가 연결된 상태로 종료됩니다—즉, 2 + 3 = 5라는 정확한 합계가 됩니다.
세 상태의 피보나치
위의 감소는 튜링‑완전성을 증명하기에 충분합니다. Jira의 자동화 언어는 편리한 “Convert Issue Type” 액션도 제공합니다(예: Bug → Story, Story → Task). 이 CONVERT 연산은 DEC + INC 로 표현할 수 있으며, 계산 능력을 확장하지는 않지만 디스패치 테이블을 크게 축소합니다.
세 개의 레지스터(A = Bug, B = Task, C = Story)와 세 개의 명령 상태(TODO, QA, DEV)를 사용하는 피보나치 생성기는 다음과 같이 작성할 수 있습니다:
TODO:
if any linked Task exists:
CONVERT Task → Story
INC Bug
transition to TODO
else:
transition to QA
QA:
if any linked Bug exists:
CONVERT Bug → Task
transition to QA
else:
transition to DEV
DEV:
if any linked Story exists:
CONVERT Story → Bug
transition to DEV
else:
transition to TODO
A = 1, B = 1, C = 0으로 시작하면, Task 카운트(B)가 1, 1, 2, 3, 5, 8, 13, … 의 수열을 생성합니다.
덧셈 기계와 달리 피보나치 기계는 종료 상태가 없으며, Jira Cloud의 체인 깊이 제한(10)이 발생할 때까지 실행됩니다. 제한에 도달하면 운영자가 에픽을 다시 트리거하여 계속 진행합니다. 상태를 한 번 편집하면 전체 흐름이 다시 시작됩니다. Jira Data Center는 automation.rule.execution.timeout 및 관련 설정 가능한 속성을 통해 동일한 제한을 노출합니다.
결론
Jira의 자동화 언어는 무제한 이슈 생성 및 규칙 실행이 주어지면 두 개 카운터 기계를 인코딩할 수 있습니다. 물리적 컴퓨터는 유한하기 때문에 Jira Cloud의 제한된 할당량이 이 구성을 부정하지는 않습니다. “무제한”이 “이론적인 한계가 없음”을 의미한다는 표준 관례에 따르면, Jira는 튜링 완전합니다.
따라서 복잡한 Jira 자동화가 프로그램처럼 느껴진다면, 그것은 실제로 프로그램이기 때문입니다.