변경 이력

책과 그 도구의 주요 변경이다. 최신 항목이 맨 위에 있다. 날짜는 ISO 8601(YYYY-MM-DD)을 쓴다.

[Unreleased]

Changed

  • 네덜란드어(nl-nl): 주제 9.0, 9.3, 9.4에 남아 있던 영어 제목과 슬러그를 번역했다(bijlagen, controlelijsten, sjablonen).
  • 웨일스어(cy-001, cy-gb): 용어를 TermCymru에 맞췄다. risg(위험, perygl 대신, 성 일치 포함), cyfnewidiad(트레이드오프), dangosydd rhagfynegi와 dangosydd ôl-fynegi(선행 지표와 후행 지표, hwyrfrydig 대신), cynhwysedd(용량), dosraniad(분포), cydberthynas(상관), 주제 1.3의 산출물에 allbwn, cyfradd gadael staff(이직률). 일치시키려고 주제 슬러그 네 개의 이름을 바꿨다.
  • 사이트: @lilydesignsystem/svelte-picker-bar를 0.2.0으로 올렸다. 헤더 바에 검색 피커가 추가되며, 기존 /?<query> 사이트 검색으로 제출한다.
  • scripts/generate-sitemap.mjs를 추가했다. pnpm build의 끝에서 실행되어 미리 렌더링한 페이지로 sitemap.xml을 쓴다 (정규 로케일 URL만, 두 글자 별칭 중복 없음). 이로써 robots.txt의 Sitemap: 줄이 해결된다.
  • AGENTS.md는 이제 짧은 색인이다. 세부는 AGENTS/layout.md, style.md, locales.md, workflow.md로 옮겼다.
  • 문서 정리: 27개 로케일, 로케일별 섹션 디렉터리 이름, 새 도구에 맞춰 AGENTS.md, index.md, 생성되는 README 로케일 텍스트, spec/index.md, spec/locales.md, 사이트의 AGENTS.md와 README.md를 갱신했다. CLAUDE.md(AGENTS.md를 가리키는 포인터)를 추가하고, 두 에이전트 스킬의 낡은 docs/ 경로를 고치고, skills/를 .claude/skills/의 정본 사본으로 만들었다(테스트가 검사한다).
  • 사이트의 static/에 llms.txt와 llms.json(제공하는 모든 로케일과 주제의 AI 에이전트 색인)을 추가했다. tools/gen_llms.py(just llms)가 생성하고 테스트가 검사한다.
  • 사이트 홈페이지: “아홉 개의 부” 타일 목록을 모든 부와 주제의 “목차” 중첩 목록으로 바꾸고, “굿하트의 법칙, 어디서나” 섹션을 없앴다.
  • 모든 로케일에서 책 본문의 “chapter”를 “topic”으로 바꿨다(예: “주제 2.1”, “이 부의 주제”). 각 언어 고유의 “topic” 단어(tema, sujet, Thema, тема, 主題 등)를 쓰며, 명세, 도구가 생성하는 텍스트, 사이트 UI 문자열에도 적용했다. 파일 이름, URL, 섹션 키는 그대로다.
  • locales/ 아래 모든 섹션 디렉터리 이름을 번역했다. chapters/는 topics/가 되었고(다른 로케일에서는 그 번역어, 예: temas/, sujets/, themen/), es-001의 examples/는 ejemplos/가 되었다. 이름은 spec/section-names.json에 있으며, 도구, 테스트, 사이트의 콘텐츠 동기화가 거기서 읽는다. 사이트 URL은 바뀌지 않는다.

Changed

  • 웨일스어 로케일(cy-001, cy-gb, 동일하게 유지)을 웨일스 정부의 TermCymru 용어 목록과 대조해 개정했다. 웰빙에 llesiant, 생산성에 cynhyrchiant, 취약점에 gwendid/gwendidau, 거버넌스에 llywodraethiant, 상관에 cydberthynas, 백로그에 ôl-groniad(이전에는 영어로 남겨 둠), 비용 편익에 cost a budd, 모든 주제에서 AI를 처음 언급할 때 deallusrwydd artiffisial (AI).

Added

  • 일본어(ja-001), 한국어(ko-001), 네덜란드어(nl-001)를 27번째부터 29번째 완전 번역 로케일로 추가했다. 63개 주제 모두와 나머지 모든 섹션이 있고 대응하는 .locale-peer-id 사이드카를 가지며 내용은 ja-jp, ko-kr, nl-nl과 같다. 사이트에 연결되어 /ja-001/, /ko-001/, /nl-001/(별칭 /ja/, /ko/, /nl/)에서 제공된다.
  • 머리말, 예시, 기여, 프로젝트 섹션(14개 파일과 변경 이력, 홈페이지, 목차)을 이 로케일로 번역했다. 디렉터리 이름도 번역되었다.
  • 독일어(de-001)를 26번째 완전 번역 로케일로 추가했다. 63개 주제 모두에 대응하는 .locale-peer-id 사이드카가 있으며 내용은 de-de와 같다. 사이트에 연결되어 /de-001/(별칭 /de/)에서 제공된다.
  • 포르투갈어(pt-001)를 25번째 완전 번역 로케일로 추가했다. 63개 주제 모두에 대응하는 .locale-peer-id 사이드카가 있으며 내용은 pt-pt와 같다. 사이트에 연결되어 /pt-001/(별칭 /pt/)에서 제공된다.
  • 63개 주제 모두를 우르두어(ur-001, 오른쪽에서 왼쪽)로 처음부터 손으로 완역했다. 24번째 완전 번역 로케일이며 대응하는 .locale-peer-id 사이드카가 있다. 각 주제는 영어 원천에서 직접 번역되었고, 색인(주제 9.7)은 모든 내부 링크를 우르두어 파일 이름으로 다시 매핑하며, 섹션 디렉터리는 موضوعات다. 사이트에 연결되어 /ur-001/(별칭 /ur/)에서 제공된다.
  • 63개 주제 모두를 인도네시아어(id-001)로 처음부터 손으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있다. 바탕이 될 기존 인도네시아어 로케일이 없었으므로 각 주제는 영어 원천에서 직접 번역되었고, 색인(주제 9.7)은 모든 내부 링크를 인도네시아어 파일 이름으로 다시 매핑한다. 사이트에 연결되어 /id-001/(별칭 /id/)에서 제공된다.
  • 러시아어(ru-001)와 중국어(zh-001)를 21번째와 22번째 완전 번역 로케일로 추가했다. 각각 63개 주제 모두에 대응하는 .locale-peer-id 사이드카가 있으며 내용은 ru-ru와 zh-cn과 같다. 사이트에 연결되어 /ru-001/과 /zh-001/(별칭 /ru/와 /zh/)에서 제공된다.
  • 프랑스어(fr-001)를 20번째 완전 번역 로케일로 추가했다. 63개 주제 모두에 대응하는 .locale-peer-id 사이드카가 있으며 내용은 fr-fr과 같다. 사이트에 연결되어 /fr-001/(별칭 /fr/)에서 제공된다.
  • 벵골어(bn-001)를 19번째 완전 번역 로케일로 추가했다. 63개 주제 모두에 대응하는 .locale-peer-id 사이드카가 있으며 내용은 bn-bd와 같다. 사이트에 연결되어 /bn-001/(별칭 /bn/)에서 제공된다.
  • 아랍어(ar-001)를 18번째 완전 번역 로케일로 추가했다. 63개 주제 모두에 대응하는 .locale-peer-id 사이드카가 있으며 내용은 ar-eg와 같다. 사이트에 연결되어 /ar-001/(별칭 /ar/)에서 제공된다.
  • 웨일스어, 영국(cy-gb)을 17번째 완전 번역 로케일로 추가했다. 63개 주제 모두에 대응하는 .locale-peer-id 사이드카가 있으며 내용은 cy-001과 같다(hi-id와 hi-001의 관계와 같다). 사이트의 SERVED_LOCALE_CODES에 연결되어 /cy-gb/에서 제공된다.
  • 63개 주제 모두를 네덜란드어, 네덜란드(nl-nl)로 처음부터 손으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 바탕이 될 기존 네덜란드어 로케일이 없었으므로 각 주제는 영어 원천에서 직접 번역되었다. 색인(주제 9.7)은 ar-eg, bn-bd, ko-kr, es-es, pt-pt, ja-jp, ru-ru, fr-fr, sv-se에서 택한 방식에 따라 모든 내부 주제 링크를 네덜란드어 파일 이름으로 다시 매핑한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 스웨덴어, 스웨덴(sv-se)으로 처음부터 손으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 각 주제는 영어 원천에서 직접 번역되었다. 색인(주제 9.7)은 ar-eg, bn-bd, ko-kr, es-es, pt-pt, ja-jp, ru-ru, fr-fr에서 택한 방식에 따라 모든 내부 주제 링크를 스웨덴어 파일 이름으로 다시 매핑한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 프랑스어, 프랑스(fr-fr)로 처음부터 손으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 각 주제는 영어 원천에서 직접 번역되었다. 색인(주제 9.7)은 ar-eg, bn-bd, ko-kr, es-es, pt-pt, ja-jp, ru-ru에서 택한 방식에 따라 모든 내부 주제 링크를 프랑스어 파일 이름으로 다시 매핑한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 러시아어, 러시아(ru-ru)로 처음부터 손으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 각 주제는 영어 원천에서 직접 번역되었다. 색인(주제 9.7)은 ar-eg, bn-bd, ko-kr, es-es, pt-pt, ja-jp에서 택한 방식에 따라 모든 내부 주제 링크를 러시아어 파일 이름으로 다시 매핑한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 일본어, 일본(ja-jp)으로 처음부터 손으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 각 주제는 영어 원천에서 직접 번역되었다. 색인(주제 9.7)은 ar-eg, bn-bd, ko-kr, es-es, pt-pt에서 택한 방식에 따라 모든 내부 주제 링크를 일본어 파일 이름으로 다시 매핑한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 포르투갈어, 포르투갈(pt-pt)로 처음부터 손으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 각 주제는 영어 원천에서 직접 번역되었다. 색인(주제 9.7)은 ar-eg, bn-bd, ko-kr, es-es에서 택한 방식에 따라 모든 내부 주제 링크를 포르투갈어 파일 이름으로 다시 매핑한다. 아직 사이트에 연결하지 않았다.
  • 스페인어, 스페인(es-es)을 완전 번역 로케일로 추가했다(63개 주제 모두). 기존 스페인어(es-001) 번역의 사본에서 시작했고(점검 결과 이미 문법적으로 중립이었으며 어휘도 대부분 스페인 쪽에 가까웠다), 남은 소수 용법에 대해 표적 용어 점검을 적용했다. 특히 이 책의 인시던트 메트릭 영역에서 “incidente”를 “incidencia”로 바꾸고, 전반에 걸쳐 성 일치를 바로잡았다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 한국어, 한국(ko-kr)으로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 색인(주제 9.7)은 ar-eg와 bn-bd에서 택한 방식에 따라 모든 내부 주제 링크를 한국어 파일 이름으로 다시 매핑한다. 아직 사이트에 연결하지 않았다.
  • 힌디어, 인도(hi-id)를 완전 번역 로케일로 추가했다(63개 주제 모두). 기존 힌디어(hi-001) 번역을 국가가 표시된 로케일 코드 아래에 그대로 복사한 것이다. 표준 힌디어에는 따로 손으로 번역할 인도 고유의 별도 형태가 없기 때문이다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 벵골어, 방글라데시(bn-bd)로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 아랍어, 이집트(ar-eg)로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두를 독일어, 독일(de-de)로 완역했다. 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다. 아직 사이트에 연결하지 않았다.
  • 63개 주제 모두의 완역을 세 로케일에서 마쳤다. 웨일스어(cy-001), 중국어(zh-cn), 힌디어(hi-001)이며, 각각 대응하는 .locale-peer-id 사이드카가 있고 just test가 통과한다.
  • 계획된 번역 로케일 두 개, 웨일스어 - 영국(cy-gb)과 중국어(zh-001)를 spec/locales-for-global-sharing-with-svelte/locales.tsv와 spec/locales.md에 추가했고(계획된 로케일은 열하나에서 열셋으로), zh-cn의 그때까지 미정이던 자칭 표기를 中文으로 확정했다. 사이트의 LOCALE_LABELS에도 대응 항목이 생겼다 (cy-gb: “Cymraeg (Prydain Fawr)“, zh-001: “中文”, zh-cn: “中文 (中国)”). 아직은 인프라뿐이다. 이 로케일들에는 locales/<code>/ 디렉터리도 번역된 내용도 없다.
  • 책을 locales/ 아래 네 개의 로케일로 발행했다. en-gb-oxendict(영국 영어, 옥스퍼드 철자, 손으로 쓴 원천), en-001(국제 영어), en-gb(주류 영국 영어), en-us(미국 영어)다. en-001, en-gb, en-us는 새 tools/localize.py가 en-gb-oxendict에서 기계적으로 파생한다. spec/locales.md를 보라. docs/는 더 이상 없다. spec/, AGENTS.md, tests/validate.py, tools/gen_nav.py, tools/stats.py에 있던 그에 대한 모든 참조는 이제 locales/<locale>/를 가리킨다.
  • Claude Code 스킬 두 개를 추가했다. software-engineering-metrics-skill(책의 안내를 자기 팀에 적용하는 독자용)과 software-engineering-metrics-maintainer-skill(주제를 추가하거나 편집하는 기여자용)로, skills/ 아래에 있고 .claude/skills/에 미러링된다.
  • 게시된 웹사이트의 소스를, 이전에는 별도 저장소였던 것으로서 이 저장소의 software-engineering-metrics.github.io/로 옮겼다. 이제 옆에 있는 체크아웃 대신 저장소 루트에서 직접 locales/를 읽는다. 루트의 .github/workflows/deploy.yml은 main으로의 모든 푸시에서 사이트가 여전히 빌드되는지 확인한 뒤, software-engineering-metrics.github.io 저장소에 repository_dispatch를 보낸다 (GitHub Pages는 그 맨 도메인을 정확히 그 이름의 저장소에서만 제공하므로 얇은 배포용 껍데기로 남겨 두었다). 그 저장소가 이 모노레포를 체크아웃하고 사이트를 빌드해 배포한다.
  • 번역된(철자 파생이 아닌) 로케일을 위한 인프라를 새 spec/locales-for-global-sharing-with-svelte/ 하위 명세에 따라 추가했다. tools/gen_locale_peer_ids.py는 모든 콘텐츠 파일에 로케일 간에 동일한 .locale-peer-id 사이드카를 부여한다. 미래의 번역 로케일(자기 고유 문자의 슬러그를 가진)은 슬러그로 맞추는 대신 이를 써서 “이 페이지의 로케일 X 판”을 해결할 수 있다. tests/validate.py는 모든 사이드카가 있고 일치하는지 검사한다. spec/locales.md는 계획된 번역 로케일 열 개(아랍어, 벵골어, 웨일스어, 스페인어, 프랑스어, 힌디어, 인도네시아어, 포르투갈어, 러시아어, 우르두어, 중국어 - 중국)를 기록한다. 사이트에서는 scripts/locales.mjs에 LOCALE_LABELS/localeLabel()(계획된 모든 로케일의 표시 이름, 라우팅 전에 준비됨)과 sortedLocaleEntries()(미래의 로케일 목록이 써야 할 정렬 순서)가 생겼고, src/lib/i18n.js는 모든 .svelte 컴포넌트가 이전에 영어로 하드코딩하던 UI 크롬 문자열(내비, 사이드바, 페이저, 피커, 푸터, 건너뛰기 링크)을 뽑아 ui(locale)로 흘려보내며, 자체 번역이 없는 로케일은 영어로 되돌아간다.
  • 사이트의 손으로 만든 로케일 전용 헤더 컨트롤을 Lily Design System의 @lilydesignsystem/svelte-picker-bar로 바꿨다. 진짜 테마 피커(새 static/assets/themes/{light,dark}.css를 통한 라이트/다크), 진짜 로케일 피커(기본의 lang/dir 전용 동작 대신 이 사이트의 URL 기반 라우팅에 연결), 텍스트 크기 피커(Lily의 7단계 척도), 공유 피커(이메일, Mastodon, 링크 복사)다. @lilydesignsystem/svelte-{theme,locale,text-size,share}-picker를 ^0.1.2로, @lilydesignsystem/svelte-headless를 ^0.2.0으로 pnpm-workspace.yaml overrides를 통해 고정해, svelte-picker-bar 0.1.0 자체의 의존성 범위에 있던 실제 발행 버그를 피했다 (각 피커의 CHANGELOG.md의 “0.1.2”와 이 사이트의 AGENTS.md를 보라).
  • 홈페이지의 통계 줄(부/주제/“Free Always”)과 그 “How to read it” 섹션을 없애고, “Browse the nine parts” 카드 그리드를 평범한 글머리 기호 목록으로 바꿨다.

Changed

  • scripts/generate-sitemap.mjs를 추가했다. pnpm build의 끝에서 실행되어 미리 렌더링한 페이지로 sitemap.xml을 쓴다(정규 로케일 URL만, 두 글자 별칭 중복 없음). 이로써 robots.txt의 Sitemap: 줄이 해결된다.
  • 주제 2.8, 린 가치 흐름 메트릭을 추가했다(고전적인 린 가치 흐름 매핑의 리드 타임, 프로세스 타임, 주기 시간, 완전하고 정확한 비율, 택트 타임과 롤드 스루풋 일드 계산). 큐잉 이론 뒤에 두었다. 풀 리퀘스트와 코드 리뷰 메트릭은 2.8에서 2.9로, DORA 메트릭 주제는 2.9에서 2.10으로 옮겼다. 영향받는 모든 교차 참조를 책 전체에서 갱신했다.
  • 2부의 이름을 “Delivery and Flow Metrics”에서 “Flow Metrics”로 바꾸고 Mik Kersten의 플로우 프레임워크를 중심으로 재구성했다. 새 주제 네 개를 추가했다. 2.1 플로우 프레임워크, 2.2 플로우 아이템(기능, 결함, 위험, 부채), 2.3 플로우 속도와 플로우 분포, 2.4 플로우 타임과 플로우 부하다. 개별 DORA 메트릭 주제 네 개(배포 빈도, 리드 타임, 변경 실패율, 복구 시간)는 하나의 참조 주제 2.9 DORA 메트릭 프레임워크로 통합해 부의 끝으로 옮겼다. 플로우 효율과 진행 중인 작업은 2.5로 번호를 다시 매겼고, 큐잉 이론 주제(옛 2.9)는 2.7 큐잉 이론으로 이름을 바꿨다. 주기 시간(2.6)과 풀 리퀘스트 및 코드 리뷰 메트릭(2.8)은 번호를 유지한다. 책 전체, 용어집, 공식 참조, 성숙도 자가 평가, 머리말의 모든 교차 참조를 일치하도록 갱신했다.

Added

  • 초기 릴리스: 8개 부에 45개의 내용 주제와, 머리말 및 7개 주제의 부록(9부)을 더해 DORA와 SPACE 프레임워크, 코드와 품질 메트릭, 제품과 비즈니스 메트릭, 신뢰성과 보안 메트릭, 생성형 AI가 엔지니어링 메트릭에 미치는 영향을 다룬다.
  • 자매 프로젝트 software-engineering-guide에서 미러링한 저장소 인프라: 명세 주도의 spec/(index, structure, conventions, oxford spelling, roadmap), tests/validate.py의 검증 스위트, tools/gen_nav.py의 내비게이션 생성기, justfile, docs/contributing/ 아래 기여자 안내가 있는 AGENTS.md, CONTRIBUTING.md, 그리고 이 변경 이력.
  • spec/structure.md, 테스트가 파일을 검사하는 기준이 되는 정본 주제 매니페스트.
  • docs/examples/의 구체적인 예시 두 개: 작성이 끝난 메트릭 헌장과 대시보드 명세.

역사

책은 명세에서 바깥으로 지어졌다. 먼저 아홉 부 구조가 spec/structure.md에 선언되고, 이어서 각 주제가 docs/contributing/chapter-template.md의 공유 템플릿에 맞춰 집필되었으며, 그 내내 tests/validate.py가 구조와 하우스 스타일을 강제했다.

이 파일의 규약

  • 변경은 Added, Changed, Fixed, Removed, Deprecated 아래로 묶는다.
  • 항목은 짧고 구체적으로 유지한다. 가능하면 항목당 한 줄.
  • 여기서도 엠 대시를 쓰지 않는다. 테스트가 이 파일도 검사한다.