@litfamily/litgrok 1.0.2 → 1.0.3

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.
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { pendingReviewState } from '../skills/skill-observer/scripts/skill-loop.mjs';
4
3
  import { renderMark } from './lit-mark.mjs';
5
4
  import { claimSessionIgnition } from './record-passive-event.mjs';
6
5
 
@@ -20,18 +19,3 @@ try {
20
19
  }
21
20
 
22
21
  process.stdout.write('LitGrok payload present: skills, project rules, hooks, and the npx installer.\n');
23
-
24
- try {
25
- const sessionId = process.env.GROK_SESSION_ID || event.sessionId;
26
- const workspaceRoot = process.env.GROK_WORKSPACE_ROOT || event.workspaceRoot;
27
- if (!process.exitCode && sessionId && workspaceRoot && event.sessionId === sessionId && event.workspaceRoot === workspaceRoot) {
28
- const state = pendingReviewState({
29
- cwd: workspaceRoot,
30
- env: { ...process.env, LITGROK_WORKSPACE_ROOT: workspaceRoot },
31
- sessionId,
32
- });
33
- if (state.pending) process.stdout.write(`LitGrok: pending review for session ${sessionId} — run /skill-observer review\n`);
34
- }
35
- } catch {
36
- // The installed-payload banner is still useful when optional event state is unavailable.
37
- }
@@ -2,35 +2,27 @@
2
2
 
3
3
  // No completion-summary field is documented, so this records only the documented turn-end event and identity.
4
4
  import { appendSessionRecord, recordPassiveEvent } from './record-passive-event.mjs';
5
- import { recordTurnEnded } from '../skills/skill-observer/scripts/skill-loop.mjs';
6
5
  import { PLAN_GATE_SIGNAL, evaluatePlanGate } from './plan-gate.mjs';
7
6
 
8
- if (process.env.LITGROK_SKILL_REVIEW !== '1') {
9
- const observed = await recordPassiveEvent('Stop');
10
- if (observed) {
11
- recordTurnEnded({
12
- cwd: observed.environment.realWorkspaceRoot,
13
- env: { ...process.env, LITGROK_WORKSPACE_ROOT: observed.environment.realWorkspaceRoot },
7
+ const observed = await recordPassiveEvent('Stop');
8
+ if (observed) {
9
+ // Plan gate: a planning turn must persist plans/<slug>.md; evaluated after the ledger record so a block is counted.
10
+ let gate;
11
+ try {
12
+ gate = evaluatePlanGate({
13
+ event: observed.event,
14
+ workspaceRoot: observed.environment.realWorkspaceRoot,
14
15
  sessionId: observed.environment.sessionId,
16
+ ledgerFile: observed.ledgerFile,
15
17
  });
16
- // Plan gate: a planning turn must persist plans/<slug>.md; evaluated after the ledger record so a block is counted.
17
- let gate;
18
- try {
19
- gate = evaluatePlanGate({
20
- event: observed.event,
21
- workspaceRoot: observed.environment.realWorkspaceRoot,
22
- sessionId: observed.environment.sessionId,
23
- ledgerFile: observed.ledgerFile,
24
- });
25
- } catch (error) {
26
- process.stderr.write(`LitGrok plan gate: PLAN_GATE_FAILED ${error instanceof Error ? error.message : String(error)}\n`);
27
- gate = { block: false };
28
- }
29
- if (gate.block) {
30
- appendSessionRecord(observed.ledgerFile, observed.record, { signal: PLAN_GATE_SIGNAL, reason: gate.reason });
31
- process.stdout.write(`${JSON.stringify({ decision: 'block', reason: gate.reason })}\n`);
32
- } else if (gate.warning) {
33
- process.stderr.write(`${gate.warning}\n`);
34
- }
18
+ } catch (error) {
19
+ process.stderr.write(`LitGrok plan gate: PLAN_GATE_FAILED ${error instanceof Error ? error.message : String(error)}\n`);
20
+ gate = { block: false };
21
+ }
22
+ if (gate.block) {
23
+ appendSessionRecord(observed.ledgerFile, observed.record, { signal: PLAN_GATE_SIGNAL, reason: gate.reason });
24
+ process.stdout.write(`${JSON.stringify({ decision: 'block', reason: gate.reason })}\n`);
25
+ } else if (gate.warning) {
26
+ process.stderr.write(`${gate.warning}\n`);
35
27
  }
36
28
  }
@@ -48,7 +48,7 @@ A useful objective answers:
48
48
 
49
49
  Example:
50
50
 
51
- /goal Make the release check pass in 33_litgrok without changing the package version; done when npm test and npm pack --dry-run --json --ignore-scripts both exit 0 and the pack list contains only the approved payload.
51
+ /goal Make the release check pass in this package checkout without changing the package version; done when npm test and npm pack --dry-run --json --ignore-scripts both exit 0 and the pack list contains only the approved payload.
52
52
 
53
53
  The example is a command for the operator to run. It is not an invocation performed by this skill.
54
54
 
@@ -22,7 +22,7 @@ reader_projection: shared_rule
22
22
 
23
23
  LitGrok is a dependency-free package containing:
24
24
 
25
- - 34 Grok-native skill folders under `.grok/skills/`, including their owned references;
25
+ - 33 Grok-native skill folders under `.grok/skills/`, including their owned references;
26
26
  - a root-level `plugin.json` manifest declaring the shipped skill, agent, and hook surfaces;
27
27
  - 11 Grok-native agent definitions under `.grok/agents/`;
28
28
  - one project rule under `.grok/rules/`;
@@ -88,7 +88,7 @@ A working note can use this compact shape:
88
88
 
89
89
  Use the ledger only for chronology and identity checks. Confirm that the record's schema, session id, workspace root, hook name, and event name match the session being reviewed. Treat tool input hashes as identifiers, not as recoverable command text. A Stop record means a turn ended; it is not a completion receipt. A SubagentStop record means a boundary was observed; inspect the agent's own artifact before classifying its result.
90
90
 
91
- The separate skill-observer learning loop may have proposal or transaction files under .grok/litgrok. Those files concern skill review and rollback, not the user's work objective. Do not present them as a work ledger.
91
+ Older LitGrok versions may have left skill-review state under .grok/litgrok. Current hooks leave those files untouched; do not present them as a work ledger.
92
92
 
93
93
  ## Native features and explicit limits
94
94
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litgrok",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Grok Build skills, project rules, and bounded lifecycle hooks for evidence-first lit work.",
5
5
  "author": {
6
6
  "name": "LitGrok contributors"
@@ -39,7 +39,6 @@
39
39
  "./.grok/skills/refactor",
40
40
  "./.grok/skills/review-work",
41
41
  "./.grok/skills/rules",
42
- "./.grok/skills/skill-observer",
43
42
  "./.grok/skills/start-work",
44
43
  "./.grok/skills/structural-search",
45
44
  "./.grok/skills/visual-qa",
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 1.0.3
6
+
7
+ - Add an animated README cover with a static option for reduced motion.
8
+ - Remove automatic skill review because it never completed a review in practice. Leftover `pending-review.json` and `skill-loop-state.json` files are inactive and may be deleted; no other state is affected.
9
+ - Refuse to publish when the test suite fails.
10
+ - Remove the retired `skill-observer` skill and its empty directories during upgrades while preserving user-owned files. If a user-owned file is inside the retired directory, installation refuses and names its path.
11
+ - List all 33 skills, 11 agents, and 11 hooks in the marketplace manifest so plugin scanners can find every component.
12
+ - Remove the private checkout path from the `litgoal` example.
13
+
5
14
  ## 1.0.2
6
15
 
7
16
  - Add an explicit marketplace scanner manifest that enumerates all 34 skills, 11 agents, and the native hook manifest while preserving the existing Grok payload manifest.
package/README.md CHANGED
@@ -1,17 +1,18 @@
1
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/cover.webp" width="100%" alt="LitGrok v5 armory cover" /></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/cover.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/cover-motion.webp" width="100%" alt="LitGrok cover art. An orange signal moves through orbital paths above the GROK BUILD wordmark. The static family cover appears for reduced-motion preference." /></picture></p>
2
+ <p align="center"><a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/cover.webp">View the static cover</a></p>
2
3
 
3
4
  <h1 align="center">LitGrok</h1>
4
5
  <p align="center"><strong>Keep the work lit.</strong></p>
5
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-wordmark.svg" width="480" alt="LITGROK display type" /></p>
6
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-clay-icon.png" width="160" alt="LitGrok clay mark" /></p>
6
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-wordmark.svg" width="480" alt="LITGROK display type" /></p>
7
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-clay-icon.png" width="160" alt="LitGrok clay mark" /></p>
7
8
 
8
9
  Make something useful in Grok Build. Leave the checked result and the next step with your project.
9
10
 
10
11
  [한국어](./README_ko-KR.md) · [Install](#install-in-30-seconds) · [First use](#first-lit-use) · [Reference](./docs/reference.md)
11
12
 
12
13
  <p align="center">
13
- <a href="#install-in-30-seconds"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/readme/badge-version.svg" alt="1.0.2" /></a>
14
- <a href="./LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
14
+ <a href="#install-in-30-seconds"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/readme/badge-version.svg" alt="1.0.3" /></a>
15
+ <a href="./LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
15
16
  </p>
16
17
 
17
18
  <p align="center">
@@ -26,9 +27,9 @@ Make something useful in Grok Build. Leave the checked result and the next step
26
27
  >
27
28
  > **Leave something the next session can pick up.**
28
29
 
29
- It ships 34 skills, 11 agents, one project rule, and eleven hook registrations. The installer copies the complete payload into your project; Grok Build runs the session and owns model selection.
30
+ It ships 33 skills, 11 agents, one project rule, and eleven hook registrations. The installer copies the complete payload into your project; Grok Build runs the session and owns model selection.
30
31
 
31
- Package: **@litfamily/litgrok** · Version: **1.0.2** · [MIT](./LICENSE)
32
+ Package: **@litfamily/litgrok** · Version: **1.0.3** · [MIT](./LICENSE)
32
33
 
33
34
  The scientific visualization corpus is packaged at `.grok/vendor/scientific-visualization/`; the numeric `045_scientific-visualization` label remains only in license and provenance filenames.
34
35
 
@@ -52,7 +53,7 @@ Grok Build uses the explicit `/litwork` route for a bounded task. It owns model
52
53
 
53
54
  In Grok Build, `/litwork` starts the bounded work checklist; `handoff` or `/lit-handoff` carries the checked result and next step; `/lit-plan` records a plan with checks; `/start-work <approved-plan>` executes that plan; `/review-work` inspects the change and its evidence; and `/litresearch` runs bounded, source-traceable research. The expected effect is a resumable, checked project record. The host limit is explicit: Grok Build owns execution and model selection, while LitGrok installs the `.grok` payload; hooks require a trusted Git root and a plain folder may load skills and rules without hooks. These images are static route cues, not proof of live host behavior.
54
55
 
55
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-ignition-1600.webp" width="48%" alt="LitGrok ignition apparatus" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-continuity-1600.webp" width="48%" alt="LitGrok continuity apparatus" /></p>
56
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-ignition-1600.webp" width="48%" alt="LitGrok ignition apparatus" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-continuity-1600.webp" width="48%" alt="LitGrok continuity apparatus" /></p>
56
57
 
57
58
  <p align="center"><a href="./docs/assets/readme/ignition-film.mp4"><img src="./docs/assets/readme/ignition-poster.png" width="720" alt="Ignition motion poster" /></a></p>
58
59
 
@@ -75,7 +76,7 @@ LITGROK_PACK='/absolute/path/to/the-provided-package.tgz'
75
76
  npm exec --yes --package "$LITGROK_PACK" -- litgrok install
76
77
  ```
77
78
 
78
- The default destination is `<project>/.grok/`. Use `--package @litfamily/litgrok@1.0.2` for a pinned install, or add `--user` to install under `~/.grok/`. [Install and upgrade details](./docs/reference.md#install).
79
+ The default destination is `<project>/.grok/`. Use `--package @litfamily/litgrok@1.0.3` for a pinned install, or add `--user` to install under `~/.grok/`. [Install and upgrade details](./docs/reference.md#install).
79
80
 
80
81
  Project hooks need a trusted Git project root in Grok Build. A plain folder can still load the installed skills and rules while hooks remain unavailable. For a new disposable project, run `git init` yourself before trusting it; for an existing repository, open Grok Build from its actual root. The installer never runs `git init` or changes trust. In the observed Grok Build 1.0.23 host, `grok --trust inspect --json` accepted the trust-and-inspect route even though `--trust` was omitted from `grok --help`; this is version-specific behavior.
81
82
 
@@ -142,7 +143,7 @@ The hooks' `.grok/litgrok/session-ledger/` records event order. Judge success fr
142
143
  | Review a change and its evidence | [`/review-work`](./.grok/skills/review-work/SKILL.md) |
143
144
  | Leave a resumable handoff | [`/lit-handoff`](./.grok/skills/lit-handoff/SKILL.md) |
144
145
 
145
- Use `/skills` for all 34 skills. [Rename compatibility](./docs/reference.md#skill-rename-compatibility) covers the one-release aliases; old slash routes are not guaranteed.
146
+ Use `/skills` for all 33 skills. [Rename compatibility](./docs/reference.md#skill-rename-compatibility) covers the one-release aliases; old slash routes are not guaranteed.
146
147
 
147
148
  ## Safety and uninstall
148
149
 
@@ -172,7 +173,6 @@ Match the scope used for installation. Re-run `install` to update. The installer
172
173
  ## Documentation
173
174
 
174
175
  - [Operational reference](./docs/reference.md): installation, hooks, terminal output, payload checks, and source provenance.
175
- - [Skill learning loop](./docs/reference.md#skill-learning-loop): proposal review, explicit apply, rollback, and macOS/Linux support. Windows learning-loop commands are unsupported.
176
176
  - [Project rule](./.grok/rules/00-litgrok.md) and [skill catalog](./.grok/skills/).
177
177
  - [Changelog](./CHANGELOG.md) and [license](./LICENSE).
178
178
 
package/README_ko-KR.md CHANGED
@@ -1,17 +1,18 @@
1
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/cover.webp" width="100%" alt="LitGrok v5 armory cover" /></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/cover.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/cover-motion.webp" width="100%" alt="LitGrok cover art. An orange signal moves through orbital paths above the GROK BUILD wordmark. The static family cover appears for reduced-motion preference." /></picture></p>
2
+ <p align="center"><a href="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/cover.webp">정지 표지 보기</a></p>
2
3
 
3
4
  <h1 align="center">LitGrok</h1>
4
5
  <p align="center"><strong>Keep the work lit.</strong></p>
5
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-wordmark.svg" width="480" alt="LITGROK 디스플레이 타입" /></p>
6
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-clay-icon.png" width="160" alt="LitGrok 클레이 마크" /></p>
6
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-wordmark.svg" width="480" alt="LITGROK 디스플레이 타입" /></p>
7
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-clay-icon.png" width="160" alt="LitGrok 클레이 마크" /></p>
7
8
 
8
9
  Grok Build에서 작은 결과물을 만들고, 확인한 내용과 다음 할 일을 프로젝트에 남기세요.
9
10
 
10
11
  [English](./README.md) · [설치](#30초-설치) · [처음 사용하기](#첫-lit-작업) · [상세 안내](./docs/reference_ko-KR.md)
11
12
 
12
13
  <p align="center">
13
- <a href="#30초-설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/readme/badge-version.svg" alt="1.0.2" /></a>
14
- <a href="./LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/readme/badge-license.svg" alt="MIT 라이선스" /></a>
14
+ <a href="#30초-설치"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/readme/badge-version.svg" alt="1.0.3" /></a>
15
+ <a href="./LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/readme/badge-license.svg" alt="MIT 라이선스" /></a>
15
16
  </p>
16
17
 
17
18
  <p align="center">
@@ -26,9 +27,9 @@ Grok Build에서 작은 결과물을 만들고, 확인한 내용과 다음 할
26
27
  >
27
28
  > **대화가 끝난 자리에서, 다음 작업이 시작되도록.**
28
29
 
29
- skill 34개, agent 11개, project rule 하나, hook 등록 열한 개를 제공합니다. Installer가 프로젝트에 전체 파일을 복사하고, 세션 실행과 모델 선택은 Grok Build가 담당합니다.
30
+ skill 33개, agent 11개, project rule 하나, hook 등록 열한 개를 제공합니다. Installer가 프로젝트에 전체 파일을 복사하고, 세션 실행과 모델 선택은 Grok Build가 담당합니다.
30
31
 
31
- 패키지: **@litfamily/litgrok** · 버전: **1.0.2** · [MIT](./LICENSE)
32
+ 패키지: **@litfamily/litgrok** · 버전: **1.0.3** · [MIT](./LICENSE)
32
33
 
33
34
  과학 시각화 corpus는 `.grok/vendor/scientific-visualization/`에 포함되며, 숫자 `045_scientific-visualization` 표기는 라이선스와 provenance 파일명에만 남습니다.
34
35
 
@@ -52,7 +53,7 @@ Grok Build에서는 명시적인 `/litwork` 경로로 작은 작업을 시작합
52
53
 
53
54
  Grok Build에서 `/litwork`는 범위를 정한 작업 체크리스트를 시작하고, `handoff` 또는 `/lit-handoff`는 확인한 결과와 다음 단계를 건네며, `/lit-plan`은 확인 기준이 있는 계획을 남기고, `/start-work <승인된 계획>`은 그 계획을 실행하며, `/review-work`는 변경과 근거를 검토하고, `/litresearch`는 출처를 추적할 수 있는 범위 있는 조사를 합니다. 기대하는 효과는 확인 결과를 남기고 다음 세션에서 이어갈 수 있는 프로젝트 기록입니다. 호스트 제약도 분명합니다. 실행과 모델 선택은 Grok Build가 담당하고 LitGrok은 `.grok` payload를 설치합니다. Hook은 신뢰한 Git root에서만 제공되며, 일반 폴더에서는 skill과 rule만 로드되고 hook은 없을 수 있습니다. 이 이미지는 실제 호스트 동작을 증명하지 않는 정적 경로 안내입니다.
54
55
 
55
- <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-ignition-1600.webp" width="48%" alt="LitGrok 점화 장치" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.2/docs/assets/litgrok-continuity-1600.webp" width="48%" alt="LitGrok 연속 장치" /></p>
56
+ <p align="center"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-ignition-1600.webp" width="48%" alt="LitGrok 점화 장치" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litgrok@1.0.3/docs/assets/litgrok-continuity-1600.webp" width="48%" alt="LitGrok 연속 장치" /></p>
56
57
 
57
58
  <p align="center"><a href="./docs/assets/readme/ignition-film.mp4"><img src="./docs/assets/readme/ignition-poster.png" width="720" alt="Ignition 모션 포스터" /></a></p>
58
59
 
@@ -75,7 +76,7 @@ LITGROK_PACK='/absolute/path/to/the-provided-package.tgz'
75
76
  npm exec --yes --package "$LITGROK_PACK" -- litgrok install
76
77
  ```
77
78
 
78
- 기본 설치 위치는 `<project>/.grok/`입니다. 버전을 고정하려면 `--package @litfamily/litgrok@1.0.2`를 사용하세요. `--user`를 붙이면 `~/.grok/`에 설치합니다. [설치·업데이트 상세 안내](./docs/reference_ko-KR.md#설치).
79
+ 기본 설치 위치는 `<project>/.grok/`입니다. 버전을 고정하려면 `--package @litfamily/litgrok@1.0.3`를 사용하세요. `--user`를 붙이면 `~/.grok/`에 설치합니다. [설치·업데이트 상세 안내](./docs/reference_ko-KR.md#설치).
79
80
 
80
81
  Project hook은 Grok Build에서 신뢰한 Git 프로젝트 루트가 있어야 발견됩니다. 일반 폴더에서도 설치된 skill과 rule은 로드될 수 있지만 hook은 0개로 남을 수 있습니다. 새 disposable project라면 사용자가 직접 `git init`을 실행한 뒤 trust를 허용하세요. 기존 저장소라면 실제 root에서 Grok Build를 여세요. Installer는 `git init`을 실행하거나 trust를 바꾸지 않습니다. 관찰된 Grok Build 1.0.23에서는 `grok --trust inspect --json`이 동작했지만 `grok --help`에는 global `--trust`가 표시되지 않았습니다. 이는 이 버전에서 확인한 동작입니다.
81
82
 
@@ -142,7 +143,7 @@ Hook의 `.grok/litgrok/session-ledger/`는 이벤트가 발생한 순서를 남
142
143
  | 변경 내용과 근거 검토 | [`/review-work`](./.grok/skills/review-work/SKILL.md) |
143
144
  | 다음 세션을 위한 인수인계 | [`/lit-handoff`](./.grok/skills/lit-handoff/SKILL.md) |
144
145
 
145
- 전체 skill 34개는 `/skills`에서 확인하세요. 이전 이름을 한 릴리스 동안 별칭으로 유지하는 정책은 [이름 변경과 호환성](./docs/reference_ko-KR.md#skill-이름-변경과-호환성)을 보세요. 이전 slash 경로는 보장되지 않습니다.
146
+ 전체 skill 33개는 `/skills`에서 확인하세요. 이전 이름을 한 릴리스 동안 별칭으로 유지하는 정책은 [이름 변경과 호환성](./docs/reference_ko-KR.md#skill-이름-변경과-호환성)을 보세요. 이전 slash 경로는 보장되지 않습니다.
146
147
 
147
148
  ## 안전과 제거
148
149
 
@@ -172,7 +173,6 @@ npm exec --yes --package @litfamily/litgrok@latest -- litgrok uninstall --user
172
173
  ## 문서
173
174
 
174
175
  - [상세 안내](./docs/reference_ko-KR.md): 설치, hook, 터미널 출력, 패키지 검증, 출처.
175
- - [Skill learning loop](./docs/reference_ko-KR.md#skill-learning-loop): proposal 검토, 명시적 적용, rollback, macOS/Linux 지원. Windows의 learning-loop 명령은 지원하지 않습니다.
176
176
  - [Project rule](./.grok/rules/00-litgrok.md)과 [skill 목록](./.grok/skills/).
177
177
  - [변경 이력](./CHANGELOG.md)과 [라이선스](./LICENSE).
178
178
 
package/bin/litgrok.mjs CHANGED
@@ -46,6 +46,7 @@ const PRE_MANIFEST_PAYLOAD_HASHES = Object.freeze({
46
46
  'agents/litgrok-quality-reviewer.md': 'ed6f2687770f0f31c6821f0ad49d717362807f0bb5f4f27cf4d36be1e7dfd5a2',
47
47
  'hooks/record-passive-event.mjs': '9f5bd1d6c8b8e6c0be4cc61cf31f0e26f4f8a41fceb826e88567f22efa2b0090',
48
48
  'hooks/session-start.mjs': '5706ccce58340e78e435b9c1fd2224e101872ce1d0f51a9d187feb31b67c3b5d',
49
+ 'hooks/stop.mjs': 'c796f02ac3dc99716d0c2f478bf93ec35cd8a9c725de18d12895957ee261b9c3',
49
50
  'rules/00-litgrok.md': 'd46d1672e80250c8748458afa9b0fc1a46c2a318d31c4d58ab1ebc3f8f2eb804',
50
51
  'skills/autoconference/SKILL.md': '025e9420ed9986b0466a8d660a4ed7f3e2d2243051ed3622be8ca87cbeba9458',
51
52
  'skills/autoconference/references/_canonical-corpus/manifest.json': '4554ee4041b73577a844abc27a97db91e941b8412f1888209203251dc1fee500',
@@ -59,6 +60,7 @@ const PRE_MANIFEST_PAYLOAD_HASHES = Object.freeze({
59
60
  'skills/lit-handoff/SKILL.md': '7152d6399fd778ab3d16e1abad2ec97e2f4be4350cd3993cdde038cc1211dd80',
60
61
  'skills/lit-scientific-visualization/SKILL.md': 'ffc3b2ea49dd7e7c4c7d4568f289df294a3a30f953c11039f98aaf6f8fb983ee',
61
62
  'skills/lit-scientific-visualization/scripts/verify-canonical-corpus.mjs': 'a1cfe0578195098dc4afc2d25f0d391f38aeaa57cd3970fa7dca51e20cbf929d',
63
+ 'skills/litgoal/SKILL.md': 'e3fd76a8f4c91903ab85073b492f3981f76cb17644b840ba22d2a1c5e82178a9',
62
64
  'skills/litgrok/SKILL.md': '6ea1fb66d5a1458e182cff5808ccc416487dbbad0341988bcda0f247645081e2',
63
65
  'skills/litwork/SKILL.md': '771b7cead03c0d1d1e67af82e308ea0980b8ab18474026516798f559048beda7',
64
66
  'skills/lsp-setup/SKILL.md': '313ffd924f00a1523905d2588e0812c8edcaec84b114d2d487506bd905e5376d',
@@ -66,8 +68,6 @@ const PRE_MANIFEST_PAYLOAD_HASHES = Object.freeze({
66
68
  'skills/refactor/SKILL.md': '5fd2df1a36eae216f8af4db09e7e7d26231b167907ad19c49465153a1dcadde0',
67
69
  'skills/review-work/SKILL.md': 'acfef3ff9c6e243cb9b88169a67e749e27a2e530af09aed07a2d66dd932c3b5d',
68
70
  'skills/rules/SKILL.md': 'b880136962faeb3dea93cc42e30f5d3cc461a03fe71f7ff908d4b09170c38c5f',
69
- 'skills/skill-observer/scripts/skill-loop.mjs': '3f3f5265928c0d71175b0f23f71b836d1dc05e7efba407bfdc2d263c6aaed0ce',
70
- 'skills/skill-observer/scripts/validate-skills.mjs': 'cd71e88c45e57869114305f048257f3da7ec1dfa66f70d9529314defb5fa1a97',
71
71
  'skills/start-work/SKILL.md': 'ddc7357f99c78cd3405c1cb0202f9b13871efbe59f365e9f39727c429791028b',
72
72
  'skills/structural-search/SKILL.md': '3bbc13b5d0df58fbae07dd53e7ecbf13f311f12311cc3bd313803d63bd331ee0',
73
73
  'skills/visual-qa/references/complete-contract.md': '9562a993b9fc75f8cda5e5f810ff534590f4ace36e696bf60119c0b27ba19cd5',
@@ -152,13 +152,19 @@ const PRE_MANIFEST_LEGACY_PAYLOAD_HASHES = Object.freeze({
152
152
  'skills/programming/references/typescript/type-patterns.md': 'a21e27706f5d1e60be8f37d2d47949d0759158c999c4a08628f5f925b184d946',
153
153
  'skills/programming/references/worked-cases.md': 'ccb6fb8011cda2391d73c4f85ffc3b8038486d77134b986b046d1f62a2f7a9d2',
154
154
  'skills/remove-ai-slops/SKILL.md': 'db2f9e91dfd70a2077a091d1c422cba9f6d576af58868df4279d0e7542c29380',
155
+ 'skills/skill-observer/SKILL.md': '1edf489673d958b3a7c60c5e1a036498510a02859dcf32e68a6d50b21f2fa344',
156
+ 'skills/skill-observer/references/review-contract.md': 'f55dc8334f3b8d8498c84d57725fa03af8fbd689b2dd7cce25e49931629ee54f',
157
+ 'skills/skill-observer/scripts/curator.mjs': '07f48d2160ba64584acd17ae9bd55efd6272546722576c288725b8850e3f0455',
158
+ 'skills/skill-observer/scripts/review.mjs': '5b79fedae7f7c4d2b6d898717ae427bae1bd6d2c7f9f4bbc2f410f86468f7691',
159
+ 'skills/skill-observer/scripts/skill-loop.mjs': '3f3f5265928c0d71175b0f23f71b836d1dc05e7efba407bfdc2d263c6aaed0ce',
160
+ 'skills/skill-observer/scripts/validate-skills.mjs': 'cd71e88c45e57869114305f048257f3da7ec1dfa66f70d9529314defb5fa1a97',
155
161
  'skills/teammode/SKILL.md': '23db7152e2ce65cb5f7c52455d6cbd122485bb0fdb13813a8a54b824e8e44f08',
156
162
  'skills/teammode/references/explore-packet.md': 'c419c1c84783ddfae272e378c4f7e623ec4fbb437168d2d5cb8436baf4c14e30',
157
163
  'skills/teammode/references/general-purpose-packet.md': '45ad9cf82157563ebb20af360bb0b09d7afd7aa0fe114a91816523475ebdc88c',
158
164
  'skills/teammode/references/plan-packet.md': '68e292f9a6dc64f7e87a45417d5f92688aac9c2ffb7b519f9e2cab10b5ef4759',
159
165
  'skills/text-naturalization/SKILL.md': 'aa1ff8f68ab0bf71cb47818b536c4a2934da65adb413ee43ec5839b540b2df8e',
160
166
  });
161
- const USAGE = 'Usage: litgrok [install|uninstall] [--user|--project] [--dry-run] [--no-color] [--yes]\n litgrok skill-loop <review|propose|list|apply|reject|rollback|curator> ...\n';
167
+ const USAGE = 'Usage: litgrok [install|uninstall] [--user|--project] [--dry-run] [--no-color] [--yes]\n';
162
168
  const BRAILLE_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
163
169
  const SPINNER_INTERVAL_MS = 80;
164
170
  const CLEAR_LINE = '\r\u001b[2K';
@@ -324,7 +330,7 @@ function receiptCard(options, root, colors, { status, written, current }) {
324
330
  ].join('\n');
325
331
  }
326
332
 
327
- function failureCard(options, root, colors, step, message) {
333
+ function failureCard(options, root, colors, step, message, { showHookTrust = true } = {}) {
328
334
  return [
329
335
  '',
330
336
  ` ${paint('╭─ INSTALL FAILED', '38;2;230;60;60', colors)}`,
@@ -332,9 +338,11 @@ function failureCard(options, root, colors, step, message) {
332
338
  ` │ Scope: ${scopeDescription(options, root)}`,
333
339
  ` │ Step: ${step}`,
334
340
  ` │ Reason: ${message}`,
335
- ' │ Hooks: project hooks require trust from a Git project root',
336
- ' │ Trust: use /hooks-trust or, on Grok Build 1.0.13, grok --trust inspect --json',
337
- ' │ Installer never runs git init or changes trust',
341
+ ...(showHookTrust ? [
342
+ ' │ Hooks: project hooks require trust from a Git project root',
343
+ ' │ Trust: use /hooks-trust or, on Grok Build 1.0.13, grok --trust inspect --json',
344
+ ' │ Installer never runs git init or changes trust',
345
+ ] : []),
338
346
  ' │ Next: resolve the issue and rerun the install',
339
347
  ` ${paint('╰─', '38;2;230;60;60', colors)}`,
340
348
  '',
@@ -348,7 +356,9 @@ function errorText(error) {
348
356
  function reportFailure(error, { stderr, stdout, options, root, colors, step }) {
349
357
  const lines = Array.isArray(error?.stderrLines) ? error.stderrLines : [`litgrok: ${errorText(error)}`];
350
358
  for (const line of lines) stderr.write(`${line}\n`);
351
- stdout.write(failureCard(options, root, colors, error?.step ?? step, errorText(error)));
359
+ stdout.write(failureCard(options, root, colors, error?.step ?? step, errorText(error), {
360
+ showHookTrust: error?.legacyOwnershipConflict !== true,
361
+ }));
352
362
  }
353
363
 
354
364
  function normalizedRelativePath(relativePath) {
@@ -489,6 +499,12 @@ function retiredPayload(root, files, manifest) {
489
499
  const hashes = new Map([...previous].filter(([path]) => !currentPaths.has(path) && retiredPath(path)));
490
500
  for (const path of agentPaths) if (!hashes.has(path)) hashes.set(path, undefined);
491
501
  const directories = [];
502
+ const retiredSkillRoots = new Set(
503
+ [...hashes.keys()]
504
+ .filter((path) => path.startsWith('skills/'))
505
+ .map((path) => path.split('/').slice(0, 2).join('/'))
506
+ .filter((path) => !currentPaths.has(`${path}/SKILL.md`)),
507
+ );
492
508
 
493
509
  function visit(path) {
494
510
  const target = join(root, path);
@@ -511,7 +527,7 @@ function retiredPayload(root, files, manifest) {
511
527
  }
512
528
  directories.push(target);
513
529
  }
514
- for (const path of skillRoots) visit(path);
530
+ for (const path of new Set([...skillRoots, ...retiredSkillRoots])) visit(path);
515
531
  for (const path of vendorRoots) visit(path);
516
532
  const entries = [...hashes].map(([relativePath, expectedHash]) => ({ root, relativePath, expectedHash, target: join(root, relativePath) }));
517
533
  return { entries, directories };
@@ -690,10 +706,6 @@ export async function run(args, context = {}) {
690
706
  stdout.write(`${renderMark({ size: 'banner', productName: `grok v${packageVersion()}`, env, isTTY: stdout.isTTY, args }).join('\n')}\n\n${USAGE}`);
691
707
  return 0;
692
708
  }
693
- if (args[0] === 'skill-loop') {
694
- const { runSkillLoop } = await import('../.grok/skills/skill-observer/scripts/skill-loop.mjs');
695
- return runSkillLoop(args.slice(1), { cwd, env, stderr, stdout });
696
- }
697
709
  const options = parseInstall(args);
698
710
  if (!options) {
699
711
  stderr.write(USAGE);
@@ -792,7 +804,13 @@ export async function run(args, context = {}) {
792
804
  if (owned[index] === 'conflict') stderrLines.push(`Refusing to ${options.command === 'install' ? 'overwrite' : 'remove'} different existing file: ${files[index].target}`);
793
805
  }
794
806
  for (let index = 0; index < legacyEntries.length; index += 1) {
795
- if (legacyStates[index] === 'conflict') stderrLines.push(`Refusing to ${options.command === 'install' ? 'overwrite' : 'remove'} different existing file: ${legacyEntries[index].target}`);
807
+ if (legacyStates[index] !== 'conflict') continue;
808
+ const entry = legacyEntries[index];
809
+ const retiredSkill = retiredDirectories.some((directory) => (
810
+ directory.startsWith(`${join(root, 'skills')}${sep}`) && entry.target.startsWith(`${directory}${sep}`)
811
+ ));
812
+ const retiredDirectory = retiredSkill ? 'the retired skill directory' : 'the retired payload directory';
813
+ stderrLines.push(`Refusing legacy conflict: ${entry.target} is not package-owned. Move it out of ${retiredDirectory} or remove it yourself, then rerun the install so the directory can be cleaned.`);
796
814
  }
797
815
  const legacyDetail = legacyEntries.length === 0
798
816
  ? ''
@@ -800,6 +818,7 @@ export async function run(args, context = {}) {
800
818
  const error = new Error(`${counts.missing} missing · ${counts.current} already-current · ${counts.owned} owned · ${counts.conflicts} conflicts${legacyDetail}`);
801
819
  error.step = 'OWNERSHIP';
802
820
  error.stderrLines = stderrLines;
821
+ error.legacyOwnershipConflict = legacyCounts.conflicts > 0;
803
822
  throw error;
804
823
  }
805
824
  const legacyDetail = legacyEntries.length === 0
Binary file
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="local: 1.0.2"><title>local: 1.0.2</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="290" transform="scale(.1)">local</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.2</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="local: 1.0.3"><title>local: 1.0.3</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="290" transform="scale(.1)">local</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.3</text></g></svg>
package/docs/privacy.md CHANGED
@@ -4,9 +4,7 @@ This describes package source behavior, not Grok or a model provider's privacy p
4
4
 
5
5
  Passive hooks in `.grok/hooks/record-passive-event.mjs` read hook JSON and record session identity, cwd/workspace paths, event names and time, optional prompt IDs, and tool names with input digests. They inspect optional prompt text for planning activation without persisting raw prompt/tool input in those passive records. Hashed filenames do not anonymize the JSON: records retain the session ID. The hedge guard examines proposed paths and content; Stop may record a plan-gate reason.
6
6
 
7
- Project `.grok/litgrok/` can contain session ledgers, pending reviews, proposals, usage data, skill ledgers, and full-content snapshot blobs. The learning loop also uses user `.grok/litgrok/` transaction, staging, and archive data. Proposals can contain rationale, references, and proposed skill text. Approved applications target user skills. These files may reveal project information even when they contain no credentials.
8
-
9
- An explicitly requested `skill-loop review` runs `grok export`, scrubs known secret patterns, bounds the transcript excerpt to 64 KiB, and passes it with eligible skill content and session/root references to `grok --single`. This source path is in `.grok/skills/skill-observer/scripts/review.mjs`. Grok may send that input to its configured provider. The prompt is also passed as a command-line argument and may be visible to local process inspection. Pattern-based scrubbing is not a guarantee that all sensitive information is removed. Inspect the source and data before requesting a review of sensitive work. Disabled review tools and web search do not imply offline model execution.
7
+ Project `.grok/litgrok/` contains package-owned session ledgers and may contain other generated data from installed or older package versions. Older skill-review state is no longer read, migrated, rewritten, or deleted by LitGrok; it remains inert for the owner to manage.
10
8
 
11
9
  Optional helpers may invoke Grok or external scientific tools; their behavior and dependencies remain separate. No blanket claim that all package-guided work stays offline is made.
12
10
 
package/docs/reference.md CHANGED
@@ -35,7 +35,7 @@ flowchart TD
35
35
 
36
36
  ## What it is
37
37
 
38
- - 34 Grok-native skill documents at `.grok/skills/<name>/SKILL.md`.
38
+ - 33 Grok-native skill documents at `.grok/skills/<name>/SKILL.md`.
39
39
  - A project rule at `.grok/rules/00-litgrok.md`.
40
40
  - A bounded `SessionStart` hook that prints the standard mark once per validated session and announces the installed payload.
41
41
  - A `PreToolUse` hook that rejects hedge phrasing in pending reader-facing writes while skipping quoted state enums, JSON/YAML scalars, fenced code, and status tables. The host treats only an explicit deny with exit 2 as blocking; exit 0 allows, while timeouts, crashes, and malformed output fail-open and the write proceeds.
@@ -62,10 +62,10 @@ flowchart LR
62
62
  HK --> PLAN --> LEDGER
63
63
  HK --> HEDGE
64
64
  RL --> LG
65
- LG --> S["34 skills · 11 agents"]
65
+ LG --> S["33 skills · 11 agents"]
66
66
  ```
67
67
 
68
- > **A narrow host boundary.** `plugin.json` exposes the package, hooks feed the plan gate and hedge guard, and rules provide project guidance while the session ledger records bounded state. Together these surfaces carry LitGrok’s 34 skills and 11 agents into Grok Build.
68
+ > **A narrow host boundary.** `plugin.json` exposes the package, hooks feed the plan gate and hedge guard, and rules provide project guidance while the session ledger records bounded state. Together these surfaces carry LitGrok’s 33 skills and 11 agents into Grok Build.
69
69
 
70
70
  ## Install
71
71
 
@@ -76,7 +76,7 @@ npm exec --yes --package @litfamily/litgrok@latest -- litgrok install
76
76
  Pin a version when you need a reproducible install:
77
77
 
78
78
  ```bash
79
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok install
79
+ npm exec --yes --package @litfamily/litgrok@1.0.3 -- litgrok install
80
80
  ```
81
81
 
82
82
  Preview without writing files:
@@ -201,8 +201,7 @@ ls ~/.grok/hooks/session-start.json ~/.grok/hooks/deliverable-hedge-guard.json
201
201
 
202
202
  The session mark uses an atomic, empty `.ignited` marker beside the package-owned
203
203
  session ledger under `.grok/litgrok/session-ledger/`. Replayed or concurrent
204
- SessionStart events keep the presence and pending-review notices without repeating
205
- the mark. Invalid session identity or unsafe marker state fails before mark output.
204
+ SessionStart events keep the presence notice without repeating the mark. Invalid session identity or unsafe marker state fails before mark output.
206
205
  Grok has no per-activation logo hook. The five existing skill activation contracts
207
206
  ask the model to begin with exactly one `▲ LIT · <discipline>` probe line; `litwork`
208
207
  declares the same advisory line with explicit once-per-request and quoted-content
@@ -210,26 +209,9 @@ exclusions. The SessionStart script writes its standard mark to stdout; this
210
209
  prompt requirement is separate from that script output. No hook or parser
211
210
  deterministically routes bare `lit`, and native host display remains unverified.
212
211
 
213
- ## Skill learning loop
212
+ ## Previous review state
214
213
 
215
- LitGrok can turn a durable correction or reusable workflow signal into a reviewable skill proposal. `Stop` records only bounded per-session turn state, and `SessionStart` may add one pending-review notice after its existing payload banner. Neither hook starts a model. The model-backed review runs only when the user invokes `/skill-observer review` or the foreground `skill-loop review` CLI; it exports the selected session, builds a bounded secret-scrubbed packet, disables child tools, and enforces a bounded 65-second process budget (5 seconds for export and 60 seconds for the model) with a recursion guard.
216
-
217
- The learning loop is currently supported on macOS and Linux. On Windows, `/skill-observer review` and every `skill-loop` command fail before subprocess launch, project learning-state access, or user-skill access with `WINDOWS_SKILL_LOOP_UNSUPPORTED`. The passive hooks and installer remain available; native Windows learning-loop support requires a dedicated ACL and process-job helper and is not claimed by this release.
218
-
219
- Review is proposal-only. `autoApply` is always false, transcript text is inert data, and nothing changes until the user explicitly runs `apply <proposal-id>`. Pending proposals, content-addressed ledger entries, and rollback blobs stay in the installed project's `.grok/litgrok/` state. An approved skill is created or patched only under `$HOME/.grok/skills/<name>/` and carries `metadata: { litgrokAgentGenerated: "true" }`. Packaged skills, project payload targets, symlinks, and existing user skills without that marker are protected.
220
-
221
- From an installed project, use the package CLI directly when you want a replayable foreground command:
222
-
223
- ```bash
224
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop review <session-id>
225
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop list
226
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop apply <proposal-id>
227
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop reject <proposal-id>
228
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop rollback <ledger-id>
229
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop curator
230
- ```
231
-
232
- `apply` prints the ledger id needed for rollback. The deterministic curator is also user-invoked: by default it runs at most once every seven days, requires at least two idle hours, marks eligible unpinned agent-owned skills stale after 30 idle days, and archives them outside discovery after 90 idle days. It makes a full backup before a transition and never deletes a skill package; `--force` bypasses only the seven-day run interval for an explicit test or maintenance invocation.
214
+ LitGrok no longer schedules skill reviews or reads, migrates, rewrites, or deletes their old project or user state. Existing review files remain inert and are left for their owners to manage.
233
215
 
234
216
  ## Verify
235
217
 
@@ -35,7 +35,7 @@ flowchart TD
35
35
 
36
36
  ## 무엇을 제공하나요?
37
37
 
38
- - `.grok/skills/<name>/SKILL.md`에 Grok-native skill 문서 34개
38
+ - `.grok/skills/<name>/SKILL.md`에 Grok-native skill 문서 33개
39
39
  - `.grok/rules/00-litgrok.md` project rule
40
40
  - 설치된 payload를 짧게 알리는 `SessionStart` hook
41
41
  - reader-facing write의 hedge 표현을 차단하되 quoted state enum, JSON/YAML scalar, fenced code, status table은 제외하는 `PreToolUse` hook. Host는 명시적인 deny와 exit 2만 차단으로 처리합니다. exit 0은 허용이고 timeout, crash, malformed output은 fail-open이므로 write가 진행됩니다.
@@ -62,10 +62,10 @@ flowchart LR
62
62
  HK --> PLAN --> LEDGER
63
63
  HK --> HEDGE
64
64
  RL --> LG
65
- LG --> S["34 skills · 11 agents"]
65
+ LG --> S["33 skills · 11 agents"]
66
66
  ```
67
67
 
68
- > **Host 경계는 좁고 명확합니다.** `plugin.json`이 package를 노출하고, hook은 plan gate와 hedge guard로 연결되며, rule은 project guidance가 됩니다. session ledger에는 bounded state를 기록하고, 이 표면들이 34개 skill과 11개 agent를 Grok Build에서 사용할 수 있게 합니다.
68
+ > **Host 경계는 좁고 명확합니다.** `plugin.json`이 package를 노출하고, hook은 plan gate와 hedge guard로 연결되며, rule은 project guidance가 됩니다. session ledger에는 bounded state를 기록하고, 이 표면들이 33개 skill과 11개 agent를 Grok Build에서 사용할 수 있게 합니다.
69
69
 
70
70
  ## 설치
71
71
 
@@ -76,7 +76,7 @@ npm exec --yes --package @litfamily/litgrok@latest -- litgrok install
76
76
  재현 가능한 설치는 버전을 고정합니다.
77
77
 
78
78
  ```bash
79
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok install
79
+ npm exec --yes --package @litfamily/litgrok@1.0.3 -- litgrok install
80
80
  ```
81
81
 
82
82
  파일을 쓰지 않고 미리보기:
@@ -197,7 +197,7 @@ mark나 lockup 배열을 복사해 색을 입혀도 글리프와 이름을 보
197
197
 
198
198
  SessionStart 스크립트는 검증된 세션마다 표준 mark를 stdout에 한 번 씁니다.
199
199
  `.grok/litgrok/session-ledger/`의 빈 `.ignited` 파일을 원자적으로 생성해 중복·동시
200
- 이벤트에서도 mark를 반복하지 않습니다. 기존 payload 안내와 검토 대기 알림은 유지합니다.
200
+ 이벤트에서도 mark를 반복하지 않습니다. 기존 payload 안내는 유지합니다.
201
201
  잘못된 세션 정보나 안전하지 않은 marker가 있으면 mark 출력 전에 실패합니다.
202
202
  Grok에는 activation별 logo hook이 없습니다. 기존 다섯 skill의 응답 시작 규약은 모델이
203
203
  `▲ LIT · <discipline>` 한 줄로 답변을 시작하도록 요청합니다. `litwork`도
@@ -206,26 +206,9 @@ advisory 계약을 선언하며, 그 스크립트 stdout과 구분됩니다. bar
206
206
  결정적으로 라우팅하거나 passive hook 출력으로 활성화를 보장하지 않으며,
207
207
  native host의 실제 표시는 검증하지 않았습니다.
208
208
 
209
- ## Skill learning loop
209
+ ## 이전 review state
210
210
 
211
- LitGrok은 반복해서 쓸 수 있는 correction이나 workflow signal을 검토 가능한 skill proposal로 만들 수 있습니다. `Stop`은 session별 bounded turn state만 기록하고, `SessionStart`는 기존 payload banner 다음에 pending-review 안내 한 줄만 추가할 수 있습니다. 두 hook 모두 model을 시작하지 않습니다. Model review는 사용자가 `/skill-observer review` 또는 foreground `skill-loop review` CLI를 직접 실행할 때만 동작합니다. 선택한 session을 export하고 secret을 제거한 bounded packet을 만든 뒤 child tool을 끄며, recursion guard와 bounded 65초 process budget(export 5초, model 60초)을 적용합니다.
212
-
213
- 현재 learning loop는 macOS와 Linux에서 지원합니다. Windows에서는 `/skill-observer review`와 모든 `skill-loop` command가 subprocess, project learning state, user skill에 접근하기 전에 `WINDOWS_SKILL_LOOP_UNSUPPORTED`로 중단됩니다. Passive hook과 installer는 계속 사용할 수 있습니다. Native Windows learning loop에는 전용 ACL 및 process-job helper가 필요하며, 이번 release는 그 지원을 주장하지 않습니다.
214
-
215
- Review는 proposal만 만듭니다. `autoApply`는 항상 false이고 transcript text는 inert data입니다. 사용자가 `apply <proposal-id>`를 명시적으로 실행하기 전에는 아무것도 바뀌지 않습니다. Pending proposal, content-addressed ledger, rollback blob은 설치된 project의 `.grok/litgrok/` state에 저장됩니다. 승인된 skill은 `$HOME/.grok/skills/<name>/` 아래에서만 생성하거나 수정하며 `metadata: { litgrokAgentGenerated: "true" }` marker를 가집니다. Packaged skill, project payload target, symlink, marker가 없는 기존 user skill은 보호됩니다.
216
-
217
- 설치된 project에서는 다음 package CLI를 foreground command로 실행할 수 있습니다.
218
-
219
- ```bash
220
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop review <session-id>
221
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop list
222
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop apply <proposal-id>
223
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop reject <proposal-id>
224
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop rollback <ledger-id>
225
- npm exec --yes --package @litfamily/litgrok@1.0.2 -- litgrok skill-loop curator
226
- ```
227
-
228
- `apply`는 rollback에 필요한 ledger id를 출력합니다. Deterministic curator도 user-invoked입니다. 기본적으로 7일에 한 번만 실행되고, 마지막 activity 뒤 최소 2시간이 지나야 하며, pin되지 않은 agent-owned skill을 30일 idle 뒤 stale로 표시하고 90일 idle 뒤 discovery 밖으로 archive합니다. Transition 전에는 전체 backup을 만들고 skill package를 삭제하지 않습니다. `--force`는 명시적인 test 또는 maintenance 실행에서 7일 interval만 건너뜁니다.
211
+ LitGrok은 더 이상 skill review를 예약하지 않으며, 기존 project/user review state를 읽거나 이전·수정·삭제하지 않습니다. 남아 있는 review 파일은 inert 상태로 두며 소유자가 직접 관리합니다.
229
212
 
230
213
  ## 검증
231
214