aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/design/018-lifetimes-and-computation.md3
-rw-r--r--docs/research/118-computing-in-one-event.md90
-rw-r--r--research/experiments/033-computing/2026-10-04-mac.jsonl46
-rw-r--r--research/experiments/033-computing/2026-10-04-wsl.jsonl46
-rwxr-xr-xresearch/experiments/033-computing/record.py6
5 files changed, 187 insertions, 4 deletions
diff --git a/docs/design/018-lifetimes-and-computation.md b/docs/design/018-lifetimes-and-computation.md
index 1aad50f..b27c13a 100644
--- a/docs/design/018-lifetimes-and-computation.md
+++ b/docs/design/018-lifetimes-and-computation.md
@@ -1,7 +1,8 @@
# 018 — 상태의 수명과 메모리 안의 계산
작성일: 2026-10-04. 상태: 설계와 착수 기준. 1단계(transient) 구현, 검사로 고정하고 쟀다
-([117](../research/117-transient-states.md)).
+([117](../research/117-transient-states.md)). 2단계(핸들러의 계산) 구현, 검사로 고정하고 쟀다
+([118](../research/118-computing-in-one-event.md)).
[외부 리뷰 005](../outside-feedback/feedback-005.md)의 (1) "순수 인메모리 연산 및 알고리즘의 단절"과, 상태의 영속성과 상태성을 aup
안에서 정할 수단이 필요하다는 요청에서 시작한다.
diff --git a/docs/research/118-computing-in-one-event.md b/docs/research/118-computing-in-one-event.md
new file mode 100644
index 0000000..daf7eba
--- /dev/null
+++ b/docs/research/118-computing-in-one-event.md
@@ -0,0 +1,90 @@
+# 118 — 한 이벤트 안의 계산
+
+2026-10-04. [018](../design/018-lifetimes-and-computation.md)의 2단계(핸들러의 계산)를 잰다. 기준은 구현하기 전에 018에 적어
+커밋했다(`4d93488`).
+
+- 바꿀 결정: 핸들러에 이벤트의 리스트, 세는 반복, `break`, 중첩을 두고 모든 앱에 기본 예산을 둘지.
+- 통과 조건(RAM의 Pi 5): 지금의 앱(TPC-C, 은행 질의)이 전과 후 번갈아 여섯 쌍에서 3% 넘게 느려지지 않고 은행 질의의 명령 수가
+ 1% 넘게 늘지 않는다. 노드 10만 개, 간선 100만 개의 BFS가 기본 예산 안에 든다(그 시간을 C, CPython과 견주어 밝힌다).
+
+## 쉬운 말로
+
+- **통과했다.** aup로 BFS, DFS, 다익스트라, 뉴턴 반복, 배낭 문제를 쓸 수 있다. 큐와 방문 집합은 이벤트의 리스트(`let seen: list of
+ Seen by node`)이고, 반복은 세는 `for`와 `break`, 걷기 안의 걷기다.
+- 노드 10만 개, 간선 100만 개의 그래프에서 BFS 한 번이 한 이벤트로 **396 ms**다. 같은 일을 CPython은 441 ms, C는 9 ms에 한다.
+ Pure의 바이트코드 실행기는 C의 44배이고 CPython보다 조금 빠르다.
+- 지금의 앱에는 거의 값이 없다. TPC-C가 1.7% 느려졌고(기준 3% 안), 은행 질의의 명령 수는 1% 안에서 같다.
+- 끝나지 않는 반복은 이제 끝난다. 예산 없이 띄운 호스트에서도 세기만 하는 반복은 1.4초 만에 `work`로, 저장되는 리스트를 채우는
+ 반복은 1.5초 만에 `memory`로 실패하고 아무것도 바꾸지 않는다. 그동안 호스트의 메모리 정점은 263 MiB 늘었다(기준 300 MiB).
+- 같은 계산이 Pi, WSL2(x86_64), M3 Mac에서 같은 결과를 낸다. 모듈 바이트도 같다.
+
+## 결과
+
+원시 결과와 명령은 [033-computing](../../research/experiments/033-computing/)에 있다(`runs.sh`).
+
+### 지금의 앱 (전 `850f783`, 후 `7a6cdba`)
+
+026과 같게 TPC-C(RAM, W=1, 64터미널, 20초)와 은행 질의를 전과 후 번갈아 여섯 라운드 쟀다(`pairs.py`).
+
+| | 전 | 후 | 바뀜 |
+|---|---:|---:|---:|
+| TPC-C 중앙값(초당 트랜잭션) | 43,108 | 42,369 | −1.7% |
+| TPC-C의 트랜잭션당 CPU(µs) | 44.3 | 44.8 | |
+| per_branch(ms) | 5.25 | 5.27 | +0.4% |
+| in_credit(ms) | 0.86 | 0.85 | −1.2% |
+| large(ms) | 0.385 | 0.385 | 0 |
+| ranks(ms) | 6.74 | 6.80 | +0.8% |
+
+TPC-C는 여섯 라운드 모두 후가 같거나 낮았다(0에서 −4.1%). 흔들림만은 아니다. 지금의 이벤트에 더해진 일은 넷이다: 실행량 예산이
+늘 있어 세는 일(전에는 예산이 없으면 세지 않았다), 이벤트마다 자람의 셈을 0으로 두는 일, 리스트와 text를 바꿀 때마다 크기 둘을
+읽어 더하는 일, 걷기마다 `break`를 보는 일. 은행 질의의 명령 수(025의 `count.py`, 두 번씩)는 0.6% 안에서 오르내린다(field +0.7%,
+found +0.6%, per_branch −0.5%).
+
+### BFS 한 번 (노드 100,000, 간선 1,000,000)
+
+`bfs.py`: 무작위 그래프(시드 118)를 `graph.aup`에 행으로 넣고, 무작위 출발 다섯 곳에서 BFS를 다섯 번씩 한다. Pure는 요청 하나가
+이벤트 하나다(유지된 연결에서 클라이언트가 잰 요청 시간, 거의 모두가 이벤트다). C(`bfs.c`, 인접을 오프셋 배열로)와 CPython(리스트와
+deque)이 같은 탐색을 한다. 세 쪽의 거리와 닿은 노드 수(99,996)가 모두 같다.
+
+| 중앙값 | C | CPython | Pure |
+|---|---:|---:|---:|
+| BFS 한 번 | 8.96 ms | 441 ms | 396 ms |
+
+Pure의 BFS 한 번은 실행량으로 약 2,300만 명령이다(노드마다 반복 블록과 그 노드의 간선 조각). 기본 예산(2^28)의 10분의 1이 안 된다.
+
+### 끝나지 않는 반복 (`tests/check.py`의 `server_runaway`, 예산 없는 `pure-serve`)
+
+| 반복 | 끝 | 걸린 시간 | 메모리 정점이 는 양 |
+|---|---|---:|---:|
+| `for i in 0 .. 1e15 { count = count + 1 }` | `work` | 1.4 s | 0 MiB |
+| `for i in 0 .. 1e15 { xs.append(R { n: i }) }` (저장되는 리스트) | `memory` | 1.5 s | 263 MiB |
+| `let ys: list of R` 에 같은 반복 | `limit` (리스트의 항목 수 한도 2^24) | 3.2 s | 163 MiB |
+
+셋 모두 상태를 바꾸지 않았고, 호스트는 뒤의 요청에 답했다. 이벤트의 리스트는 저장 기록과 되돌리기 기록이 없어서 256 MiB의 몫보다
+리스트의 항목 수 한도가 먼저 왔다.
+
+### 검사
+
+- `test-module`의 `loops`: LOOP(정수가 아닌 경계는 `limit`, 빈 범위, i64의 끝 근처), 여러 깊이의 `break`, 같은 리스트를 도는 걷기
+ 안의 걷기, 키 있는 이벤트의 리스트(이벤트마다 비어서 시작한다), 기본 예산의 `work`(빈 블록의 반복도 센다), 기본 몫과 예산의
+ `memory`, 검증기의 거절 8가지(반복 밖의 BREAK, 값이 남은 BREAK, 반복 안으로의 분기, 타입, 인자, 두 가지로 쓰인 칸, 바깥 걷기의
+ 리스트에 넣기, 9겹)와 8겹은 받아들이는 것.
+- aup `tests/check.py`의 `computing`: 무작위 그래프 20개에서 질의마다 BFS, DFS(스택, 방문 순서까지), 다익스트라가 Python 모델과
+ 같다(600번). 뉴턴의 제곱근 200개가 같은 순서로 계산한 Python의 binary64와 비트까지, 단계 수까지 같다. 배낭 문제 100개가 동적
+ 계획법 모델과 같다. 진단 14건(반복 밖의 `break`, 블록 안의 리스트 `let`, 세는 이름에 대입, 바깥 걷기의 리스트에 넣기와 지우기,
+ 같은 이름의 다른 리스트, 한 이벤트의 두 핸들러, 9겹, …).
+- 기기 사이(`record.py`, 029의 기록 방식): 위 두 검사의 `pure-run` 46번이 Pi, WSL2, M3 Mac에서 출력, 오류, 종료 코드까지 모두 같고,
+ 그 모듈 넷의 바이트가 같다.
+
+## 판정
+
+- **018의 2단계는 들어간다.** 무거운 계산을 앱 밖으로 내보내지 않고 aup 안에서 쓸 수 있다. 모든 반복은 시작할 때 횟수의 상한을 갖고,
+ 모든 이벤트는 실행량 예산과 메모리 몫 안에서 끝난다.
+- 바이트코드 실행기의 속도는 CPython 수준이다. C의 수십 배라는 것은 005의 3장이 말한 대로이고, 그것을 줄이는 일(명령 디스패치,
+ 키로 찾기)은 따로 잰다.
+
+## 다음
+
+- 018의 3단계: 보기의 본문. 읽기만 하는 계산(경로 찾기)을 스냅숏에서 돌려 소유자를 막지 않는다.
+- 실행기의 BFS 한 걸음 값: 노드마다 키 있는 리스트를 반씩 나눠 찾는 일(`seen.has`, `seen[q.node]`, 간선 조각의 경계)이 대부분일 것이다.
+ 재지 않았다.
diff --git a/research/experiments/033-computing/2026-10-04-mac.jsonl b/research/experiments/033-computing/2026-10-04-mac.jsonl
new file mode 100644
index 0000000..d8dd4cb
--- /dev/null
+++ b/research/experiments/033-computing/2026-10-04-mac.jsonl
@@ -0,0 +1,46 @@
+{"module": "3db244824ba7031c8b15e074", "args": "de56dc3eef8a5879b1c0e11a", "input": "6f6f723b5b2b1d073eb31852", "output": "e05288002c2ec7e0a979331d", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "3db244824ba7031c8b15e074", "args": "d8828156ecd65e60e45b9a28", "input": "fbe8479cede4e0169db5bd3c", "output": "a48a5acdc64afac3703801e1", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 1}
+{"module": "3db244824ba7031c8b15e074", "args": "d8828156ecd65e60e45b9a28", "input": "014589aeac0c2073e4109988", "output": "0757b2550090a207b981ff59", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "3db244824ba7031c8b15e074", "args": "663f78393fb6b01805134031", "input": "e90023d1c1a98fe8f29c66f7", "output": "64de5f760484771e029ee2db", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "79473d03be4f37825d643bb4", "args": "663f78393fb6b01805134031", "input": "014589aeac0c2073e4109988", "output": "f0e31911d6426fdd54119699", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "c1ecc4ee7ec90bcfb37001e5", "output": "7687c6324ed99800152e62a2", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "bc80367cc7d4d60ffc4e05c4", "output": "8cd7eb75796d7a6efd33de89", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "d65dcc87d1865446ad58251f", "output": "1acd13840aaab0671bcfff68", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "df61ae91b0dbbeec3ed32244", "output": "e306e235e47e00771bd2be19", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "dd919ae0468a05b23e0d9a9f", "output": "f6aa1936ffa9c2a9d7f90877", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "ea70cf4efe51953ab5587d5d", "output": "90977584e9f5458f75bbf95e", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "3aefbeb6b32cde88a4d13a13", "output": "4014b80ae105b7371ab9f86b", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "b87783732f62e8a5916f40f9", "output": "f5067bc7953b52aa38c75732", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "06048f543c44e9549aed5380", "output": "fc81784c19628326d6009e39", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "ea116d584f758ba6643016ae", "output": "79cf55b6f73a47b572fb5a54", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "d54f58115e3ef8dcbe085440", "output": "5b098766216c7f95d3a37eb3", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "9451d0c2d1168269fcf5f6fc", "output": "c63926a084c13db61b723a6e", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "b982935d7df6090f979d91ea", "output": "2ce042ed845daccfd894d9b4", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "61f7bf6528b1c1c4e8f113bb", "output": "b11aab75a2b33defc65d460e", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "e4dfd4dd17162dd382a60fcb", "output": "5302cb0df0bda944fb238fd7", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "8ede060b3e50523fddc7daf5", "output": "8c5352aa150c7e4891168c67", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "481c8e83fbf3ebb98b86f070", "output": "31d56b67e741322c29b1d7ec", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "de6975a552e9a8cb4036adb5", "output": "3dac9ebfc7d6f70e017aab53", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "9fe8659271f0e6fa006c5235", "output": "f5bd5e67a817030412923cd1", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "0a25f97536d9e82b5be07462", "output": "d1bbc90911792537138e5c03", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "4e046a7ed3cb40cc45d342eb", "output": "58a23d31f2781d2f9bb2efbe", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "dafce720362e20839691889a", "output": "ff6c52a25ce9ac14d61a8dd5", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "2c9ac77bc25fd11242f090a9", "output": "60ebabf1c5b5ba8963ba4509", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "9a02ebff2ce0b0729c073f84", "output": "6ef16fbb1a168b614898a77a", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "324e1b1ae84a7c5b7e0596ee", "output": "ad7cacb4845afa5b44060f54", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "fb3fdcb9bdeb303155f218c6", "output": "cfcb6cfa6005abf164d2b98c", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "260689f601f2ca1dbd7256d0", "output": "4245812252c260663c517479", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "f8ff5b14a7522493e3fb4e3b", "output": "20bffe8f65f93892017f36da", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "d69318266dc2c0526e05c15c", "output": "81b9ba6fbba20f22b1e8d197", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "91e5f193246627baee0a07b7", "output": "7501730ba25d2002ead09501", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "528afe05244d3f32c85ef88c", "output": "09bf07fc366c3707a9675b78", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "f51c23204014b3fa4d88668b", "output": "7a39d656b909502e91cf6a6d", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "cc0eaec10a4008f94cdc9bc3", "output": "69de8aa2e33c37027fd84085", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "b92d0ffda49d48f835a04563", "output": "6592523d8473a0d17ca77ec6", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "643a678d8d2a6fe9119d9521", "output": "0dd05cba6541524e5499df56", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "76d8851c1dab1804580417bd", "output": "d4b4ec037169e878d6e426f7", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "995364b7939d20833d5d279a", "output": "eb2ef6f2415e4d96b79623a4", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "4829b1e000ae4e2d97943b29", "output": "fdf1755aa176fecd8fbe65c3", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "4ef89ebfe266ab1dfb3f38b3", "output": "02f6b9e2bb1bfb6ce3ed8cdd", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "172a13c29dabde5000f2995f", "output": "26086a0ff7f1123c758d0938", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "88c83ecba368c17afcef40f7", "output": "911c65754a642979d61bb51b", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
diff --git a/research/experiments/033-computing/2026-10-04-wsl.jsonl b/research/experiments/033-computing/2026-10-04-wsl.jsonl
new file mode 100644
index 0000000..d8dd4cb
--- /dev/null
+++ b/research/experiments/033-computing/2026-10-04-wsl.jsonl
@@ -0,0 +1,46 @@
+{"module": "3db244824ba7031c8b15e074", "args": "de56dc3eef8a5879b1c0e11a", "input": "6f6f723b5b2b1d073eb31852", "output": "e05288002c2ec7e0a979331d", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "3db244824ba7031c8b15e074", "args": "d8828156ecd65e60e45b9a28", "input": "fbe8479cede4e0169db5bd3c", "output": "a48a5acdc64afac3703801e1", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 1}
+{"module": "3db244824ba7031c8b15e074", "args": "d8828156ecd65e60e45b9a28", "input": "014589aeac0c2073e4109988", "output": "0757b2550090a207b981ff59", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "3db244824ba7031c8b15e074", "args": "663f78393fb6b01805134031", "input": "e90023d1c1a98fe8f29c66f7", "output": "64de5f760484771e029ee2db", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "79473d03be4f37825d643bb4", "args": "663f78393fb6b01805134031", "input": "014589aeac0c2073e4109988", "output": "f0e31911d6426fdd54119699", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "c1ecc4ee7ec90bcfb37001e5", "output": "7687c6324ed99800152e62a2", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "bc80367cc7d4d60ffc4e05c4", "output": "8cd7eb75796d7a6efd33de89", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "d65dcc87d1865446ad58251f", "output": "1acd13840aaab0671bcfff68", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "df61ae91b0dbbeec3ed32244", "output": "e306e235e47e00771bd2be19", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "dd919ae0468a05b23e0d9a9f", "output": "f6aa1936ffa9c2a9d7f90877", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "ea70cf4efe51953ab5587d5d", "output": "90977584e9f5458f75bbf95e", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "3aefbeb6b32cde88a4d13a13", "output": "4014b80ae105b7371ab9f86b", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "b87783732f62e8a5916f40f9", "output": "f5067bc7953b52aa38c75732", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "06048f543c44e9549aed5380", "output": "fc81784c19628326d6009e39", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "ea116d584f758ba6643016ae", "output": "79cf55b6f73a47b572fb5a54", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "d54f58115e3ef8dcbe085440", "output": "5b098766216c7f95d3a37eb3", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "9451d0c2d1168269fcf5f6fc", "output": "c63926a084c13db61b723a6e", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "b982935d7df6090f979d91ea", "output": "2ce042ed845daccfd894d9b4", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "61f7bf6528b1c1c4e8f113bb", "output": "b11aab75a2b33defc65d460e", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "e4dfd4dd17162dd382a60fcb", "output": "5302cb0df0bda944fb238fd7", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "8ede060b3e50523fddc7daf5", "output": "8c5352aa150c7e4891168c67", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "481c8e83fbf3ebb98b86f070", "output": "31d56b67e741322c29b1d7ec", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "de6975a552e9a8cb4036adb5", "output": "3dac9ebfc7d6f70e017aab53", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "9fe8659271f0e6fa006c5235", "output": "f5bd5e67a817030412923cd1", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "fa638e24673f7cd2e7da3457", "args": "7ca4a61d7a886da987496de4", "input": "0a25f97536d9e82b5be07462", "output": "d1bbc90911792537138e5c03", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "4e046a7ed3cb40cc45d342eb", "output": "58a23d31f2781d2f9bb2efbe", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "dafce720362e20839691889a", "output": "ff6c52a25ce9ac14d61a8dd5", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "2c9ac77bc25fd11242f090a9", "output": "60ebabf1c5b5ba8963ba4509", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "9a02ebff2ce0b0729c073f84", "output": "6ef16fbb1a168b614898a77a", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "324e1b1ae84a7c5b7e0596ee", "output": "ad7cacb4845afa5b44060f54", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "fb3fdcb9bdeb303155f218c6", "output": "cfcb6cfa6005abf164d2b98c", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "260689f601f2ca1dbd7256d0", "output": "4245812252c260663c517479", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "f8ff5b14a7522493e3fb4e3b", "output": "20bffe8f65f93892017f36da", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "d69318266dc2c0526e05c15c", "output": "81b9ba6fbba20f22b1e8d197", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "91e5f193246627baee0a07b7", "output": "7501730ba25d2002ead09501", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "528afe05244d3f32c85ef88c", "output": "09bf07fc366c3707a9675b78", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "f51c23204014b3fa4d88668b", "output": "7a39d656b909502e91cf6a6d", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "cc0eaec10a4008f94cdc9bc3", "output": "69de8aa2e33c37027fd84085", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "b92d0ffda49d48f835a04563", "output": "6592523d8473a0d17ca77ec6", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "643a678d8d2a6fe9119d9521", "output": "0dd05cba6541524e5499df56", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "76d8851c1dab1804580417bd", "output": "d4b4ec037169e878d6e426f7", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "995364b7939d20833d5d279a", "output": "eb2ef6f2415e4d96b79623a4", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "4829b1e000ae4e2d97943b29", "output": "fdf1755aa176fecd8fbe65c3", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "4ef89ebfe266ab1dfb3f38b3", "output": "02f6b9e2bb1bfb6ce3ed8cdd", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "172a13c29dabde5000f2995f", "output": "26086a0ff7f1123c758d0938", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
+{"module": "770a9bded98908db97e56858", "args": "6949bab2263fede197bb7234", "input": "88c83ecba368c17afcef40f7", "output": "911c65754a642979d61bb51b", "errors": "e3b0c44298fc1c149afbf4c8", "exit": 0}
diff --git a/research/experiments/033-computing/record.py b/research/experiments/033-computing/record.py
index 7450fa6..3bb6a9e 100755
--- a/research/experiments/033-computing/record.py
+++ b/research/experiments/033-computing/record.py
@@ -4,7 +4,7 @@ computing: the examples routes.aup and numbers.aup against their models),
each recorded by 029's recorded-pure-run, so two machines' records compare
run by run (029's compare.py).
-record.py AUP_ROOT PURE_ROOT OUT.jsonl the checks' report on stdout"""
+record.py AUP_ROOT PURE_ROOT OUT.jsonl the checks' report on stdout (MAKE: the make to build with)"""
import importlib.util
import json
import os
@@ -14,8 +14,8 @@ import tempfile
from pathlib import Path
aup_root, pure_root, out = (Path(a).resolve() for a in sys.argv[1:4])
-subprocess.run(['make', '-s', '-C', str(pure_root), 'build/pure-run'], check=True)
-subprocess.run(['make', '-s', '-C', str(aup_root), 'build/aup'], check=True)
+subprocess.run([os.environ.get('MAKE', 'make'), '-s', '-C', str(pure_root), 'build/pure-run'], check=True)
+subprocess.run([os.environ.get('MAKE', 'make'), '-s', '-C', str(aup_root), 'build/aup'], check=True)
out.unlink(missing_ok=True)
os.environ['PURE_RUN'] = str(pure_root / 'build' / 'pure-run')
os.environ['PURE_RUN_LOG'] = str(out)