Skip to content

feat: routes --role client — reqwest·ureq·선언 래퍼의 isthmus route-call - #24

Merged
ictechgy merged 8 commits into
mainfrom
feature/client-routes
Sep 30, 2026
Merged

ictechgy merged 8 commits into
mainfrom
feature/client-routes

Conversation

@ictechgy

@ictechgy ictechgy commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

요약

rustograph routes --role client를 더한다. isthmus http 도메인의 호출 측 생산자로, reqwest·ureq 요청과 http-wrappers v1로 선언한 래퍼 호출을 route-call 사실(platform: "rust", roles: ["client"])로 낸다. symbol.usr는 감싸는 정점이라 impact --format language-traversal --roots-from이 그대로 받는다.

  • 라이브러리: reqwest(get·blocking::get·Client 동사·request(Method::X)·Request::new), ureq 2/3 자유 함수·Agent. 문자열은 reqwest·ureq 2가 url::Url::parse(WHATWG), ureq 3은 http::Uri(점 세그먼트 보존)로 해석한다.
  • URL 조립: 리터럴·format!·concat!·+·상수·static·연관 상수·지역 변수·Url::parse(..)?.join(..)(RFC 3986 병합), 모든 생성자가 같은 상수로 채우는 구조체 필드 base. 그 밖은 dynamic(channel: null, 마스킹한 channelPrefix)이나 센 한계다.
  • 래퍼: "language": "rust", owner::name = rustograph 정점 ID, 구조체 리터럴 생성자(이름 = 타입 이름).
  • 한계: route-call-coverage:(모델링하지 않는 클라이언트·증명 못 한 수신자·보내기 전 거부되는 URL·확인 밖 버전), ambiguous-base-join:, http-wrapper-undeclared:, http-wrapper-unresolved:, missing-route-usrs:.
  • 결합 방식: isthmus #133 규칙 — Url::join은 rfc3986, reqwest·ureq는 base URL이 없어 전체 URL 규칙(docs/HTTP-CLIENT.md).

검증

  • isthmus 3a45450 벡터 재벤더링 — url-compose producer 41 + producer:rustograph 7 = 48/48 통과(tests/client_routes.rs, 제품 함수로 실행). 새 규칙에 맞춰 미상 base rfc3986의 ..·빈 참조를 dynamic + ambiguous-base-join:으로 바꿨다.
  • 모의 서버 오라클(experiments/client-oracle, 진짜 reqwest 0.13.5·ureq 3.4.2·url 2.5.8 → 127.0.0.1 기록 서버): 41 시나리오 일치 37 · dynamic 3 · 요청 없음 1 · 불일치 0, 귀속되지 않은 사실 0. reqwest 0.12.28 scratch 실행도 같음. 기록은 cargo test가 오프라인 대조.
  • e2e(scratch, 무패치 isthmus 3a45450): axum08 서버 + fixture 클라이언트 workspace trace — 3 routes·3 calls·3 handlers·3 client symbols(예: ApiClient::create_item → POST /api/items → axum_app::handlers::items::create, 역방향 struct_field_plus).
  • GLM 리뷰: 재현 후 수정 2건(긴 상수 사슬 스택 넘침, 밑줄 host·빈 포트 authority), 반박 4건(HANDOFF 참고).
  • cargo test, stable clippy(1.98.1) -D warnings, cargo fmt --check, 커버리지 92.18%, verify-cli-contract.sh, rules --strict·cycles --level symbol --strict 0.

알려진 것

  • scope.dynamic-* 벡터(서버 선언의 dynamicScope)는 rustograph가 그 필드를 내지 않아 분류만 했다.
  • 기존 서버 route-decl의 위치 열은 UTF-16이라 계약(UTF-8 바이트)과 비ASCII 줄에서 어긋난다(범위 밖, HANDOFF에 기록).

🤖 Generated with Claude Code

ictechgy and others added 8 commits September 30, 2026 15:27
클라이언트 route-call 생산자의 순수 계층이다. syn을 모르는 두 모듈로 두어
isthmus 공유 벡터를 제품 함수로 그대로 실행할 수 있게 했다.

- compose: 경로 조각(리터럴·값·query 꼬리)을 정규 템플릿으로 조립한다.
  세그먼트 전체 보간만 {}, 첫 ?·# 뒤 제거, 끝 query 지역 변수, 점 세그먼트,
  고엔트로피·웹훅 마스킹, dynamic의 channelPrefix. URL 결합은 WHATWG
  문자열 연결(reqwest·ureq 2), url::Url::join(RFC 3986 병합), http::Uri
  연결(ureq 3, 점 세그먼트 보존) 세 갈래이고 기대값은 url 2.5.8 실행 결과로
  고정했다. base 없는 상대 URL·http 밖 scheme은 요청이 아니다.
- wrappers: http-wrappers v1을 모르는 필드까지 선언 오류로 읽고,
  wrapper.method 규칙(레이블 우선·index·기본 동사·methodEnum)으로 동사를 정한다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
isthmus http 도메인의 호출 측 생산자다. impact와 같은 syn 수확 위에서
함수 본문을 두 번 훑는다 — 구조체 리터럴의 필드 값을 모은 뒤, 그 표로
self.base_url 같은 필드 base를 풀어 호출 사실을 낸다.

- 인식: reqwest::get·blocking::get, Client 동사 메서드·request(Method::X)·
  Request::new, ureq 자유 함수·Agent(2.x는 url::Url, 3.x는 http::Uri),
  http-wrappers의 rust 선언(owner::name = 정점 ID, 구조체 리터럴 생성자).
- 값: format!·concat!·+·상수·static·연관 상수·지역 변수(스코프 스택,
  수정되는 이름은 믿지 않음)·Url::parse/join. 필드는 모든 생성 위치가 같은
  상수일 때만 값이고, 아니면 base 앵커와 baseRef다.
- 수신자: 구문 타입 추론(생성자·주석·필드·반환·static 타입). 증명하지
  못한 수신자의 요청 모양 호출은 사실이 아니라 route-call-coverage로 센다.
- symbol.usr는 감싸는 정점, 위치 열은 계약대로 UTF-8 바이트다
  (Ctx::locate_utf8). dynamic 사실은 channel을 null로 두어 URL의
  userinfo·query가 문서에 실리지 않게 한다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
--role은 계속 필수다. client는 --dir·--out·--wrappers·--service만 받고,
선언 파일 오류·빈 service는 사용법 오류(2)다. 역할마다 허용 플래그를
나눠 server의 --framework와 client의 --wrappers가 서로 조용히 먹히지
않게 했다. verify-cli-contract에 client 문서 필드, 선언 오류, 모든 호출
usr가 impact 정점인지(--roots-from)를 더했다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- tests/fixture-client: 규칙마다 요청 하나를 보내는 합성 클라이언트와
  이름·버전만 흉내 내는 reqwest·ureq·url 스텁(워크스페이스 밖에 두어 자동
  멤버가 되지 않게 했다), http-wrappers 선언.
- experiments/client-oracle: 같은 lib.rs를 진짜 reqwest 0.13.5·ureq 3.4.2·
  url 2.5.8로 컴파일해 127.0.0.1 기록 서버(환경 프록시, ureq 3의 CONNECT
  터널 수락)로 보내고 사실과 대조한다. 41 시나리오 일치 37·dynamic 3·
  요청 없음 1·불일치 0, 기록을 cargo test가 오프라인으로 대조한다.
- tests/client_routes.rs: url-compose 생산자 사례 41건, 여러 줄 호출의
  시작 줄·UTF-8 열, 필드·지역·상수·ureq 버전·래퍼·서비스 규칙.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
docs/HTTP-CLIENT.md에 라이브러리별 해석과 소스 근거, 제안하는 Rust 결합
방식 이름(whatwg-concat·whatwg-join·http-uri-concat), 래퍼 선언의 Rust
이름 규칙, 한계 접두사, 오라클 표를 적었다. README 두 언어에 명령과 절을
더하고, isthmus가 rust route-decl을 이미 받는다는 사실로 낡은 문장을
고쳤다. HANDOFF에 scratch isthmus로 돌린 workspace trace e2e를 남겼다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GLM 리뷰에서 나온 것 중 재현한 두 가지다.

- 상수가 상수를 가리킬 때 eval_const가 깊이를 0부터 새로 시작해,
  3,000개 사슬에서 테스트 스레드 스택이 넘쳤다(CLI는 20,000개에서 abort).
  깊이를 사슬에 이어 상한에 닿으면 모르는 값(baseRef)으로 낮춘다.
  회귀 테스트는 수정 전 코드에서 넘침을 확인했다.
- authority가 `my_api.example.com`처럼 밑줄 host와 `h:`처럼 빈 포트를
  거부해 root 사실에서 authority가 빠졌다. url 2.5.8은 둘 다 받고 빈
  포트는 포트 없음으로 읽는다 — 같게 맞췄다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
isthmus #133이 Rust 클라이언트 결합을 정했다 — `Url::join`은 `rfc3986`,
reqwest·ureq는 base가 없어 전체 URL 규칙이다. url-compose에 더해진
`producer:rustograph` 7건을 러너에 넣어 48/48을 통과한다.

규칙이 바뀐 곳은 하나다. base를 모르는 `Url::join` 상대 참조에 `..`가
있거나 참조가 비면 지울 세그먼트를 알 수 없으므로 dynamic +
ambiguous-base-join이다. 이전에는 `..`가 알려진 세그먼트 안에서 끝나면
템플릿을 냈다. query·fragment 뒤의 `..`는 보지 않는다.

새 ruleId scope.dynamic-validate·dynamic-applies는 서버 선언의 선택 필드
dynamicScope 규칙이고 rustograph는 그 필드를 내지 않으므로 분류만 했다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
제안했던 Rust 결합 이름 대신 isthmus가 정한 규칙(`Url::join` = rfc3986,
reqwest·ureq는 전체 URL)을 적고, 무패치 isthmus 3a45450으로 다시 돌린
workspace trace e2e와 GLM 리뷰 처리(수정 2·반박 4)를 HANDOFF에 남겼다.
README의 isthmus 호환 문장도 route-call 수용으로 고쳤다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@ictechgy
ictechgy merged commit 128b413 into main Sep 30, 2026
1 check passed
@ictechgy
ictechgy deleted the feature/client-routes branch September 30, 2026 06:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant