From 4cafca680d727c8eec1cd1641dbf1dac70a28524 Mon Sep 17 00:00:00 2001 From: toki Date: Tue, 9 Jun 2026 20:55:15 +0900 Subject: [PATCH] feat: change-aware test routing skill and milestone update --- .../run-proto-socket-test-matrix/SKILL.md | 7 +++ .../scripts/run_test_by_change.sh | 57 +++++++++++++------ .../milestones/change-aware-test-routing.md | 7 ++- 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md b/agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md index 68956cb..d2a3d2e 100644 --- a/agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md +++ b/agent-ops/skills/project/run-proto-socket-test-matrix/SKILL.md @@ -173,6 +173,13 @@ tools/check_proto_sync.sh - 실패를 통과로 단정하지 않는다. 불확실하면 미검증 또는 실패 후보로 표시한다. - `agent-task/archive/**`를 자동으로 읽지 않는다. +## functional-routing anchor 정책 + +- `--route auto`에서 일반 언어 구현 변경은 파일명 방향 단서에 따라 `functional-server-x5 ` 또는 `functional-client-x5 `를 recommended로 둔다. +- 같은 언어에서 server/client 방향이 모두 감지되거나 방향을 알 수 없으면 `functional-both-x5 `를 recommended로 둔다. +- transport, codec/framing/communicator, queue/gateway, public API entrypoint 변경은 파일명에 server/client 단서가 있어도 수정 언어 기준 `functional-both-x5 `를 우선한다. +- transport/queue 변경의 전역 후보(`functional-both-x5 transport/queue`)와 proto/communicator/public API wider 후보는 언어별 anchor 후보와 별도로 중복 제거된 recommended/skipped 상태로 남긴다. + ## full-functional-periodic 정책 (RFP-1, RFP-2, RFP-3) - `run_test_by_change.sh --route full --dry-run` 출력이 `functional-full`, `functional-full-dart-web`, `functional-full-dart-web-wss`를 `recommended` 상태로 포함하면 full functional periodic이 발동된다. diff --git a/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh b/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh index 8d0fc2a..1ec46ca 100755 --- a/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh +++ b/agent-ops/skills/project/run-proto-socket-test-matrix/scripts/run_test_by_change.sh @@ -244,6 +244,14 @@ classify_file() { esac fi + # package/public API entrypoints + if [ -z "$domain" ]; then + case "$f" in + dart/lib/proto_socket.dart|python/proto_socket/__init__.py|python/proto_socket/packets/__init__.py|typescript/src/index.ts|typescript/src/node.ts) + domain="public-api" ;; + esac + fi + # transport / crosstest / harness path if [ -z "$domain" ]; then case "$f" in @@ -351,10 +359,11 @@ add_recommendation() { build_recommendations() { local detected_langs="$1" local detected_lang_directions="$2" - local detected_domains="$3" - local file_count="$4" - local docs_only="$5" - local has_perf_term="$6" + local detected_lang_both_domains="$3" + local detected_domains="$4" + local file_count="$5" + local docs_only="$6" + local has_perf_term="$7" if [ "$file_count" -eq 0 ]; then add_recommendation "skipped-candidate" "noop" "-" "변경 파일 없음" @@ -414,16 +423,17 @@ build_recommendations() { # full functional (functional-full) 을 기본으로 발동한다. # protocol/schema/communicator/transport 변경이 감지되면 wider 승격도 같이 기록한다. if [ "$full_activate" -eq 1 ]; then - local has_proto=0 has_comm=0 has_transport=0 has_queue=0 + local has_proto=0 has_comm=0 has_transport=0 has_queue=0 has_public_api=0 csv_has_item "$detected_domains" "proto" && has_proto=1 || true csv_has_item "$detected_domains" "communicator" && has_comm=1 || true csv_has_item "$detected_domains" "transport" && has_transport=1 || true csv_has_item "$detected_domains" "queue-gateway" && has_queue=1 || true + csv_has_item "$detected_domains" "public-api" && has_public_api=1 || true # full functional: explicit full route + non-docs-only → 기본 발동 add_recommendation "recommended" "functional-full" "all" "full periodic: 전체 범위의 functional 검증을 기본 발동" - if [ "$has_proto" -eq 1 ] || [ "$has_comm" -eq 1 ]; then - add_recommendation "recommended" "functional-wider" "all" "full periodic: proto/communicator 변경으로 wider functional 승격" + if [ "$has_proto" -eq 1 ] || [ "$has_comm" -eq 1 ] || [ "$has_public_api" -eq 1 ]; then + add_recommendation "recommended" "functional-wider" "all" "full periodic: proto/communicator/public API 변경으로 wider functional 승격" fi if [ "$has_transport" -eq 1 ]; then add_recommendation "recommended" "functional-both-x5" "transport/queue" "full periodic: transport 변경은 both x5 확장" @@ -449,26 +459,27 @@ build_recommendations() { fi fi - local has_proto has_comm has_transport has_queue has_perf_harness has_test_docs + local has_proto has_comm has_transport has_queue has_public_api has_perf_harness has_test_docs has_proto=$(csv_has_item "$detected_domains" "proto" && echo 1 || echo 0) has_comm=$(csv_has_item "$detected_domains" "communicator" && echo 1 || echo 0) has_transport=$(csv_has_item "$detected_domains" "transport" && echo 1 || echo 0) has_queue=$(csv_has_item "$detected_domains" "queue-gateway" && echo 1 || echo 0) + has_public_api=$(csv_has_item "$detected_domains" "public-api" && echo 1 || echo 0) has_perf_harness=$(csv_has_item "$detected_domains" "perf-harness" && echo 1 || echo 0) has_test_docs=$(csv_has_item "$detected_domains" "test-docs" && echo 1 || echo 0) - # protocol / packet / codec / framing / protobuf 변경 → wider/full functional로 승격 - if [ "$has_proto" -eq 1 ] || [ "$has_comm" -eq 1 ]; then + # protocol / packet / codec / framing / protobuf / public API 변경 → wider/full functional로 승격 + if [ "$has_proto" -eq 1 ] || [ "$has_comm" -eq 1 ] || [ "$has_public_api" -eq 1 ]; then if [ "$route" = "full" ]; then - add_recommendation "recommended" "functional-full" "all" "proto/communicator 변경은 full functional 범위로 상승" + add_recommendation "recommended" "functional-full" "all" "proto/communicator/public API 변경은 full functional 범위로 상승" elif [ "$functional_status" = "recommended" ]; then - add_recommendation "recommended" "functional-wider" "all" "proto/communicator 변경은 smoke로 둬선 안 됨" + add_recommendation "recommended" "functional-wider" "all" "proto/communicator/public API 변경은 smoke로 둬선 안 됨" else add_recommendation "skipped-candidate" "functional-wider" "all" "명시 라우팅이 기능 테스트 중심이 아님" fi fi - # 언어 구현 변경: 불명확한 server/client 구분이면 보수적으로 both-x5 권장 + # 언어 구현 변경: 고위험 도메인은 방향 단서보다 both-x5를 우선한다. if [ -n "$detected_langs" ]; then local lang local dir @@ -478,6 +489,8 @@ build_recommendations() { [ -z "$dir" ] && dir="both" if [ "$route" = "full" ]; then add_recommendation "recommended" "functional-full" "$lang" "언어별 변경 기반으로 full functional 기준 선택" + elif csv_has_item "$detected_lang_both_domains" "$lang"; then + add_recommendation "recommended" "functional-both-x5" "$lang" "transport/codec/communicator/public API 변경은 수정 언어 기준 both x5" else case "$dir" in server) @@ -559,11 +572,12 @@ main() { fi # 3. 파일별 언어/도메인 분류 집계 - local tmp_lang tmp_domain tmp_lang_server tmp_lang_client + local tmp_lang tmp_domain tmp_lang_server tmp_lang_client tmp_lang_both tmp_lang="$(mktemp)" tmp_domain="$(mktemp)" tmp_lang_server="$(mktemp)" tmp_lang_client="$(mktemp)" + tmp_lang_both="$(mktemp)" local file_table="" has_non_docs=0 has_performance_term=0 if [ -n "$changed_files" ]; then @@ -581,6 +595,12 @@ main() { *client* ) printf '%s\n' "$lang_val" >> "$tmp_lang_client" ;; esac } + [ -n "$lang_val" ] && { + case "${domain_val:-}" in + communicator|transport|queue-gateway|public-api) + printf '%s\n' "$lang_val" >> "$tmp_lang_both" ;; + esac + } [ -n "$domain_val" ] && printf '%s\n' "$domain_val" >> "$tmp_domain" case "${domain_val:-}" in docs|test-docs) ;; @@ -601,7 +621,7 @@ main() { fi # 중복 제거 + 쉼표 결합 - local detected_langs="" detected_domains="" detected_lang_directions="" + local detected_langs="" detected_domains="" detected_lang_directions="" detected_lang_both_domains="" if [ -s "$tmp_lang" ]; then detected_langs="$(sort -u "$tmp_lang" | tr '\n' ',' | sed 's/,$//')" for lang in $(sort -u "$tmp_lang"); do @@ -619,7 +639,10 @@ main() { if [ -s "$tmp_domain" ]; then detected_domains="$(sort -u "$tmp_domain" | tr '\n' ',' | sed 's/,$//')" fi - rm -f "$tmp_lang" "$tmp_domain" "$tmp_lang_server" "$tmp_lang_client" + if [ -s "$tmp_lang_both" ]; then + detected_lang_both_domains="$(sort -u "$tmp_lang_both" | tr '\n' ',' | sed 's/,$//')" + fi + rm -f "$tmp_lang" "$tmp_domain" "$tmp_lang_server" "$tmp_lang_client" "$tmp_lang_both" # docs-only 판정: 변경 파일이 있고 docs 외 domain이 없으면 docs-only local docs_only="no" @@ -631,7 +654,7 @@ main() { declare -a reco_targets=() declare -a reco_reasons=() if [ "$classify_only" -eq 0 ]; then - build_recommendations "$detected_langs" "$detected_lang_directions" "$detected_domains" "$file_count" "$docs_only" "$has_performance_term" + build_recommendations "$detected_langs" "$detected_lang_directions" "$detected_lang_both_domains" "$detected_domains" "$file_count" "$docs_only" "$has_performance_term" fi # untracked 포함 여부 diff --git a/agent-roadmap/milestones/change-aware-test-routing.md b/agent-roadmap/milestones/change-aware-test-routing.md index ef87596..bc64a11 100644 --- a/agent-roadmap/milestones/change-aware-test-routing.md +++ b/agent-roadmap/milestones/change-aware-test-routing.md @@ -45,8 +45,8 @@ 일반 수정 후 항상 실행할 최소 기능 기준점을 정한다. -- [ ] [anchor-language-x5] 언어 구현 변경은 수정 언어 중심 server x5 또는 client x5를 선택한다. 검증: server-only/client-only 변경은 해당 방향 x5를 실행 후보로 만든다. -- [ ] [anchor-language-both-x5] transport, codec, communicator, public API 변경은 수정 언어 기준 양방향 x5를 선택한다. 검증: 같은 언어 self 방향은 same-language 검증으로 채우고 중복 방향은 결과에서 한 번만 센다. +- [x] [anchor-language-x5] 언어 구현 변경은 수정 언어 중심 server x5 또는 client x5를 선택한다. 검증: server-only/client-only 변경은 해당 방향 x5를 실행 후보로 만든다. +- [x] [anchor-language-both-x5] transport, codec, communicator, public API 변경은 수정 언어 기준 양방향 x5를 선택한다. 검증: 같은 언어 self 방향은 same-language 검증으로 채우고 중복 방향은 결과에서 한 번만 센다. - [x] [dart-web-coverage] Dart.web/Dart.web(WSS)는 full functional matrix와 browser client 관련 변경에서 필수 coverage로 유지한다. 검증: full functional route가 기존 Dart.web/WSS client 열을 누락하지 않는다. - [x] [full-functional-periodic] 정기 full 또는 넓은 protocol 변경은 functional full 5x5와 Dart.web/WSS client coverage를 선택한다. 검증: 전체 cross matrix가 매 변경 기본값이 아니라 정기/고위험 변경용으로 분리된다. @@ -110,4 +110,5 @@ - 완료: `agent-task/archive/2026/06/m-change-aware-test-routing/01_change_classifier_core/complete.log` -> `last-pass-point`, `diff-source`, `path-domain-map` - 완료: `agent-task/archive/2026/06/m-change-aware-test-routing/02+01_risk_routing_rules/complete.log` -> `risk-escalation` - 완료: `agent-task/archive/2026/06/m-change-aware-test-routing/01_dart_web_coverage/complete.log` -> `dart-web-coverage` - - 진행중: `agent-task/m-change-aware-test-routing/02_full_functional_periodic/PLAN-local-G05.md` -> `full-functional-periodic` + - 완료: `agent-task/archive/2026/06/m-change-aware-test-routing/02_full_functional_periodic/complete.log` -> `full-functional-periodic` + - 완료(직접 처리): `functional-routing` anchor 보강 -> `anchor-language-x5`, `anchor-language-both-x5`; 검증=`bash -n .../run_test_by_change.sh`, focused dry-run server/client/transport, public-api unit smoke