polydeukes 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +54 -74
- package/README.md +55 -86
- package/dist/baseline.d.ts +82 -0
- package/dist/baseline.js +166 -0
- package/dist/bin.d.ts +1 -1
- package/dist/bin.js +26 -6
- package/dist/claude-code-hook.d.ts +7 -5
- package/dist/claude-code-hook.js +69 -17
- package/dist/claude-code.d.ts +6 -0
- package/dist/claude-code.js +6 -0
- package/dist/covenant-check.d.ts +10 -17
- package/dist/covenant-check.js +44 -12
- package/dist/covenant-module.d.ts +2 -2
- package/dist/covenant-module.js +9 -1
- package/dist/docs/README.ko.md +60 -0
- package/dist/docs/README.md +64 -0
- package/dist/docs/catalog.json +464 -0
- package/dist/docs/concepts/judgment.ko.md +113 -0
- package/dist/docs/concepts/judgment.md +113 -0
- package/dist/docs/how-to/configure-project.ko.md +99 -0
- package/dist/docs/how-to/configure-project.md +95 -0
- package/dist/docs/how-to/connect-surfaces.ko.md +115 -0
- package/dist/docs/how-to/connect-surfaces.md +118 -0
- package/dist/docs/how-to/write-disciplines.ko.md +124 -0
- package/dist/docs/how-to/write-disciplines.md +125 -0
- package/dist/docs/index.json +2046 -0
- package/dist/docs/reference/cli/covenant-check.ko.md +101 -0
- package/dist/docs/reference/cli/covenant-check.md +98 -0
- package/dist/docs/reference/cli/docs.ko.md +97 -0
- package/dist/docs/reference/cli/docs.md +95 -0
- package/dist/docs/reference/cli/explain.ko.md +79 -0
- package/dist/docs/reference/cli/explain.md +84 -0
- package/dist/docs/reference/cli/init.ko.md +119 -0
- package/dist/docs/reference/cli/init.md +131 -0
- package/dist/docs/reference/configuration/index.ko.md +448 -0
- package/dist/docs/reference/configuration/index.md +474 -0
- package/dist/docs/reference/packages/adapter-claude-code.ko.md +83 -0
- package/dist/docs/reference/{adapter-claude-code.md → packages/adapter-claude-code.md} +16 -10
- package/dist/docs/reference/packages/adapter-git.ko.md +101 -0
- package/dist/docs/reference/{adapter-git.md → packages/adapter-git.md} +25 -15
- package/dist/docs/reference/packages/core.ko.md +128 -0
- package/dist/docs/reference/{core.md → packages/core.md} +32 -13
- package/dist/docs/reference/packages/covenant.ko.md +115 -0
- package/dist/docs/reference/{covenant.md → packages/covenant.md} +41 -26
- package/dist/docs/reference/packages/polydeukes.ko.md +134 -0
- package/dist/docs/reference/packages/polydeukes.md +139 -0
- package/dist/docs/troubleshooting.ko.md +142 -0
- package/dist/docs/troubleshooting.md +97 -122
- package/dist/docs/tutorials/first-judgment.ko.md +82 -0
- package/dist/docs/tutorials/first-judgment.md +81 -0
- package/dist/docs-catalog.d.ts +25 -0
- package/dist/docs-catalog.js +450 -0
- package/dist/docs-library.d.ts +23 -0
- package/dist/docs-library.js +347 -0
- package/dist/docs-markdown.d.ts +32 -0
- package/dist/docs-markdown.js +150 -0
- package/dist/docs-query.d.ts +11 -40
- package/dist/docs-query.js +28 -122
- package/dist/docs-types.d.ts +105 -0
- package/dist/docs-types.js +2 -0
- package/dist/explain.d.ts +3 -5
- package/dist/explain.js +48 -47
- package/dist/index.d.ts +2 -3
- package/dist/index.js +1 -2
- package/dist/init-claude-code.d.ts +5 -3
- package/dist/init-claude-code.js +226 -63
- package/dist/init-grok.d.ts +51 -0
- package/dist/init-grok.js +242 -0
- package/dist/load-config.d.ts +5 -1
- package/dist/load-config.js +2 -1
- package/dist/pre-state-reader.d.ts +22 -0
- package/dist/pre-state-reader.js +32 -0
- package/dist/scaffold-project.js +48 -8
- package/dist/schema/polydeukes.schema.json +38 -91
- package/package.json +7 -7
- package/dist/docs/configuration.md +0 -103
- package/dist/docs/installation.md +0 -212
- package/dist/docs/reference/configuration.md +0 -338
- package/dist/docs/reference/polydeukes.md +0 -287
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# `@polydeukes/adapter-git`
|
|
2
|
+
|
|
3
|
+
[English](adapter-git.md) · **한국어**
|
|
4
|
+
|
|
5
|
+
> **커밋 표면의 번역기**입니다. 스테이징된 diff가 약속(covenant) 입력 IR이 되고,
|
|
6
|
+
> `adapters.git` 설정 네임스페이스가 여기서 정의됩니다.
|
|
7
|
+
>
|
|
8
|
+
> 알파입니다. 통합 패키지의 의존성으로 설치되므로 일반 사용자가 따로 설치하거나 불러올 필요는 없습니다. 커밋 표면은
|
|
9
|
+
> [`pdks covenant check`](polydeukes.ko.md#polydeukes-bin)를 통해 닿습니다.
|
|
10
|
+
|
|
11
|
+
<a id="ownership"></a>
|
|
12
|
+
## 담당하는 기능
|
|
13
|
+
|
|
14
|
+
Git의 변경 정보를 세션 표면과 같은 공통 입력 형식으로 번역합니다. 작성자가 AI인지 사람인지에 따라 판정 방식을 달리하지 않습니다.
|
|
15
|
+
|
|
16
|
+
| 단위 | 하는 일 |
|
|
17
|
+
|---|---|
|
|
18
|
+
| 스테이징 변경 수집 | 스테이징 영역을 내용 기준선을 갖춘 변경 목록으로 읽습니다 |
|
|
19
|
+
| 순수 번역 | 변경 목록을 하나의 `CovenantInput`으로 바꿉니다 |
|
|
20
|
+
| 설정 어휘 | 이 어댑터 자신의 설정 네임스페이스를 검증합니다 |
|
|
21
|
+
|
|
22
|
+
순수 라이브러리입니다. 스테이징된 diff의 형태를 알 뿐 설치나 훅 러너, 밸브는 알지
|
|
23
|
+
못합니다. pre-commit 훅에 배선하는 것은 우산이 맡는 배포 행위입니다.
|
|
24
|
+
`@polydeukes/core`는 `peerDependency`로 부릅니다. 판정기와 같은 어휘를 공유하며 별도 사본을 설치하지 않습니다.
|
|
25
|
+
|
|
26
|
+
<a id="collection"></a>
|
|
27
|
+
## 수집과 `adapters.git` 네임스페이스
|
|
28
|
+
|
|
29
|
+
**세 수집기가 같은 형식으로 결과를 반환합니다.** `collectStagedChanges` · `collectWorktreeChanges` ·
|
|
30
|
+
`collectRangeChanges({ repoRoot, range: '<base>..<head>' | '<base>...<head>' })`는 모두 같은
|
|
31
|
+
`StagedChange[]`를 반환하므로 이후에는 같은 번역기와 판정 경로를 사용합니다.
|
|
32
|
+
|
|
33
|
+
| 수집기 | `pre` | `post` | 그 밖에 |
|
|
34
|
+
|---|---|---|---|
|
|
35
|
+
| staged | HEAD blob | **스테이징된** blob. 워크트리는 쓰지 않습니다. `git add` 뒤에 갈라졌을 수 있습니다 | |
|
|
36
|
+
| worktree | HEAD blob | 디스크의 바이트 | 추적하지 않는 파일도 무시 대상이 아니면 `added`로 포함하며, 디스크에서 사라진 파일은 HEAD에 있었든 인덱스에만 있었든 `deleted`입니다. 읽을 수 없는 경로(깨진 심볼릭 링크)는 내용 null로 경로만 판정합니다 |
|
|
37
|
+
| range | base blob | head blob | `...`는 base를 `git merge-base`로 해소합니다. git이 해소하지 못하는 ref나 merge-base 없는 두 ref는 예외를 던집니다 |
|
|
38
|
+
|
|
39
|
+
**수집기는 증거로 사용할 수 있는 내용을 제한합니다.**
|
|
40
|
+
|
|
41
|
+
| 결정 | 이유 |
|
|
42
|
+
|---|---|
|
|
43
|
+
| 모든 수집기에서 `--no-renames` 강제 | 이름 변경을 삭제 더하기 추가로 판정합니다. 보호 파일의 `git mv`가 불투명한 이름 변경 항목 하나로 빠져나가면 안 됩니다 |
|
|
44
|
+
| 바이너리 blob이나 파일은 내용을 null로 | 손실 있게 디코딩된 바이트를 싣지 않습니다 |
|
|
45
|
+
| 첫 커밋 이전 상태는 전부 추가로 좁힘 | 예외를 던지지 않습니다. staged와 worktree가 같습니다 |
|
|
46
|
+
| 타입 변경(`T`)은 `pre`를 유지 | 심볼릭 링크가 파일로 바뀐 것은 수정이라, delta 판정이 사라진 내용을 봅니다 |
|
|
47
|
+
| 모든 목록 명령은 `--`로 끝남 | 파일과 이름이 같은 브랜치도 ref이지 모호한 인자가 아닙니다 |
|
|
48
|
+
|
|
49
|
+
번역은 변경 하나마다 도구 호출 하나를 만듭니다. 이름은 어댑터가 소유한 `staged-write`와
|
|
50
|
+
`staged-delete`입니다. 삭제는 언제나 증거를 답니다. 쓰기는 스테이징된 blob이 바이너리인
|
|
51
|
+
경우를 빼고 증거를 답니다. 그때는 견줄 텍스트가 없으므로 `fileChange` 없이 도착하고,
|
|
52
|
+
증명되지 않은 다른 호출과 똑같이 경로만으로 판정됩니다. **세션 컬렉션은 정직하게
|
|
53
|
+
비어 있습니다.** 커밋 표면에는 세션이 없고, 있는 것처럼 보이게 키를 지어내지 않습니다.
|
|
54
|
+
`actor`도 없습니다. 훅은 사람의 `git commit`과 에이전트의 것을 구별할 수 없으므로 아무것도
|
|
55
|
+
증명하지 않습니다.
|
|
56
|
+
|
|
57
|
+
**네임스페이스는 이 어댑터 자신의 어휘입니다.** 코어는 컨테이너 형태만 검증합니다.
|
|
58
|
+
어댑터마다 설정 객체 하나라는 것까지이고 내용은 그대로 통과시킵니다. 그래서 어휘와 그
|
|
59
|
+
검증기와 기본값이 전부 여기 있습니다.
|
|
60
|
+
|
|
61
|
+
| 키 | 값 | 기본값 | 뜻 |
|
|
62
|
+
|---|---|---|---|
|
|
63
|
+
| `adapters.git.enforce` | `block` \| `advise` | `block` | 커밋 표면의 판정이 무엇을 **하는지** |
|
|
64
|
+
| `adapters.git.protectedPaths` | string[] | `[]` | 커밋 표면의 **가산** 보호 범위입니다. 공통 목록 위에 얹혀 판정됩니다 |
|
|
65
|
+
|
|
66
|
+
알 수 없는 키, 허용된 두 값 이외의 `enforce`, 문자열 배열이 아닌 `protectedPaths`는
|
|
67
|
+
즉시 거부하며 오류에 전체 필드 경로를 표시합니다. 작성 레퍼런스는
|
|
68
|
+
[설정 레퍼런스의 `adapters` 절](../configuration/index.ko.md#adapters)입니다.
|
|
69
|
+
|
|
70
|
+
**추가 보호 범위는 관측자가 정합니다.** 강제 수준과 마찬가지로 해당 표면의 설정입니다. 여기 적힌 항목은 작업이 역사가 되는 시점에 판정되고 세션 표면은 그것을 읽지
|
|
71
|
+
않습니다. 저장소가 판정기 **소스**를 세션에서 편집할 수 있게 두면서도 그것을 올리는
|
|
72
|
+
커밋은 멈출 수 있는 이유가 이것입니다.
|
|
73
|
+
|
|
74
|
+
`enforce: advise`에서는 밸브를 구성하지 않습니다. 위반은 `advised`로 기록하고 권고를
|
|
75
|
+
stderr에 출력한 뒤 커밋을 계속합니다. 달라지는 것은 위반 뒤의 처리이지 판정 기준이 아닙니다.
|
|
76
|
+
판정할 수 없는 실행은 어느 강제 수준에서도 종료 코드 `2`로 차단합니다(fail-closed).
|
|
77
|
+
|
|
78
|
+
<a id="consumer-contract"></a>
|
|
79
|
+
## 사용자와의 접점
|
|
80
|
+
|
|
81
|
+
- **설정의 `adapters.git` 블록.**
|
|
82
|
+
- **`pdks covenant check`를 실행하는 pre-commit 훅.** 손으로 배선하며, 훅 관리자 셋의
|
|
83
|
+
수동 절차는
|
|
84
|
+
[설치](../../how-to/connect-surfaces.ko.md#commit-surface)에 있습니다.
|
|
85
|
+
|
|
86
|
+
일반 사용자가 직접 불러올 필요는 없습니다.
|
|
87
|
+
|
|
88
|
+
<a id="limits"></a>
|
|
89
|
+
## 선언된 한계
|
|
90
|
+
|
|
91
|
+
- **세션을 읽는 선언은 여기서 판정할 수 없습니다.** `precedent`는 세션 이력이 필요한데 커밋에는
|
|
92
|
+
없습니다. 항목이 `skipped`와 `supply-pass`를 남기는 것은 그 선언의 `supply`가 `pass`일
|
|
93
|
+
때뿐입니다. 정책이 없으면 없는 세션은 판정 불가(exit 2)입니다. 항목의 결함이 아니라 이
|
|
94
|
+
표면이 제공하는 증거의 한계입니다.
|
|
95
|
+
- **추적하지 않는 파일이 무시 대상이면 이 표면에서 관측하지 않습니다. 이미 추적 중인 파일은
|
|
96
|
+
`.gitignore`와 무관하게 관측합니다.** 무시 대상이며 한 번도 추가하지 않은 `dist`는 보이지
|
|
97
|
+
않지만, 추적 중인 파일은 나중에 무시 패턴에 해당하더라도 `git diff`에 남습니다. 세션 표면이 생성 경로를 공통 목록에
|
|
98
|
+
싣는 이유입니다.
|
|
99
|
+
- **밸브에는 터미널 앞의 사람이 필요합니다.** TTY가 없으면 프롬프트를 표시하지 못하므로
|
|
100
|
+
증언으로 차단을 해제할 수 없습니다. CI 실행과 에이전트가 시작한 `git commit`에도 같은 조건을 적용합니다. 무엇도
|
|
101
|
+
저장되지 않으므로 한 번의 답이 나중 커밋을 덮지 않습니다.
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# `@polydeukes/adapter-git`
|
|
2
2
|
|
|
3
|
-
**English** · [한국어](
|
|
3
|
+
**English** · [한국어](adapter-git.ko.md)
|
|
4
4
|
|
|
5
5
|
> **The commit surface's translator** — a staged diff becomes the covenant input IR, and
|
|
6
6
|
> the `adapters.git` config namespace is defined here.
|
|
7
7
|
>
|
|
8
8
|
> Alpha. A transitive dependency of the umbrella: you do not install it and you do not
|
|
9
9
|
> import it. The commit surface reaches it through
|
|
10
|
-
> [`pdks covenant check`](
|
|
10
|
+
> [`pdks covenant check`](polydeukes.md#polydeukes-bin).
|
|
11
11
|
|
|
12
|
+
<a id="ownership"></a>
|
|
12
13
|
## What this package owns
|
|
13
14
|
|
|
14
15
|
The boundary where git's vocabulary is translated away. A staged diff becomes the same
|
|
@@ -23,12 +24,15 @@ AI or human.
|
|
|
23
24
|
|
|
24
25
|
This is a pure library. It knows the staged-diff shape and nothing about installation, hook
|
|
25
26
|
runners, or valves — wiring it into a pre-commit hook is a deployment act that lives in the
|
|
26
|
-
umbrella.
|
|
27
|
+
umbrella. It names `@polydeukes/core` as a `peerDependency`: the vocabulary is shared with
|
|
28
|
+
the judge, not installed a second time here.
|
|
27
29
|
|
|
30
|
+
<a id="collection"></a>
|
|
28
31
|
## Collection and the `adapters.git` namespace
|
|
29
32
|
|
|
30
33
|
**Three collectors, one shape.** `collectStagedChanges`, `collectWorktreeChanges`, and
|
|
31
|
-
`collectRangeChanges(repoRoot, '<base>..<head>' | '<base>...<head>')` each return the
|
|
34
|
+
`collectRangeChanges({ repoRoot, range: '<base>..<head>' | '<base>...<head>' })` each return the
|
|
35
|
+
same
|
|
32
36
|
`StagedChange[]`, so the translator and everything after it is one path.
|
|
33
37
|
|
|
34
38
|
| Collector | `pre` | `post` | Also |
|
|
@@ -52,7 +56,8 @@ and `staged-delete`. A deletion always carries its evidence. A write carries it
|
|
|
52
56
|
staged blob was binary — there is no text to compare, so the call arrives with no
|
|
53
57
|
`fileChange` at all and is judged on its path alone, the same as any unproven call.
|
|
54
58
|
**The session collections are honestly empty** — the commit surface has no session, and a
|
|
55
|
-
key is never fabricated to look like one.
|
|
59
|
+
key is never fabricated to look like one. There is no `actor` either: the hook cannot tell a
|
|
60
|
+
human's `git commit` from an agent's, so it proves none.
|
|
56
61
|
|
|
57
62
|
**The namespace is this adapter's own vocabulary.** The core validates only the container
|
|
58
63
|
shape — one settings object per adapter — and passes the contents through verbatim, so the
|
|
@@ -65,7 +70,7 @@ vocabulary, its validator, and its defaults all live here.
|
|
|
65
70
|
|
|
66
71
|
An unknown key, an `enforce` outside the two values, or a `protectedPaths` that is not an
|
|
67
72
|
array of strings each fail fast with the full field path. The writing reference is
|
|
68
|
-
[the configuration reference's `adapters` section](
|
|
73
|
+
[the configuration reference's `adapters` section](../configuration/index.md#adapters).
|
|
69
74
|
|
|
70
75
|
**The additive scope is additive for a reason.** The level belongs to the observer, and so
|
|
71
76
|
does the scope: entries listed here are judged when work becomes history, and the session
|
|
@@ -73,26 +78,31 @@ surface never reads them. That is what lets a repository leave judge *sources* e
|
|
|
73
78
|
a session while still stopping the commit that promotes them.
|
|
74
79
|
|
|
75
80
|
Under `enforce: advise` the valve is structurally absent: a verdict is recorded as
|
|
76
|
-
`advised`, one advisory line lands on stderr, and the commit proceeds.
|
|
77
|
-
|
|
81
|
+
`advised`, one advisory line lands on stderr, and the commit proceeds. The response to a violation
|
|
82
|
+
changes, not the judgment criteria: a run that cannot judge still fails closed at exit `2` at either
|
|
83
|
+
level.
|
|
78
84
|
|
|
85
|
+
<a id="consumer-contract"></a>
|
|
79
86
|
## Where the consumer touches it
|
|
80
87
|
|
|
81
88
|
- **The `adapters.git` block** in your config.
|
|
82
89
|
- **The pre-commit hook** that runs `pdks covenant check`, wired by hand — the manual
|
|
83
90
|
procedure for three hook managers is in
|
|
84
|
-
[installation](
|
|
91
|
+
[installation](../../how-to/connect-surfaces.md#commit-surface).
|
|
85
92
|
|
|
86
93
|
No import.
|
|
87
94
|
|
|
95
|
+
<a id="limits"></a>
|
|
88
96
|
## Declared limits
|
|
89
97
|
|
|
90
|
-
- **
|
|
91
|
-
and a commit has none
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
98
|
+
- **A declaration that reads the session cannot be judged here.** A `precedent` needs
|
|
99
|
+
session history and a commit has none. The entry records `skipped` with `supply-pass`
|
|
100
|
+
only when its own `supply` is `pass`; with no policy the missing session is unjudgeable
|
|
101
|
+
(exit 2). A permanent condition of this surface, not a fault in the entry.
|
|
102
|
+
- **Untracked ignored files are invisible here; already-tracked files are not.** `.gitignore`
|
|
103
|
+
does not hide a path git already tracks. A built `dist` that was never added stays
|
|
104
|
+
invisible; a tracked file that later matches an ignore line still appears in `git diff`.
|
|
105
|
+
That is why the session surface carries generated paths on the common list instead.
|
|
96
106
|
- **The valve needs a human at a terminal.** No TTY means no prompt and no way through: a
|
|
97
107
|
CI run and an agent-spawned `git commit` reach the same closed door. Nothing is ever
|
|
98
108
|
persisted, so one answer never covers a later commit.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# `@polydeukes/core`
|
|
2
|
+
|
|
3
|
+
[English](core.md) · **한국어**
|
|
4
|
+
|
|
5
|
+
> **모든 약속(covenant)이 말하는 프로토콜**입니다. 입력 IR과 판정 결과 형태, 설정 스키마,
|
|
6
|
+
> 텔레메트리 수집기가 여기 있습니다.
|
|
7
|
+
>
|
|
8
|
+
> 알파입니다. 일반 사용자는 이 패키지를 따로 설치하거나 불러올 필요가 없습니다. 통합 패키지의 의존성으로 설치되며, 사용자 진입점은
|
|
9
|
+
> [`polydeukes`](polydeukes.ko.md)입니다.
|
|
10
|
+
|
|
11
|
+
<a id="ownership"></a>
|
|
12
|
+
## 담당하는 기능
|
|
13
|
+
|
|
14
|
+
모든 약속이 사용하는 공통 프로토콜을 정의합니다. 개별 약속이 무엇을 판정하는지는 다루지 않습니다.
|
|
15
|
+
|
|
16
|
+
| 영역 | 무엇인가 |
|
|
17
|
+
|---|---|
|
|
18
|
+
| 약속 프로토콜 | 표준 입력 JSON 입력 IR, 판정 결과 형태, 종료 코드 계약 |
|
|
19
|
+
| 설정 스키마 | `defineConfig()`가 파싱된 yaml·json 데이터를 검증합니다. 대응하는 JSON Schema도 별도 파일로 제공합니다 |
|
|
20
|
+
| ROI 텔레메트리 | 모든 패키지가 공유하는 추가 전용 로그 기록기 |
|
|
21
|
+
| 실패 정책 | 실패 종류마다 fail-open과 fail-closed를 가르는 표 하나 |
|
|
22
|
+
| 보호 경로 정규화 | 선언된 목록이 디스패처가 대조하는 문자열이 됩니다 |
|
|
23
|
+
| 대화 기록(transcript) 이음매 | 약속이 세션 이력을 묻는 질의 인터페이스 |
|
|
24
|
+
|
|
25
|
+
이 패키지는 두 가지 제약을 따릅니다. **런타임 의존이 없습니다.** 검증은 손으로 짰고
|
|
26
|
+
배포하는 JSON Schema는 런타임 코드에서 읽지 않는 별도 파일입니다. **에이전트나 도구, 언어의
|
|
27
|
+
리터럴이 없습니다.** 편집기 도구 이름과 테스트 러너 이름은 설정과 어댑터가 채워 넣는
|
|
28
|
+
**값**이라서, 코어의 에이전트 중립성은 grep으로 확인되는 주장입니다. 다른 모든 패키지가
|
|
29
|
+
이 패키지에 의존하고, 이 패키지는 그 어느 것에도 의존하지 않습니다.
|
|
30
|
+
|
|
31
|
+
**판정기와 두 어댑터는 이 패키지를 `peerDependency`로 선언합니다.** 각각 설치하는 대신 같은 어휘를 공유합니다. `SOURCE_KINDS`와
|
|
32
|
+
`parseInput`은 검증기와 엔진이
|
|
33
|
+
같은 값을 참조해야 합니다. 서로 다른 사본을 사용하면 설치는 성공해도 동작이 달라질 수 있습니다.
|
|
34
|
+
통합 패키지가 일반 의존성으로 core를 제공하므로 사용자는 패키지 하나만 설치하면 됩니다.
|
|
35
|
+
|
|
36
|
+
<a id="protocol"></a>
|
|
37
|
+
## 판정 프로토콜
|
|
38
|
+
|
|
39
|
+
현재 판정기는 표면이 디스패처에 전달한 표준 입력 JSON 페이로드를 한 번 파싱한
|
|
40
|
+
`CovenantInput`을 받습니다. 판정 결과를 반환하면 래퍼가 종료 코드로 변환합니다.
|
|
41
|
+
`.polydeukes/roi.log`의 차단 기록도 이 판정 어휘를 사용합니다.
|
|
42
|
+
|
|
43
|
+
`world`는 표면이 공급합니다(`files`, `changes`, `channels`). 판정기가 디스크에서 읽지
|
|
44
|
+
않습니다.
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
type CovenantInput = {
|
|
48
|
+
toolCalls: { name: string; args?: Record<string, unknown>; fileChange?: FileChange }[];
|
|
49
|
+
subagentSpawns: { kind: string }[];
|
|
50
|
+
userMessages: { text: string }[];
|
|
51
|
+
actor?: { agentType?: string };
|
|
52
|
+
world?: {
|
|
53
|
+
files?: Record<string, string>;
|
|
54
|
+
changes?: string[];
|
|
55
|
+
channels?: { sidecar?: string };
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
type FileChange =
|
|
60
|
+
| { kind: 'create'; path: string; post: string }
|
|
61
|
+
| { kind: 'modify'; path: string; pre: string; post: string }
|
|
62
|
+
| { kind: 'delete'; path: string; pre?: string };
|
|
63
|
+
|
|
64
|
+
type CovenantVerdict = { upheld: true } | { upheld: false; reason: string };
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
이 어휘에는 도구 이름도 에이전트 이름도 없습니다. 구체적인 도구 이름은 어댑터가 `name`에
|
|
68
|
+
채우는 **값**이고, 스폰의 `kind`도 마찬가지입니다. `FileChange`가 판별 유니온인 이유는
|
|
69
|
+
삭제를 표현할 수 없는 예외가 아니라 일급 증거로 두기 위해서입니다. 불가능한 상태는 아예
|
|
70
|
+
적을 수 없습니다. 결과 내용을 든 삭제나 기준선을 든 생성이 그렇습니다. `delete.pre`는
|
|
71
|
+
기준선이 바이너리 blob이었을 때 없습니다. 삭제를 판정하는 데는 내용이 필요 없기
|
|
72
|
+
때문입니다. `actor`는 호스트 봉투가 증명하는 관측의 주체(actor)입니다. 서브에이전트 안에서는
|
|
73
|
+
`agentType`, 주 세션에서는 `{}`이고, 표면이 주체를 증명하지 못하면 없습니다. 판정기는 기본값을
|
|
74
|
+
채우지 않습니다.
|
|
75
|
+
|
|
76
|
+
**증거는 해당 호출에만 속합니다.** `fileChange`가 없다는 것은 이
|
|
77
|
+
호출이 증명되지 않았다는 뜻이고, 형제 호출의 증거가 그 자리를 대신하지 않습니다.
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
function parseInput(stdinJson: string):
|
|
81
|
+
| { ok: true; value: CovenantInput }
|
|
82
|
+
| { ok: false; exitCode: 2 };
|
|
83
|
+
|
|
84
|
+
function verdictToExitCode(verdict: CovenantVerdict): 0 | 1;
|
|
85
|
+
|
|
86
|
+
function allFileChanges(input: CovenantInput): FileChange[];
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`parseInput`은 예외를 던지지 않습니다. 파싱되지 않는 JSON, 빈 페이로드, 객체가 아닌 값,
|
|
90
|
+
필수 컬렉션 누락은 모두 `{ ok: false, exitCode: 2 }`로 반환합니다. 판정할 수 없는
|
|
91
|
+
입력이 유효한 입력으로 오인될 길이 없습니다.
|
|
92
|
+
|
|
93
|
+
`verdictToExitCode`는 `0`이나 `1`을 반환하고 `2`는 결코 반환하지 않습니다. 위반을 차단으로
|
|
94
|
+
번역하는 것은 본체가 아니라 래퍼의 정책입니다. [종료 코드](polydeukes.ko.md#polydeukes-failure-boundaries)를
|
|
95
|
+
보십시오. 내보내는 상수는 `EXIT_UPHOLD`(`0`), `EXIT_BREAK_NON_BLOCKING`(`1`),
|
|
96
|
+
`EXIT_BREAK_BLOCKING`(`2`)입니다.
|
|
97
|
+
|
|
98
|
+
`allFileChanges`는 귀속이 필요 없는 소비자를 위해 모든 호출의 증거를 호출 순서대로
|
|
99
|
+
평탄화합니다. 증거 없는 호출은 건너뛰고 무엇으로도 대체하지 않습니다.
|
|
100
|
+
|
|
101
|
+
<a id="consumer-contract"></a>
|
|
102
|
+
## 사용자와의 접점
|
|
103
|
+
|
|
104
|
+
일반 사용자는 다음 세 경로로 이 패키지의 기능을 사용합니다.
|
|
105
|
+
|
|
106
|
+
- **설정 파일.** 그 스키마가 여기서 정의됩니다. 어휘 레퍼런스는
|
|
107
|
+
[설정 레퍼런스](../configuration/index.ko.md)입니다.
|
|
108
|
+
- **JSON Schema 자산.** `@polydeukes/core/schema.json` exports 서브패스입니다. 이 패키지를
|
|
109
|
+
직접 설치한 프로젝트가 쓰는 경로입니다. 우산을 설치한 소비자는 그쪽에 동봉된 사본을
|
|
110
|
+
가리킵니다. 두 철자 모두
|
|
111
|
+
[configuration.md의 IDE 절](../../how-to/configure-project.ko.md#add-ide-support)에 있습니다.
|
|
112
|
+
- **위의 프로토콜.** `blocked` 행을 읽는다는 것은 본체가 답한 어휘를 읽는다는 뜻입니다.
|
|
113
|
+
|
|
114
|
+
그 밖의 기능은 `polydeukes`를 통해 사용합니다.
|
|
115
|
+
|
|
116
|
+
<a id="limits"></a>
|
|
117
|
+
## 선언된 한계
|
|
118
|
+
|
|
119
|
+
- **어댑터 네임스페이스는 이름이 아니라 형태로 검증합니다.** `defineConfig()`는 `adapters`가
|
|
120
|
+
평범한 객체의 맵인지, 각 네임스페이스 값이 객체인지를 봅니다. 네임스페이스 **이름**이
|
|
121
|
+
누군가 구현한 것인지는 보지 않고, 네임스페이스 안쪽은 들여다보지 않습니다.
|
|
122
|
+
`adapters.git` 안의 미지 어휘는 git 어댑터의 검증기가 자기 층위에서 거부합니다. 여기가
|
|
123
|
+
아닙니다.
|
|
124
|
+
- **기본 대화 기록은 아무것도 하지 않습니다.** 실제 대화 기록을 주입하지 않은 소비자는
|
|
125
|
+
"아무 일도 없었다"는 결과를 받습니다. 이 상태에서는 증인 밸브가 작업을 허용하지 않으므로
|
|
126
|
+
차단을 유지합니다. 실제 대화 기록은 어댑터 뒤에 있습니다.
|
|
127
|
+
- **fail-open은 텔레메트리 하나뿐입니다.** 기록이 실패해도 판정은 바뀌지 않습니다. 표에 든
|
|
128
|
+
다른 모든 실패 종류는 차단으로 처리합니다.
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# `@polydeukes/core`
|
|
2
2
|
|
|
3
|
-
**English** · [한국어](
|
|
3
|
+
**English** · [한국어](core.ko.md)
|
|
4
4
|
|
|
5
5
|
> **The protocol every covenant speaks** — the input IR, the verdict shape, the config
|
|
6
6
|
> schema, and the telemetry collector.
|
|
7
7
|
>
|
|
8
8
|
> Alpha. A transitive dependency of the umbrella: you do not install it and you do not import
|
|
9
|
-
> it. The consumer entry point is [`polydeukes`](
|
|
9
|
+
> it. The consumer entry point is [`polydeukes`](polydeukes.md).
|
|
10
10
|
|
|
11
|
+
<a id="ownership"></a>
|
|
11
12
|
## What this package owns
|
|
12
13
|
|
|
13
14
|
The protocol every covenant speaks, and nothing that knows what a covenant is *about*.
|
|
@@ -27,19 +28,35 @@ hand-rolled and the published JSON Schema is a sibling artifact the source never
|
|
|
27
28
|
*values* supplied by configs and adapters, so the core's agent-neutrality is a claim a grep
|
|
28
29
|
can check. Every other package depends on this one; this one depends on none of them.
|
|
29
30
|
|
|
31
|
+
**The judge and the two adapters name it as a `peerDependency`, not a dependency of their
|
|
32
|
+
own.** They share the vocabulary rather than each installing a copy — `SOURCE_KINDS` and
|
|
33
|
+
`parseInput` have to be one set of values for the validator and the engine to agree, and two
|
|
34
|
+
copies would disagree silently instead of failing at install time. The umbrella carries the
|
|
35
|
+
ordinary dependency that satisfies that peer, which is why a consumer still installs one
|
|
36
|
+
package and gets core transitively.
|
|
37
|
+
|
|
38
|
+
<a id="protocol"></a>
|
|
30
39
|
## The judged protocol
|
|
31
40
|
|
|
32
41
|
This is the contract the shipped judges speak: a judge receives a `CovenantInput` — parsed
|
|
33
42
|
once from the stdin-JSON payload the surface hands the dispatcher — and answers with a
|
|
34
|
-
verdict the wrapper translates into an exit code.
|
|
35
|
-
|
|
36
|
-
|
|
43
|
+
verdict the wrapper translates into an exit code. Blocked rows in `.polydeukes/roi.log`
|
|
44
|
+
use this judgment vocabulary.
|
|
45
|
+
|
|
46
|
+
`world` is supplied by the surface (`files`, `changes`, `channels`). The judge does not
|
|
47
|
+
read it from disk.
|
|
37
48
|
|
|
38
49
|
```ts
|
|
39
50
|
type CovenantInput = {
|
|
40
51
|
toolCalls: { name: string; args?: Record<string, unknown>; fileChange?: FileChange }[];
|
|
41
52
|
subagentSpawns: { kind: string }[];
|
|
42
53
|
userMessages: { text: string }[];
|
|
54
|
+
actor?: { agentType?: string };
|
|
55
|
+
world?: {
|
|
56
|
+
files?: Record<string, string>;
|
|
57
|
+
changes?: string[];
|
|
58
|
+
channels?: { sidecar?: string };
|
|
59
|
+
};
|
|
43
60
|
};
|
|
44
61
|
|
|
45
62
|
type FileChange =
|
|
@@ -55,7 +72,9 @@ fills into `name`; `kind` on a spawn is likewise a value. `FileChange` is a disc
|
|
|
55
72
|
union so that a deletion is first-class evidence rather than an unrepresentable case, and
|
|
56
73
|
impossible states — a deletion carrying resulting content, a creation carrying a baseline —
|
|
57
74
|
cannot be written down. `delete.pre` is absent when the baseline was a binary blob, because
|
|
58
|
-
a deletion needs no content to be judged.
|
|
75
|
+
a deletion needs no content to be judged. `actor` is the observation's actor as the host
|
|
76
|
+
envelope proves it — `agentType` inside a subagent, `{}` in the main session — and is absent
|
|
77
|
+
when the surface proves none; the judge never defaults it.
|
|
59
78
|
|
|
60
79
|
**Evidence has exactly one home: the call it belongs to.** `fileChange` absent means *this
|
|
61
80
|
call is unproven*, and no sibling call's evidence stands in for it.
|
|
@@ -75,26 +94,30 @@ required collection — each resolves to a blocking `{ ok: false, exitCode: 2 }`
|
|
|
75
94
|
unjudgeable input can never be mistaken for a valid one.
|
|
76
95
|
|
|
77
96
|
`verdictToExitCode` returns `0` or `1` and never `2`. Translating a break into a block is
|
|
78
|
-
the wrapper's policy, not the body's — see [exit codes](
|
|
97
|
+
the wrapper's policy, not the body's — see [exit codes](polydeukes.md#polydeukes-failure-boundaries).
|
|
98
|
+
The exported constants are `EXIT_UPHOLD` (`0`), `EXIT_BREAK_NON_BLOCKING` (`1`), and
|
|
99
|
+
`EXIT_BREAK_BLOCKING` (`2`).
|
|
79
100
|
|
|
80
101
|
`allFileChanges` flattens every call's evidence in call order for consumers that need no
|
|
81
102
|
attribution. Calls without evidence are skipped, never substituted for.
|
|
82
103
|
|
|
104
|
+
<a id="consumer-contract"></a>
|
|
83
105
|
## Where the consumer touches it
|
|
84
106
|
|
|
85
107
|
Three places, all of them indirect.
|
|
86
108
|
|
|
87
109
|
- **The config file.** Its schema is defined here. The vocabulary reference is
|
|
88
|
-
[the configuration reference](
|
|
110
|
+
[the configuration reference](../configuration/index.md).
|
|
89
111
|
- **The JSON Schema artifact** — `@polydeukes/core/schema.json`, an exports subpath, for a
|
|
90
112
|
project that installs this package directly. A consumer of the umbrella names the copy
|
|
91
113
|
bundled there instead; both spellings are in
|
|
92
|
-
[configuration.md's IDE section](
|
|
114
|
+
[configuration.md's IDE section](../../how-to/configure-project.md#add-ide-support).
|
|
93
115
|
- **The protocol above** — reading a `blocked` row means reading the vocabulary a body
|
|
94
116
|
answered in.
|
|
95
117
|
|
|
96
118
|
Everything else here is reached through `polydeukes`.
|
|
97
119
|
|
|
120
|
+
<a id="limits"></a>
|
|
98
121
|
## Declared limits
|
|
99
122
|
|
|
100
123
|
- **Adapter namespaces are validated by shape, not by name.** `defineConfig()` checks that
|
|
@@ -102,10 +125,6 @@ Everything else here is reached through `polydeukes`.
|
|
|
102
125
|
not check that a namespace *name* is one anybody implements, and it does not look inside
|
|
103
126
|
the namespace at all. Unknown vocabulary inside `adapters.git` is rejected by the git
|
|
104
127
|
adapter's own validator, at its own layer — not here.
|
|
105
|
-
- **`requirePrecedent` evidence is layered the same way.** The core fully validates the
|
|
106
|
-
`command` key, because a shell command is the surface where an agent crosses into the
|
|
107
|
-
system. Every other key is validated for container shape alone — a flat object holding
|
|
108
|
-
exactly one key — and its value passes through verbatim for the owning adapter to judge.
|
|
109
128
|
- **The default transcript is a noop.** A consumer that injects no real transcript
|
|
110
129
|
converges on "nothing happened", which is the safe direction for a valve: it never opens.
|
|
111
130
|
Real transcripts live behind adapters.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# `@polydeukes/covenant`
|
|
2
|
+
|
|
3
|
+
[English](covenant.md) · **한국어**
|
|
4
|
+
|
|
5
|
+
> **판정기**입니다. 디스패처와 규율(discipline) 라이브러리, 메타 약속(covenant), TTL 증인
|
|
6
|
+
> 밸브가 여기 있습니다.
|
|
7
|
+
>
|
|
8
|
+
> 알파입니다. 일반 사용자는 통합 패키지를 통해 설치하며 직접 불러올 필요가 없습니다.
|
|
9
|
+
> 설정의 `disciplines:` 블록과 `.polydeukes/roi.log`의 기록을 통해 동작을 확인합니다.
|
|
10
|
+
|
|
11
|
+
<a id="ownership"></a>
|
|
12
|
+
## 담당하는 기능
|
|
13
|
+
|
|
14
|
+
**판정 기능을 별도로 사용할 때 설치하는 패키지입니다.** 통합 패키지의 표면 없이 판정 기능만 연결하려면 이 패키지와 `@polydeukes/core`를 함께 제공합니다.
|
|
15
|
+
core가 여기서 `peerDependency`라서 어휘가
|
|
16
|
+
복제되지 않고 공유됩니다. 일반 사용자에게는 통합 패키지가 이 의존성을 제공합니다.
|
|
17
|
+
|
|
18
|
+
선언된 약속(covenant)을 평가해 판정 결과를 내는 기능을 모두 이 패키지에서 구현합니다.
|
|
19
|
+
|
|
20
|
+
| 단위 | 하는 일 |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `runCovenant` 래퍼 | 판정 본체를 실행하고, 비차단 `1`을 차단하는 `2`로 번역하고, 모든 호출을 기록합니다. 측정되지 않고 실행되는 약속은 없습니다 |
|
|
23
|
+
| 경로 라우팅 디스패처 | 보호 경로에 약속을 등록하고 일치하는 항목을 **모두** 실행합니다. 하나가 실패했다고 뒤의 판정을 생략하지 않습니다 |
|
|
24
|
+
| 메타 약속 | 판정 사슬 자신을 지키는 등록 셋 |
|
|
25
|
+
| TTL 증인 | 유효 시간이 있는 인간의 증인 밸브입니다. 차단 판정 뒤에만 확인합니다 |
|
|
26
|
+
| 델타 층 | 파일의 전후 쌍에 대한 신규 위반 전용 판정 |
|
|
27
|
+
| 규율(discipline) 라이브러리 | 설정의 `disciplines:` 항목을 별도 사용자 코드 없이 판정합니다 |
|
|
28
|
+
|
|
29
|
+
<a id="disciplines-and-meta-covenants"></a>
|
|
30
|
+
## 규율 계열과 메타 약속
|
|
31
|
+
|
|
32
|
+
**`disciplines:` 항목은 선언 하나입니다.** 관측한 증거를 입력으로 받아 `judge = relate ∘ extract`를 계산합니다. 선언의 소스가 무엇을 묶는지가
|
|
33
|
+
판정에 필요한 증거를 정하고, 그것이 곧 어느 표면에서
|
|
34
|
+
판정될 수 있는지를 정합니다.
|
|
35
|
+
|
|
36
|
+
| 소스 | 판정 대상 | 필요한 증거 |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| 고정 이름 `target.path` · `pre` · `post` · `state` · `changes` | 변경 자체 | 파일 변경 |
|
|
39
|
+
| 고정 이름 `command` | 셸 호출의 명령줄 | 셸 호출입니다. Edit에는 없습니다 |
|
|
40
|
+
| `{ transcript: true }` | 세션 이력입니다. 이 호출 **앞에** 자격을 갖춘 호출이 실제로 실행됐는가 | 세션 |
|
|
41
|
+
| `{ file: … }` · `{ sidecar: true }` | 다른 파일, 또는 스폰 기록 채널 | 표면의 리더 |
|
|
42
|
+
|
|
43
|
+
이 항목들을 쓰는 가이드는 [설정 레퍼런스의 `disciplines` 절](../configuration/index.ko.md#disciplines)에
|
|
44
|
+
있습니다. 선언 문법은 코어의 `algebra-declaration.schema.json`입니다.
|
|
45
|
+
|
|
46
|
+
**메타 약속 셋**이 판정 사슬을 지킵니다. 다른 약속과 똑같은 약속이고, 아래 어휘가 그대로
|
|
47
|
+
적용됩니다.
|
|
48
|
+
|
|
49
|
+
| 등록 | 축 | 판정 대상 |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| self-mod | 도구 | 편집 도구를 통한 보호 경로 변형입니다. 호출의 증명된 변형 대상만 대조하므로, 편집 **내용** 안의 보호 경로는 언급이고 통과합니다 |
|
|
52
|
+
| shell-mod | 셸 | 같은 것을 명령줄로 합니다. 보호 경로를 언급하는 명령은 첫 낱말이 읽기 전용임을 증명할 때만 통과합니다 |
|
|
53
|
+
| transcript-mod | 대화 기록 | 라이브 세션 대화 기록에 대한 쓰기입니다. 전체 경로 **등가**로 판정하고 보호 조상으로는 결코 보지 않습니다 |
|
|
54
|
+
|
|
55
|
+
**낱말 여섯**이 텔레메트리 계약입니다. 판정 결과 다섯과 관측 하나입니다. `.polydeukes/roi.log`의
|
|
56
|
+
한 행은 이 중 정확히 하나를 담고, CLI와 문서와 테스트가 같은 사건에 같은 낱말을 씁니다.
|
|
57
|
+
행을 읽는 법은 [문제 해결](../../troubleshooting.ko.md#reading-verdict)에 있습니다.
|
|
58
|
+
|
|
59
|
+
| 판정 결과 | 뜻 |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `passed` | 호출이 판정됐고 약속을 지켰습니다 |
|
|
62
|
+
| `blocked` | 호출이 판정됐고 약속을 깼습니다 |
|
|
63
|
+
| `witnessed` | **차단된** 작업을 인간의 증언으로 허용했습니다. 위반이 없었다는 뜻이 아니며 허용 사실을 기록합니다 |
|
|
64
|
+
| `advised` | 호출을 멈추지 않고 위반을 기록했습니다. 두 표면 모두에서 규율 항목의 기본 처분이고, `adapters.git.enforce: advise`인 커밋 표면의 결과이기도 합니다 |
|
|
65
|
+
| `skipped` | 적용 범위가 일치했지만 판정할 수 없었습니다. **정상 판정이 아니라** 판정하지 못했다는 기록입니다 |
|
|
66
|
+
| `unattributed` | 보호 항목의 디스크 상태가 변했는데 그것을 설명하는 판정 기록이 없습니다. **판정이 아닙니다.** 이 행 때문에 차단되거나 통과하는 호출은 없으며, 세션 표면이 저장된 기준선과 상태를 대조한 뒤에 기록합니다 |
|
|
67
|
+
|
|
68
|
+
`unattributed`는 나머지 다섯이 답할 수 없는 물음에 답합니다. 다섯은 전부 판정기가 건네받은
|
|
69
|
+
호출에 관해 쓰는 낱말이라, 선언된 호출 없이 도착한 쓰기는 행을 하나도 남기지 않습니다.
|
|
70
|
+
인터프리터 안의 쓰기, 테스트 러너 자식 프로세스의 쓰기, 대상 경로를 자기 인자에서 조립하는
|
|
71
|
+
스크립트가 그런 경우입니다. 상태 대조는 철자가 아니라 결과를 관측하므로 그 쓰기를 사후에
|
|
72
|
+
기록합니다. 차단하지는 않습니다. 이미 일어난 쓰기이고, 대조는 판정의 양쪽 모두에서
|
|
73
|
+
fail-open입니다.
|
|
74
|
+
|
|
75
|
+
<a id="consumer-contract"></a>
|
|
76
|
+
## 사용자와의 접점
|
|
77
|
+
|
|
78
|
+
- **설정의 `disciplines:` 블록.** 항목 하나가 등록 하나로 컴파일되고 자기 텔레메트리
|
|
79
|
+
라벨을 답니다.
|
|
80
|
+
- **`protectedPaths`.** 경로 라우팅 디스패처가 여기에 대조합니다.
|
|
81
|
+
- **`witness` 블록.** TTL 증인 밸브를 설정합니다.
|
|
82
|
+
- **`.polydeukes/roi.log`.** 판정 기록을 추가하는 로그입니다.
|
|
83
|
+
|
|
84
|
+
일반 사용자가 직접 불러올 필요는 없습니다. 통합 패키지가 두 표면에 필요한 구성을 조립합니다.
|
|
85
|
+
|
|
86
|
+
<a id="limits"></a>
|
|
87
|
+
## 선언된 한계
|
|
88
|
+
|
|
89
|
+
- **셸 축은 `skipped` 행을 남기고, 그 행이 계약입니다.** 셸 명령의 대상을 텍스트에서
|
|
90
|
+
예측하는 일은 결정 불가능합니다. 그래서 이 축이 지키는 불변식은 "아무것도 빠져나가지
|
|
91
|
+
못한다"가 아니라 **기록 없이 통과하는 호출이 없다**입니다. 새로운 명령 형태가 `skipped`로 기록되면 판정하지 못한 한계를 확인할 수 있습니다. 행이 아예 없는
|
|
92
|
+
통과, 또는
|
|
93
|
+
판정하지 않고 `passed`로 기록된 통과가 결함입니다.
|
|
94
|
+
- **세션을 읽는 선언은 세션 없이 판정할 수 없습니다.** 커밋 표면에는 세션이 없습니다. 적용 범위가 일치한
|
|
95
|
+
`precedent`(그리고 대화 기록을 읽는 다른) 선언이 사유 `supply-pass`로 `skipped`를 남기는
|
|
96
|
+
것은 그 선언의 `supply`가 `pass`일 때뿐입니다. 정책이 없으면 없는 세션은 판정 불가(exit
|
|
97
|
+
2)로 처리하며 자동으로 건너뛰지 않습니다. 이 표면에서 세션 증거가 없다는 조건은 변하지 않습니다.
|
|
98
|
+
- **`command`를 적용 범위의 소스로 쓰는 선언은 커밋 표면에서 실행되지 않으며 기록도 남기지
|
|
99
|
+
않습니다.** 스테이징한 변경에는 명령줄이 없으므로 그 선언의 관측 대상이 되지 않습니다.
|
|
100
|
+
`.polydeukes/roi.log`에 아무것도 남지 않아서, 발동한 적 없는 명령 규율과 명령을 관측한 적
|
|
101
|
+
없는 표면의 규율을 로그로 가를 수 없습니다.
|
|
102
|
+
- **컴파일러가 해석하지 못하는 선언은 스킵 등록으로 컴파일됩니다.** 라우팅은 그대로 두고
|
|
103
|
+
본체를 두지 않습니다. 등재 표 밖의 단계, 단계의 키 밖의 인자, 컴파일되지 않는 패턴,
|
|
104
|
+
쌍/단일 불일치가 그 경우입니다. 그래서 조립은 예외를 던지지 않습니다. 해소되지 않는 항목
|
|
105
|
+
하나가 형제 항목과 메타 약속과 밸브까지 무너뜨리면, 그것을 일으킨 설정을 고칠 길이
|
|
106
|
+
사라지기 때문입니다. 예약 기전, 또는 카탈로그가 거부하는 축·관계는 다른 단계입니다.
|
|
107
|
+
`loadConfig`가 파일을 거부하고(exit 2) skip 행은 남지 않습니다. 판정 시점에 세계에 없는
|
|
108
|
+
소스는 세 번째 경우입니다. 선언 자신의 `supply` 정책이 처분하고, 정책이 없으면 본체가
|
|
109
|
+
판정 불가(exit 2)로 답합니다. 통과로 답하지 않습니다.
|
|
110
|
+
- **완전 봉쇄는 목표가 아닙니다.** 여기에 차단 목록은 없습니다. 우회 철자를 열거하는 일은
|
|
111
|
+
언제나 한 걸음 뒤지므로 논리를 뒤집었습니다. 보호 경로를 언급하면 안전이 증명되지 않는
|
|
112
|
+
한 차단합니다. 간접 경로 계산 같은 잔여 벡터는 차단 대상이 아니라 텔레메트리 대상입니다.
|
|
113
|
+
마찰 밸브 둘, 곧 읽기 전용 허용 목록과 TTL 증인은 둘 다 측정 가능한 흔적을 남깁니다.
|
|
114
|
+
- **밸브는 판정 뒤에 확인합니다.** 실제로 차단한 판정만 증언으로 열 수 있고, 문장 중간의 토큰
|
|
115
|
+
언급은 밸브를 무장시키지 않으며, AI는 자기 밸브를 결코 스스로 열 수 없습니다.
|