Skip to content

feat: schema usr와 reach·impact language-traversal 순회 문서 - #22

Merged
ictechgy merged 8 commits into
mainfrom
feature/schema-usr
Sep 30, 2026
Merged

ictechgy merged 8 commits into
mainfrom
feature/schema-usr

Conversation

@ictechgy

Copy link
Copy Markdown
Owner

요약

API 영향 추적 Phase 7c(Rust). isthmus trace가 Rust 백엔드의 핸들러 도달과 relation-use를 잇도록 두 가지를 더합니다.

  1. schema 사실의 symbol.usr: 사실을 감싸는 그래프 아이템 ID를 싣습니다. impact·graph --level symbol과 같은 ID입니다.
  2. language-traversal v1 출력: reach(dependencies)와 impact --format language-traversal(dependents)을 추가합니다.

ID 체계와 usr 귀속

  • ID 형식
    • 일반 아이템: crate::mod::f, crate::mod::Type
    • inherent 메서드: crate::mod::Type::method
    • trait impl 메서드: crate::mod::Type::<Trait>::method
    • trait 기본 메서드: crate::mod::Trait::method
  • 찾는 방법: 같은 syn 수확으로 정점별 소스 범위(harvest::OwnerSpan)를 받습니다. 사실의 바이트 오프셋을 감싸는 가장 안쪽 정점을 고르고, 그 ID가 그래프 정점 집합에 있을 때만 싣습니다.
  • 귀속 대상
    • fn, impl 메서드, trait 기본 메서드, const/static 초기화식: 그 정점
    • 구조체 어트리뷰트·필드 컬럼: 구조체
    • 메서드 밖의 연관 상수: impl의 self 타입
    • fn 안의 fn: 바깥 fn
  • usr가 없는 경우: 최상위 table!, orphan 파일, 수확 실패. 이런 사실은 missing-relation-usrs:로 셉니다.

순회 문서

  • 다중 root 단일 패스 (src/traversal.rs, pythograph 알고리즘 포팅)
    • 한 정점에 싣는 root는 최대 64개이고, 넘으면 rootsTruncated입니다. root가 65개를 넘으면 전파를 멈춥니다.
    • via는 UTF-16 순서로 고릅니다.
    • root별 BFS 오라클과 무작위 그래프 300개로 대조했고, 80개 root가 한 hub로 모이는 경우도 확인했습니다.
  • 근거 등급: tentative 간선은 candidate로 봅니다. 모든 도달 정점에 root별 하한 evidence를 싣습니다. dispatch·unresolvedCalls는 싣지 않습니다.
  • 입력과 메타데이터
    • --roots-from은 JSON 배열 또는 bridge-facts 문서를 받습니다.
    • 깊이는 --max-depth(1–128)로 정하고 --depth도 받습니다. 도달 수 상한은 --max-reached입니다.
    • revision은 --revision, 없으면 깨끗한 작업 트리의 HEAD입니다.
    • graphRevision은 SHA-256입니다. 저장소 안에 구현했고 NIST 벡터로 검증했습니다.
  • 종료 코드
    • root-not-found: 문서를 쓰고 64로 끝납니다.
    • 사용법 오류: 표준 출력을 비우고 64로 끝납니다.

e2e (scratch, 합성 axum·sqlx·sea_orm 스텁)

isthmus f9dcd1d와 schemagraph 703a21f로 돌렸습니다.

  • isthmus check --pairs: 종료 코드 0, 5 matches.
  • trace, relation 선택: relation → relation-use(usr) → 역방향 순회까지 이어집니다. rust route-decl이 없어서 non-http-entry에서 멈춥니다. 문서는 isthmus 파서를 통과했습니다.
  • trace, route 선택: 원본 isthmus는 rust route-decl을 거부합니다. 그래서 scratch에서 isthmus를 고치고 손으로 만든 route-decl로 확인했습니다.
    • /api/orders/{} → OrderStore::find → main.orders·main.order_items → DB 의존자
    • syn 모드는 메서드 이름 팬아웃이라 이 경로도 candidate입니다.

남은 것

  • Rust route-decl 생산자가 필요하고, isthmus의 계약 개정이 필요합니다.
  • 기존 수확 결함(이번 범위 밖): 지역 변수 이름이 크레이트 루트 모듈 이름과 같으면 모듈 정점을 가리키는 references 간선이 생깁니다. 그래서 순회가 그 모듈이 import한 아이템 전부에 닿습니다. 자세한 내용은 HANDOFF에 적었습니다.
  • cycles --level type이 10개에서 13개로 늘었습니다. 같은 투영 산물이고 게이트 대상이 아닙니다.

검증

  • cargo fmt --check 통과
  • cargo clippy --all-targets -D warnings 통과 (semantic feature 포함)
  • cargo test 157개 통과 (semantic 포함)
  • scripts/coverage.sh 통과 (93.64%, 게이트 90)
  • scripts/verify-cli-contract.sh OK
  • 자기 분석: rules --strict 0, cycles --level symbol --strict 0
  • GLM 리뷰: 실제 결함 2건을 수정했습니다.
    • --generated-at의 범위 밖 오프셋(+99:99)을 받아들이던 문제
    • impact --format=language-traversal 표기의 파싱 실패가 2로 끝나던 문제
  • GLM 지적 중 재현이나 계약으로 반박한 것
    • 경로 정규화 불일치: 심링크 경로와 상대 경로에서 6/6 usr가 붙는 것을 확인했습니다.
    • root-not-found를 truncationReasons에 넣는 것: 계약이 요구하는 동작입니다.
    • showUntrackedFiles 설정 문제: --untracked-files=normal을 명시해서 설정을 덮어씁니다.
    • 정점 ID 조회가 이차 시간이라는 지적: 실제로는 BTreeSet 조회입니다.

🤖 Generated with Claude Code

ictechgy and others added 8 commits September 30, 2026 08:50
schema의 relation-use 사실은 위치만 있어 isthmus trace가 핸들러 도달을
관계 사용과 잇지 못했다. 사실마다 symbol {qualifiedName, usr}을 싣고 usr는
impact와 같은 정점 ID다.

- 정점 ID 규칙(impl self 타입 해석, `Type::<Trait>::m`)을 schema에서 다시
  구현하지 않고 같은 syn 수확을 돌려 정점별 소스 범위(OwnerSpan)를 받는다.
  사실의 바이트 오프셋을 감싸는 가장 안쪽 정점을 고르고, 그래프 정점
  집합에 없는 ID는 싣지 않는다.
- 귀속: fn·impl 메서드·트레이트 기본 메서드·const/static 초기화식은 그
  정점, 구조체 어트리뷰트·필드 컬럼은 구조체, 메서드 밖 연관 상수는 impl
  self 타입. 최상위 table! 호출·orphan 파일처럼 감싸는 정점이 없는 사실은
  usr를 지어내지 않고 `missing-relation-usrs:`로 센다.
- 그래프 수확이 실패해도 사실은 그대로 낸다 — 파싱 실패 하나로 문서 전체를
  잃지 않도록 usr만 빠지고 원인을 limitation에 밝힌다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
자기 분석 `cycles --level symbol --strict`가 두 순환을 잡았다. harvest의 지역
변수 owner_spans와 attach_symbols의 매개변수 facts가 같은 이름의 fn으로
이름 해석돼 harvest ↔ owner_spans, attach_symbols ↔ facts 간선이 생겼다.
지역명·매개변수명을 바꿔 구문 수확이 함수 정점으로 오독하지 않게 한다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
isthmus language-traversal v1의 도달 의미를 문서(graph)만으로 계산하는
traversal 모듈을 더한다. 계열 생산자(pythograph·tsograph)와 같은 알고리즘이다.

- 모든 root를 한 번에 출발시키는 단계 동기 BFS. 정점이 자기 자신이 아닌 더
  작은 인덱스 root를 65개 이상 가지면 큰 인덱스 root의 전파를 멈춘다 —
  그 정점을 지나는 경로는 작은 root들도 같거나 짧게 지나므로 출력(작은
  인덱스 64개·depth·via)이 바뀌지 않는다.
- via는 가장 가까운 root(동률이면 작은 인덱스)에서 depth-1 거리의 선행 정점 중
  UTF-16 순으로 가장 작은 것. 정점 번호를 UTF-16 순으로 매겨 비교를 줄였다.
- 근거 등급: tentative 간선(이름 팬아웃·dyn/제네릭 트레이트 impl 후보)은
  candidate, 나머지는 direct. root마다 비트 하나로 확정 간선 그래프와 전체
  그래프의 깊이 제한 도달을 비교해 root별 하한을 구하고, 메모리 상한을 넘으면
  부풀리지 않는 근사로 바꾼다.
- graphRevision용 SHA-256을 의존 없이 두고 NIST 벡터로 검증한다.
- 무작위 그래프를 root별 BFS 오라클과 대조하는 테스트(root 70개 이상 가지치기
  포함)와 변이 확인을 거쳤다. 자기 분석 규칙에 traversal: [graph]를 더했다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
isthmus trace가 schema 사실의 usr와 핸들러 도달을 잇도록 language-traversal
v1 문서를 낸다. reach는 dependencies, impact --format language-traversal은
dependents 방향이다.

- root: 위치 인자 + --roots-from <file|->(JSON 문자열 배열 또는 bridge-facts
  문서의 symbol.usr), 처음 나온 순서로 중복 제거. `--` 뒤는 모두 위치 인자다.
- 계열 계약대로 사용법 오류(빈·제어 문자 id, 10,000개 초과, 잘못된
  --max-depth/--max-reached/--revision/--generated-at, 허용 밖 플래그)는
  표준 출력을 비운 채 64. 정점이 아닌 root는 symbol 없이 싣고
  root-not-found를 밝힌 문서를 쓴 뒤 64. 수확 실패는 기존대로 2.
- project는 schema 문서와 같은 realpath, revision은 --revision 또는 작업
  트리가 깨끗할 때의 git HEAD(선택 잠금·fsmonitor 없이), graphRevision은
  root를 project로 맞춘 그래프 JSON의 SHA-256 — --dir 표기가 달라도 같다.
- 모든 도달 정점에 evidence를 싣고, 완전성을 주장할 수 없어 dispatch·
  unresolvedCalls는 싣지 않는다.
- 도구 버전을 인자로 넘겨 cli ↔ cli::reach 모듈 순환을 피했다.
- verify-cli-contract에 순회 종료 코드·빈 표준 출력·schema usr 전량 root 수용
  검사를 더했다(pipefail에서 64를 파이프로 넘기지 않도록 먼저 담는다).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
README(영·한)에 schema 사실의 symbol.usr 귀속 규칙과 missing-relation-usrs,
reach·impact --format language-traversal의 root 입력·근거 등급·한계·종료 코드
(64)를 적고, rust route-decl을 isthmus가 아직 받지 않아 route 선택 trace가
불가능하다는 사실을 밝힌다. HANDOFF에 진행 상황을 남긴다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GLM 리뷰 반영. --generated-at의 시간대 오프셋은 모양만 봐서 +99:99 같은
값이 문서에 그대로 실렸다 — isthmus가 generatedAt을 검증하며 문서 전체를
거부한다. 오프셋 시·분 범위를 확인한다. impact --format=language-traversal
표기의 파싱 실패는 순회 명령으로 인식되지 않아 2로 끝났다(띄어 쓴 표기는
64) — 같은 요청을 같은 계약으로 다룬다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
CI의 clippy 1.98이 상수 크기 chunks_exact에 chunks_exact_to_as_chunks를
낸다(로컬 1.96·1.97에는 없는 lint). as_chunks로 고정 크기 배열을 받아
블록 경계도 타입으로 보장한다. NIST 벡터 테스트는 그대로 통과한다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@ictechgy
ictechgy merged commit 23bd9f6 into main Sep 30, 2026
1 check passed
@ictechgy
ictechgy deleted the feature/schema-usr branch September 30, 2026 01:59
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