priorcase 0.5.3 → 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.
Files changed (2) hide show
  1. package/README.md +162 -0
  2. package/package.json +9 -5
package/README.md CHANGED
@@ -71,6 +71,46 @@ Apple Developer 계정은 이 셋 중 하나가 될 때 든다 — 브라우저
71
71
  평문 마크다운이고, 라이선스가 끝나도 그대로 남는다. 포함된 오픈소스 구성요소는
72
72
  [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) 를 보라.
73
73
 
74
+ ### 개인정보 — 밖으로 나가는 경로는 하나뿐이다
75
+
76
+ **priorcase 자체는 아무것도 안 보낸다.** telemetry 가 없고, 볼트를 어디에도 올리지
77
+ 않고, 우리 서버라는 것이 없다. 볼트는 당신 디스크의 평문 마크다운이고 동기화는
78
+ **당신이 지정한 git 리모트**로만 간다.
79
+
80
+ **예외가 하나 있다: 자동 판별기.** 세션 끝에 기록되지 않은 결정을 대신 남기는 기능인데,
81
+ 그것을 켜면 **대화 발췌가 설치된 AI CLI 를 통해 그 AI 서비스로 전달될 수 있다.**
82
+ 우리가 네트워크를 직접 타지 않아도 당신 관점에서는 이렇다:
83
+
84
+ ```
85
+ priorcase → claude / codex CLI → 그 회사 서버
86
+ ```
87
+
88
+ 그래서 **명시적으로 켜야 한다.** 새 설정의 기본값은 `off` 다.
89
+
90
+ ```toml
91
+ [capture]
92
+ judge = "off" # off | auto | claude | codex | custom
93
+ ```
94
+
95
+ | 값 | 뜻 |
96
+ |---|---|
97
+ | `off` | 안 쓴다. 구간은 표시만 남고 `prior pending` 으로 사람이 본다 |
98
+ | `auto` | 설치된 것을 찾아 쓴다 (대화를 만든 호스트를 앞에 두는 사슬) |
99
+ | `claude` / `codex` | 그 CLI 만 쓴다 |
100
+ | `custom` | `judge_path` 가 가리키는 것만 쓴다 |
101
+
102
+ **API 키는 어떤 경우에도 읽지 않는다.** 호스트 CLI 만 쓴다 — 키 등록은 진짜 장벽이고,
103
+ 당신이 모르는 사이에 과금되는 경로를 만들지 않기 위해서다.
104
+
105
+ `judge` 를 안 적은 **기존 설정은 예전처럼 계속 돈다.** 빈 값을 `off` 로 읽으면 이미
106
+ 쓰던 사람의 자동 기록이 조용히 멈추는데, 멈춘 것은 큐에 쌓일 뿐 아무 말도 안 한다 —
107
+ 이 프로젝트가 죄목으로 드는 고장이 정확히 그것이다. 대신 **세션 진입에서 매번 알리고**
108
+ 한 줄 적으면 사라진다. `prior doctor` 도 지금 어느 상태인지 말한다.
109
+
110
+ > 이 안내를 `prior doctor` 에만 두지 않은 이유가 있다. 실측으로 `doctor` 는 **업무 중에
111
+ > 안 돈다** — 트랜스크립트 전수에서 실행 116회가 전부 priorcase 저장소 안이었고 실제
112
+ > 작업에서는 0회였다. 개인정보 계약을 아무도 안 여는 방에 붙이면 계약이 아니다.
113
+
74
114
  ### 스키마 판
75
115
 
76
116
  결정 노트에는 `schema` 판이 붙는다 (판 1 은 생략한다).
@@ -444,6 +484,128 @@ norm = (k+1) / (1 + k*((1-b) + b*len/ref)) k=1.2, b=0.5, ref=200자
444
484
  사라지고, 요약은 본문에 복사돼 있지 않아 body 히트로도 안 걸린다. 위 표의 `요약뒤쪽`
445
485
  세트가 그것을 재는 자리이고, 정규화는 그 세트의 MRR 을 **올리면서** 같은 편향을 잡는다.
446
486
 
487
+ ### 회수 질의 — 프롬프트 한 줄이 아니라 직전 대화
488
+
489
+ **주제는 프롬프트가 아니라 세션에 있다.** 대화체는 대명사·생략·직전 화제 참조로
490
+ 굴러가서, 사람이 방금 친 한 줄에는 내용어가 거의 없다:
491
+
492
+ ```
493
+ "좋아. 일단 priorcase에 관련 내용을 저장해놔줘."
494
+ "GA 업데이트 관련 내용을 어디까지 진행했었지?"
495
+ "그럼 이제 뭘 하는게 좋을까? 혹시 어제 완료하지 않은 작업이 있어?"
496
+ ```
497
+
498
+ 셋 다 그 자리에서 필요했던 결정이 분명히 있었는데(볼트가 그것을 `related` 로 남겼다)
499
+ 회수는 엉뚱한 것을 꺼냈다. 그래서 훅은 기록 파일의 **끝부분을 읽어 직전 대화
500
+ 1,500자**를 질의에 얹는다.
501
+
502
+ 실측(2026-09-04, 실볼트 결정 679건 · 실물 라벨 165건 · 서로 다른 질의 60개):
503
+
504
+ | 맥락 글자수 | 상위3에 정답이 든 질의 | 좋아짐/나빠짐 |
505
+ |---|---|---|
506
+ | 0 (옛 동작) | 15 / 60 (25%) | — |
507
+ | 500 | 22 / 60 (37%) | 11 / 4 |
508
+ | 1000 | 30 / 60 (50%) | 18 / 2 |
509
+ | **1500** | **33 / 60 (55%)** | **22 / 3** |
510
+ | 2000 | 30 / 60 (50%) | 21 / 6 |
511
+ | 4000 | 28 / 60 (47%) | 20 / 5 |
512
+
513
+ 1500 을 넘으면 **들어오는 것은 안 늘고 밀려나는 것만 는다.**
514
+
515
+ 재 보고 **안 넣은 것 셋**:
516
+
517
+ - **사람이 친 말만 담기** — 더 나빴다(상위3 진입 21 대 28). 어시스턴트 출력과 도구
518
+ 활동에 `word`·`extension`·파일 경로 같은 라틴 원어가 있고, 그것이 한국어
519
+ 음차(`워드`·`익스텐션`)와 볼트 어휘를 잇는 다리다.
520
+ - **맥락 낱말에 낮은 무게 주기** — 무게를 1.0→0.2 로 훑어도 나빠짐이 3→2 로밖에 안
521
+ 줄고 좋아짐이 같이 깎였다. 잡음은 낱말 하나가 세서가 아니라 **낱말이 많아서** 생긴다.
522
+ - **맥락에서 변별어만 쓰기** — 좋아짐만 22→17 로 줄었다. 흔한 낱말도 조합으로는
523
+ 주제를 가리킨다.
524
+
525
+ **맥락은 결정 풀에만 쓴다.** 규칙·참고는 프롬프트만 본다 — 규칙 풀이 12건이라
526
+ 문서빈도가 뜻을 잃고(한 건에만 있는 낱말이 전부 변별어가 된다), 맥락 낱말 150개가
527
+ 들어오면 아무 규칙이나 우연히 스쳐 점수가 6점대에서 33점으로 뛴다. 그쪽 라벨을
528
+ 아직 안 만들어서 **재지 않은 자리는 건드리지 않았다.**
529
+
530
+ 비용은 회수 한 번에 86ms → 108ms 다. 기록 파일은 끝 256KB 만 읽는다 — 이 기계
531
+ 기록의 중앙값은 82KB 지만 최대가 51MB 라, 매 발화마다 통째로 읽으면 긴 대화가 죽는다.
532
+
533
+ ### `prior eval` — 회수가 정답을 꺼내는지 잰다
534
+
535
+ `doctor` 와 다른 것을 본다.
536
+
537
+ ```
538
+ doctor 서류가 정합한가 (링크가 걸리나 · 스키마가 맞나 · 훅이 배선됐나)
539
+ eval 회수가 실제로 맞는 것을 꺼내나
540
+ ```
541
+
542
+ 둘 다 초록인데 회수가 쓸모없을 수 있다. 실제로 그랬다 — 교차 프로젝트 주입이
543
+ 55.8% 인데 어시스턴트가 그 노트를 언급한 것은 4.4% 였고, doctor 는 그동안 초록이었다.
544
+
545
+ ```
546
+ $ prior eval
547
+ 세트 n 못찾음 @1 @3 MRR
548
+ slug 679 5.9% 83.2% 88.4% 0.862
549
+ 요약뒤쪽 457 1.5% 95.2% 97.8% 0.965
550
+ 링크쌍 865 35.0% 0.0% 34.2% 0.196
551
+ ```
552
+
553
+ - **slug** — 파일명 slug 로 자기 자신 찾기. 길이에 중립적인 회귀 가드다.
554
+ - **요약뒤쪽** — 요약 마지막 1/3 로 자기 자신 찾기. 긴 요약의 꼬리가 사는지 본다.
555
+ - **링크쌍** — 사람이 이은 A→B 를 A 의 요약으로 찾기. 볼트에서 자동 생성되지만
556
+ **낙관적이다** — 질의가 볼트 어휘로 촘촘히 쓰인 요약 문장이라 어휘 랭커에 유리하다.
557
+ - **실프롬프트** — 실물. `--make-labels` 로 만들고 `--prompts` 로 준다.
558
+
559
+ 실물 라벨은 볼트가 만든다. 노트의 `source_session` 으로 그 대화를 찾고, `related` 를
560
+ "그 자리에서 실제로 필요했던 노트" 로 삼는다 — 추측이 아니라 기록된 사실이다.
561
+
562
+ ```
563
+ $ prior eval --make-labels /tmp/labels.json
564
+ 라벨 165건 · 버린 것: 트랜스크립트 없음 36 · 앵커 못 찾음 22 · 프롬프트 없음 0 · 정답 없음 2
565
+
566
+ $ prior eval --set prompt --prompts /tmp/labels.json --context 0 --save /tmp/base.json
567
+ $ prior eval --set prompt --prompts /tmp/labels.json --context 1500 --against /tmp/base.json
568
+ ```
569
+
570
+ **판정 기준은 "MRR 이 올랐나" 가 아니다.** 주입이 세 줄뿐이라 순위 하락이 곧 탈락이고,
571
+ 평균은 그 탈락을 숨긴다. `--against` 는 **프롬프트 단위로 좋아짐/나빠짐**을 센다 —
572
+ 정답이 여럿인 프롬프트에서 A 가 밀리고 B·C 가 들어오면 쌍 단위로는 손해가 하나
573
+ 적히지만 실제로는 주입되는 정답이 하나에서 둘로 는 것이다. 같은 변경을 두 자로 재면
574
+ 쌍 단위 4:1, 프롬프트 단위 9:1 로 갈렸다.
575
+
576
+ **점수식 상수는 볼트 크기에 묶여 있다.** 볼트가 자라면 문서빈도 분포가 통째로
577
+ 움직인다 — `지라` 의 df 가 결정 414건 시절 2.0% 였다가 649건에서 5.2% 가 되면서
578
+ 변별어 경계 3.0% 를 넘었고, 그 낱말로 걸리던 규칙이 조용히 안 걸리게 됐다.
579
+ 그래서 이 명령은 한 번 쓰고 버리는 것이 아니라 **볼트가 커질 때마다 도는 자**다.
580
+
581
+ ### `prior recall --explain` — 왜 이게 1위인가
582
+
583
+ 회수를 고칠 때 가장 비싼 질문이다. 지금까지는 코드를 따라가며 손으로 다시 계산해야
584
+ 했고, 그래서 **틀린 회수를 보고도 원인을 못 짚은 채 상수만 만지는 일**이 반복됐다.
585
+
586
+ ```
587
+ $ prior recall "회수 랭킹 게이트" --limit 1 --explain
588
+ 11 priorcase-결정-회수구조-summary태그가검색어-2026-08-08
589
+ 결정 노트의 summary·tags 는 설명이 아니라 검색어다 — …
590
+ 게이트 3 / 1 통과
591
+ 랭킹 head 변별어 df 4
592
+ 회수 head+본문 흔함 df 49
593
+ (안 걸린 낱말 1개 — 전부 보려면 --explain-all)
594
+ head 히트 2 (변별어 1 · 동의어 0) → 원점수 8
595
+ 길이 127자 → 정규화 ×1.000 → 8점
596
+ 가감 본문 +1 · cwd도메인 +2
597
+ 최종 11
598
+ ```
599
+
600
+ 낱말은 **기여도 순**이다. 알고 싶은 것은 "무엇이 이 노트를 끌어올렸나" 이고, 알파벳
601
+ 순은 그 질문에 답하지 않는다. `--explain-all` 은 안 걸린 낱말까지 보여 준다 —
602
+ "왜 저게 안 나왔나" 를 볼 때는 그쪽이 답이다.
603
+
604
+ `--context <파일>` 로 훅이 실제로 하는 회수(직전 대화를 얹은 것)를 손으로 재현할 수 있다.
605
+
606
+ 기본 경로에서는 분해 구조체를 **할당조차 하지 않는다.** 회수는 매 프롬프트마다 도는
607
+ 자리라 진단용 비용을 늘 지불하면 안 된다.
608
+
447
609
  ### 규칙 (`type: rule`) — 도메인 없는 판단 기준
448
610
 
449
611
  `_meta/rules/*.md` 에 `type: rule` 로 둔 노트는 **결정과 다른 계층**이다. 회수가 따로
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "priorcase",
3
- "version": "0.5.3",
3
+ "version": "0.6.1",
4
4
  "description": "Record your agent's decisions and surface them at the next judgment point",
5
5
  "keywords": [
6
6
  "mcp",
@@ -11,6 +11,10 @@
11
11
  "obsidian"
12
12
  ],
13
13
  "license": "SEE LICENSE IN LICENSE",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/xian0310567/priorcase.git"
17
+ },
14
18
  "bin": {
15
19
  "prior": "bin/prior.js"
16
20
  },
@@ -24,9 +28,9 @@
24
28
  "node": ">=18"
25
29
  },
26
30
  "optionalDependencies": {
27
- "priorcase-darwin-arm64": "0.5.3",
28
- "priorcase-darwin-x64": "0.5.3",
29
- "priorcase-linux-arm64": "0.5.3",
30
- "priorcase-linux-x64": "0.5.3"
31
+ "priorcase-darwin-arm64": "0.6.1",
32
+ "priorcase-darwin-x64": "0.6.1",
33
+ "priorcase-linux-arm64": "0.6.1",
34
+ "priorcase-linux-x64": "0.6.1"
31
35
  }
32
36
  }