에이전트 문서 조작 커널 1층 — 문서 선택자 언어(DSEL) 신설 (#4875) - #4878
Closed
kevin9327 wants to merge 1 commit into
Closed
Conversation
에이전트가 문서를 고치는 길은 `edit` 하위 명령 6개가 전부이고, 여섯이 각자 다른 방식으로 대상을 지목한다(`--table/--row/--col`, `--data 이름=값[k]`, `--find/--occurrence`). "문서의 어디"를 가리키는 공통 개념이 없어서 "3절 두 번째 표의 마지막 행"을 표현할 문법 자체가 없다. CSS 선택자를 rhwp IR 에 맞춰 좁힌 지목 언어를 라이브러리 표면에 세운다. - 축 16종 — 전부 IR 의 실제 노드 종류. 지어낸 층 없음 - 결합자 4종, 비교자 10종, 의사 선택자 9종 - 노드 주소 `/section[0]/para[3]/cell[5]` — 참조가 아니라 값이라 편집을 사이에 두고 살아남는다(앵커 층의 전제). 사전식 순서가 곧 문서 순서 - 축·속성 사전은 한 벌뿐이고 파서·평가기·진단이 그것만 읽는다. 축 계층도 데이터로 적어 ontology 가 subClassOf 를 유도할 수 있게 했다 - 파싱 단계에서 축·속성·연산자 적합성까지 검사하고, 진단에 위치·기대 목록· 수복 힌트를 값으로 싣는다 - 정규식 대신 역추적 지점이 `*` 하나뿐인 글롭 — 최악 O(패턴×입력) 유계. 선택자가 맞대는 값은 문서에서 오고 문서는 신뢰 경계 밖이다 - 상한 8종(파싱 5·평가 3)을 전부 테스트로 고정. 중첩 깊이는 파서와 평가기 양쪽에서 막는다 — 파서를 거치지 않은 AST 로도 평가가 불릴 수 있다 - 손상 입력(어긋난 char_offsets, 비단조 start_pos, 짝 없는 서로게이트)에서 패닉 없이 진단으로 끝난다 기존 코드 변경은 `src/lib.rs` 에 `pub mod agent;` 한 줄뿐이다. 신규 4,611줄 / 단위 테스트 116건 / clippy 무경고 / rustfmt 통과. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Collaborator
|
통합 PR #4883(4412546)로 병합 완료했습니다. 원 head와 CI를 다시 확인해 누적 반영했고, 상세 검토·메인터너 보정·검증 근거는 archive 검토 기록에 남겼습니다. 중복 병합을 막기 위해 이 원 PR을 닫습니다. 감사합니다. |
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.
무엇
에이전트 문서 조작 커널의 1층 — 문서 선택자 언어(DSEL) 를 라이브러리
표면(
rhwp::agent::dsel)에 세운다. CSS 선택자를 rhwp IR 에 맞춰 좁힌 문법으로"문서의 어디"를 값으로 만든다.
이슈: #4875 · 처리결과 문서:
mydocs/report/task_dsel_selector_language.md왜 — 지금은 지목 문법이 명령마다 다르다
에이전트가 문서를 고치는 길은
edit하위 명령 6개가 전부이고, 여섯이 각자 다른방식으로 대상을 지목한다.
fill-fields--data 이름=값, 같은 이름은[k]replace-text--find+--occurrenceset-cell--table/--row/--colinsert-image--page/--x/--yredact--kindsanitize즉 "문서의 어디"를 가리키는 공통 개념이 없다. "3절 두 번째 표의 마지막 행 전부"를
표현할 문법 자체가 없고, 여섯 명령이 미리 뚫어 둔 구멍 밖은 손댈 수 없다.
전 / 후
전 — 명령마다 다른 플래그, 미리 뚫린 구멍 안에서만:
후 — 하나의 지목 문법, 명령과 분리된 값:
진단도 값이다 — 위치·기대 목록·수복 힌트가 함께 나온다:
무엇이 들어 있나
sectionpararuncontroltablecellpictureequationfieldfootnoteendnoteheaderfooterbookmarkhyperlinkshape(+*). 전부 IR 의 실제 노드 종류이며 지어낸 층은 없다.>) · 다음 형제(+) · 이후 형제(~)=!=><>=<=^=$=*=~=firstlastnthrangecontainsmatchesemptynothas/section[0]/para[3]/control[0]/cell[5]. 참조가 아니라 값이라편집을 사이에 두고 살아남는다(앵커 층의 전제). 사전식 순서가 곧 문서 순서다.
설계 판단 (근거는 각 모듈 문서에)
ast.rs상수 한 벌이고파서·평가기·진단이 그것만 읽는다. 축 계층(
table⊂control)도 데이터로적어
ontology가rdfs:subClassOf를 유도할 때 손으로 다시 적지 않게 했다.cell이table의 특수화가 아닌 것(포함이지 특수화가 아님)을 테스트가고정한다.
평가에서 거절하면 오류 위치가 "이 선택자 어딘가"로 뭉개진다.
[index]는 형제 기준 —table:last는"문서에서 마지막 표"다. 두 기준을 다른 문법에 두어 어느 쪽인지 항상 보이게 했다.
값 술어를 위치 술어보다 먼저 적용한다(
table:last[rows>2]의 뜻이 갈리는 자리).!=도 포함.cell[name!="합계"]가 이름 없는 셀을 전부 고르면 편집이 새어 나간다.
형제 판정은 종류까지 본다(컨트롤 다음의 구간이 "다음 형제"가 되면, 글자
모양이 하나 바뀔 때마다 같은 선택자가 다른 것을 고른다).
선택자가 맞대는 값은 문서에서 오고 문서는 신뢰 경계 밖이다. 대신 역추적
지점이
*하나뿐인 글롭 — 최악O(패턴 × 입력)유계, 지수 경로 없음.정지성·손상 입력
선택자는 모델이 만들고 문서에서 온 값과 맞대어진다. 양쪽 다 신뢰 경계 밖이므로
상한 8종을 전부 테스트로 고정했다.
중첩 깊이는 파서와 평가기 양쪽에서 막는다 — 파서를 거치지 않은 AST(계획서에서
역직렬화한 선택자)로도 평가가 불릴 수 있다.
문단을 구간으로 자르는 경로가 실물 손상 문서를 만난다. 자를 수 없으면 잘못
자르는 대신 구간을 만들지 않는다.
char_offsets길이 불일치start_pos비단조start_pos≠ 0전 구간이
char단위다 — 바이트 인덱스로 돌면 한글 선택자에서 캐럿이 글자중간을 가리키고 슬라이싱이
byte index is not a char boundary로 패닉한다.신뢰 경계
문서에서 읽은 문자열이 선택자 문법으로 재해석되는 경로는 없다. 문서에
para:has(...)라고 적혀 있어도 그건 그냥 글자다. 테스트가 고정한다(
document_derived_text_is_never_reinterpreted_as_syntax).범위
붙일 수 있으므로 후속 이슈로 쌓는다.
src/lib.rs에pub mod agent;한 줄뿐이다. 기존 동작을건드리는 곳이 없다.
검증
릴리스 프로파일 전수는 로컬에서 별도 실행 중이며, 결과는 이 PR 코멘트로 잇는다.
신규 4,611 줄 / 단위 테스트 116 건.
agent/dsel/eval.rsagent/dsel/ast.rsagent/dsel/parse.rsagent/dsel/node.rsagent/dsel/lex.rsagent/dsel/glob.rsagent/dsel/error.rsagent/dsel/token.rsagent/dsel/mod.rsagent/mod.rs시각 산출물이 없는 라이브러리 층이라 전/후는 위의 코드·진단 비교로 갈음했다.
다음
연산 대수(2층) → 앵커(3층) → 검증·트랜잭션(4·5층) → 정책·계보(6·7층) →
매니페스트(8층). 각각 별도 이슈로 쌓는다. 에이전트 축 모듈 10개
(
main.rs의mod)를pub mod로 승격해bindings/Native·tools/*·wasm 이링크할 수 있게 하는 것도 후속이다.