Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@ jobs:
steps:
- uses: actions/checkout@v5

# Matches the tested runtime and `engines.node` — publishing must not run
# on a version the suite never exercises (this was node 20, which is EOL).
# Kept as a floating major for the same reason as test.yml: it tracks the
# latest 24.x, so it picks up 24.20.0 (the node:test deserialization fix)
# and later security patches without a manual bump.
- uses: actions/setup-node@v5
with:
node-version: 20
node-version: 24

# A tag on a commit whose manifests were never bumped would publish a
# release that does not match what the plugin reports as its version.
Expand Down
29 changes: 26 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,22 @@ jobs:
runs-on: ubuntu-latest
strategy:
fail-fast: false
# Single entry on purpose. Node 18 (EOL 2025-04-30) and 20 (EOL 2026-04-30)
# were both past end-of-life, and the node:test runner bug that made this
# suite flake (nodejs/node#64061 — the result-payload length was read as a
# signed int) is never reaching them. The fix landed in 26.7.0 and was
# backported to the v24 line only; v22 did not get it, so adding "22 for
# LTS coverage" would reintroduce the flake rather than broaden coverage.
# `24` resolves to the latest 24.x. NOTE: as of 2026-08-25 that is 24.19.0,
# which does NOT yet carry the fix — it ships in 24.20.0 (2026-08-26), and
# this job picks it up automatically once released. Until then this matrix
# buys the EOL escape, not the flake fix; the run's actual runtime is
# annotated below so which one a given run used is answerable after the
# fact rather than assumed. Pinning 24.20.0 here is not possible before it
# exists — setup-node fails to resolve an unreleased version.
# Add versions back here when they are both supported and carry the fix.
matrix:
node: [18, 20]
node: [24]
Comment thread
hsleedevelop marked this conversation as resolved.
Resolved
steps:
- uses: actions/checkout@v5

Expand Down Expand Up @@ -40,6 +54,10 @@ jobs:
# for a timing flake is the numbers from the runs that passed.
- name: Run tests
run: |
# Which runtime actually ran decides whether this run could still hit
# the node:test deserialization bug (nodejs/node#64061, fixed in
# 24.20.0), so record it rather than infer it from the matrix entry.
printf '::notice::runtime %s\n' "$(node -v)"
set +e
npm test 2>&1 | tee test-output.txt
status="${PIPESTATUS[0]}"
Expand All @@ -52,9 +70,14 @@ jobs:
done
return 0
}
grep -E '^# spawn floor' test-output.txt | annotate notice || true
# Match on content, not on a reporter prefix: node <=20 defaults to the
# TAP reporter ("# diagnostic", "not ok 1 - name", " error: '...'")
# while node >=22 defaults to spec ("i diagnostic", "x name",
# "AssertionError [ERR_ASSERTION]: ..."). Anchoring on "^# " silently
# produced empty annotations the first time this ran on node 24.
grep -E 'spawn floor .*equal-work baseline' test-output.txt | annotate notice || true
if [ "$status" -ne 0 ]; then
grep -E '^not ok |error: |exceeded the absolute ' test-output.txt \
grep -E '^not ok |^✖ |AssertionError|^ *error: |exceeded the absolute ' test-output.txt \
| head -40 | annotate error || true
fi
exit "$status"
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,24 @@ modified: 2026-08-21

## [Unreleased]

### Changed
- **BREAKING: 최소 Node 버전을 18 → 24로 올렸다** (`engines.node: ">=24"`, task
`node-test-runner-flake`). 두 가지가 겹친 결과다. ① Node 18(2025-04-30)·20(2026-04-30)이
**둘 다 지원 종료**라 CI가 EOL 런타임만 시험하고 있었고, 릴리스 발행 job도 node 20에서
돌고 있었다. ② `node:test` 러너의 결과 payload 길이를 **부호 있는 정수로 읽는 버그**
(nodejs/node#64061)가 CI를 간헐적으로 빨갛게 만들었는데, 수정(nodejs/node#64706)은
26.7.0에 들어간 뒤 **v24 라인에만 백포트**됐다 — v22는 활성 LTS인데도 받지 못했다.
그래서 "활성 LTS 두 개(22·24)"가 아니라 **24 단독**이다. 22를 넣으면 flake가 되돌아온다.
- CI 테스트 matrix를 `[18, 20]` → `[24]`로, 릴리스 발행 런타임을 20 → 24로 옮겼다.
README·`docs/prerequisites.md`의 "Node.js ≥ 18" 서술도 함께 갱신했다.

### Notes
- 이 수정이 실제로 flake를 없애는 것은 **Node 24.20.0(2026-08-26) 이후**다. `node-version: 24`는
최신 24.x로 해석되는데, 그 이전 최신인 24.19.0에는 아직 백포트가 반영돼 있지 않다.
- CI 워크플로우가 테스트 출력을 **annotation으로 되돌린다** — 이 저장소를 유지보수하는
머신은 raw CI 로그를 받을 수 없어(blob storage 403) `gh run view --log-failed`가 실패한다.
`gh api repos/<owner>/<repo>/check-runs/<job_id>/annotations`로 읽는다.

## [0.18.1] - 2026-08-22

### Added
Expand Down
2 changes: 1 addition & 1 deletion MAINTAINING.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,5 +232,5 @@ README에서 이 문서를 연결해 실제 독자가 도달할 수 있게 합
## 참고

- 테스트: `tests/` 디렉토리, Node.js 내장 `node:test` 사용
- 외부 의존성 없음 — Node.js 18+ 표준 라이브러리만 사용
- 외부 의존성 없음 — Node.js 24+ 표준 라이브러리만 사용 (`package.json`의 `engines.node`와 일치)
- 커밋 메시지는 한국어 + Conventional Commits 형식 (`feat/fix/chore/docs/refactor`)
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,13 +163,13 @@ cd my-project

## 사전 준비

**하드 요구사항은 Node.js ≥ 18 하나뿐입니다** (`engines.node`, 런타임 npm 의존성 0개).
**하드 요구사항은 Node.js ≥ 24 하나뿐입니다** (`engines.node`, 런타임 npm 의존성 0개).
Comment thread
hsleedevelop marked this conversation as resolved.
Resolved
나머지는 "있으면 켜지고 없으면 그 기능만 꺼지는" 능력 매트릭스입니다.
`git` 아래 다섯 개는 `harness-team doctor`가 런타임에 유무를 확인해 줍니다.

| 도구 | 없으면 |
|---|---|
| Node.js ≥ 18 | `harness-team` CLI가 실행되지 않음 — 유일한 하드 요구사항 |
| Node.js ≥ 24 | `harness-team` CLI가 실행되지 않음 — 유일한 하드 요구사항 |
| `jq` | Claude Code 훅이 **저정밀 모드**로 판정 — 차단은 유지되지만 정확도가 떨어짐. 다른 넷과 달리 doctor가 `warning`으로 알림 |
| `git` | CLI는 동작하되 post-commit handoff·summary 브랜치 감지·task 전환 diff가 no-op |
| `gh` | `/harness-ship` 이후 **사용자가 직접 여는** PR 단계용 — 하네스 명령은 영향 없음 |
Expand Down
Loading
Loading