Jira는 튜링 완전

발행: (2026년 5월 25일 PM 12:54 GMT+9)
7 분 소요

Source: Hacker News

Source: https://esolangs.org/wiki/Minsky_machine

계산 모델 매핑

Minsky 레지스터 머신은 두 개의 무한 카운터와 라벨이 붙은 유한 개의 명령만 필요합니다:

  • INC r; goto S
  • DEC 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 MachineJira
레지스터 ABug 유형의 연결된 이슈 수
레지스터 BTask 유형의 연결된 이슈 수
프로그램 카운터단일 Epic 이슈의 상태
디스패치 테이블각 명령 상태마다 하나씩 존재하는 Jira Automation 규칙
클록자동화에 의해 트리거되는 전이, 혹은 체인 한계 초과 시 외부 재트리거

Epic의 상태가 현재 명령을 인코딩합니다. 자동화 규칙은 연결된 이슈 수를 검사하고 다음 상태를 결정합니다. INCDEC는 해당 유형의 연결 이슈를 생성하거나 삭제함으로써 구현됩니다. 조건 분기는 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”(다른 규칙을 트리거하도록 허용) 옵션이 활성화되어 있습니다.

Addition 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 자동화가 프로그램처럼 느껴진다면, 그것은 실제로 프로그램이기 때문입니다.

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.