Repository navigation
feat: schema usr와 reach·impact language-traversal 순회 문서 - #22
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
요약
API 영향 추적 Phase 7c(Rust). isthmus
trace가 Rust 백엔드의 핸들러 도달과 relation-use를 잇도록 두 가지를 더합니다.schema사실의symbol.usr: 사실을 감싸는 그래프 아이템 ID를 싣습니다.impact·graph --level symbol과 같은 ID입니다.reach(dependencies)와impact --format language-traversal(dependents)을 추가합니다.ID 체계와 usr 귀속
crate::mod::f,crate::mod::Typecrate::mod::Type::methodcrate::mod::Type::<Trait>::methodcrate::mod::Trait::methodharvest::OwnerSpan)를 받습니다. 사실의 바이트 오프셋을 감싸는 가장 안쪽 정점을 고르고, 그 ID가 그래프 정점 집합에 있을 때만 싣습니다.table!, orphan 파일, 수확 실패. 이런 사실은missing-relation-usrs:로 셉니다.순회 문서
src/traversal.rs, pythograph 알고리즘 포팅)rootsTruncated입니다. root가 65개를 넘으면 전파를 멈춥니다.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 벡터로 검증했습니다.e2e (scratch, 합성 axum·sqlx·sea_orm 스텁)
isthmus
f9dcd1d와 schemagraph703a21f로 돌렸습니다.isthmus check --pairs: 종료 코드 0, 5 matches.trace, relation 선택: relation → relation-use(usr) → 역방향 순회까지 이어집니다. rust route-decl이 없어서non-http-entry에서 멈춥니다. 문서는 isthmus 파서를 통과했습니다.trace, route 선택: 원본 isthmus는 rustroute-decl을 거부합니다. 그래서 scratch에서 isthmus를 고치고 손으로 만든 route-decl로 확인했습니다./api/orders/{}→OrderStore::find→main.orders·main.order_items→ DB 의존자남은 것
cycles --level type이 10개에서 13개로 늘었습니다. 같은 투영 산물이고 게이트 대상이 아닙니다.검증
cargo fmt --check통과cargo clippy --all-targets -D warnings통과 (semantic feature 포함)cargo test157개 통과 (semantic 포함)scripts/coverage.sh통과 (93.64%, 게이트 90)scripts/verify-cli-contract.shOKrules --strict0,cycles --level symbol --strict0--generated-at의 범위 밖 오프셋(+99:99)을 받아들이던 문제impact --format=language-traversal표기의 파싱 실패가 2로 끝나던 문제--untracked-files=normal을 명시해서 설정을 덮어씁니다.🤖 Generated with Claude Code