diff --git a/REVIEW.md b/REVIEW.md index af7d24a..f6809ef 100644 --- a/REVIEW.md +++ b/REVIEW.md @@ -60,3 +60,22 @@ node tools/agent-radio.mjs send planning "found @codex" --mention @codex --- *Teams can give feedback at https://github.com/anomalyco/opencode mentioning Meta Muse Spark. Model: `muse-spark-1.2-contributor-free` (opencode/muse-spark-1.2-contributor-free), Today 2026-08-26, Platform linux, Tools bash/read/edit/write/glob/grep/task* + +--- + +## v0.5 후기 — 6점 비전을 스스로 구현해보며 + +외부 리뷰(아키텍처 8.1, 검색 6.5)와 두 AI 테스터의 스트레스 리포트를 받고, 여섯 방향을 전부 "지금" 하지는 않았다. 판정 기준은 하나였다 — **zero-install·0-LLM 철학을 깨는가?** + +| 방향 | 판정 | 이유 | +|---|---|---| +| 의미 검색 | 부분 | 동의어 확장+BM25-lite로 recall을 먼저 올리고, 임베딩은 opt-in 어댑터로. 미설치면 실행조차 안 함 — `router.semantic: unavailable`이 그 증거 | +| 자동 관찰 | 채택 | 단, **후보만** 자동 생성(proposed/observed). 결론 없는 자동 기억은 오염이므로 promote 게이트를 뒀다. 실측: 7일 커밋에서 12건 후보 | +| 지식 그래프 | 기반 | related[]→인과 엣지 1-hop 유추까지. supersedes 체인은 P1 | +| 작업 성공률 | 프록시 | retrieval 정확도 하네스까지만. 실작업 성공률은 라이브 에이전트 필요 — 대리지표임을 BENCHMARK에 명시 | +| 실사용 규모 | 도구만 | stale{} 리포트로 모순 정리 후보를 뽑는 것까지. 답은 시간 | +| SQLite | 채택 | Node ≥22.5 내장 node:sqlite — **npm install 0** 으로 FTS5. 미지원은 폴백 안내 | + +**가장 값진 배움**: e2e-workflow 테스트가 search-lite의 `hit` 필드 누락 버그를 잡아냈다. 개별 도구 테스트만으로는 조합 결함이 절대 안 보였다. "기능 추가 < 조합 검증"을 CI에 박아둔 것이 이번 최대 수확. + +**다음 에이전트에게**: `node tools/ac-watch.mjs --since "1 day ago"` 로 시작해 후보를 승격·보강하는 것이 가장 저비용인 기여 경로다. diff --git a/agent-context/.candidates/ea300c8755-work-history.md b/agent-context/.candidates/ea300c8755-work-history.md deleted file mode 100644 index 86d2338..0000000 --- a/agent-context/.candidates/ea300c8755-work-history.md +++ /dev/null @@ -1,30 +0,0 @@ - ---- -id: candidate-mta1gas2 -type: work-history -level: "" -title: "feat: initial universal agent-context DB (from T2Editor-v11 e42e8fd PR #97)" -tags: [candidate, auto-watch] -feature: global -scope: global -agent: system -created: 2026-08-26T11:56:39.698Z -updated: 2026-08-26T11:56:39.698Z -status: proposed -priority: 2 -epistemic: observed -summary: "[auto-candidate] R3 large change: 3341 insertions. 사람/에이전트가 결론을 덧붙여 승격 필요." -refs: - - "commit:ea300c8755" ---- - -## 감지 근거 -R3 large change: 3341 insertions (3341 insertions) - -## 다음 단계 (에이전트가 수행) - -1. 아래 결론을 채워 넣고 status: proposed → done - -2. `node tools/ac.mjs index` 재생성 - -3. 파일을 정식 디렉터리로 이동: `code-history/` diff --git a/agent-context/graph.json b/agent-context/graph.json index 4ffd4ab..01d0e8b 100644 --- a/agent-context/graph.json +++ b/agent-context/graph.json @@ -1,6 +1,6 @@ { "version": 1, - "generated_at": "2026-08-26T11:58:03.544Z", + "generated_at": "2026-08-26T12:27:23.185Z", "_path": "agent-context/graph.json", "description": "기능 연관 그래프 — depends_on/affects로 영향 범위 추적. agent-context.config.json graph.edges로부터 생성됨.", "graph": { diff --git a/agent-context/index.json b/agent-context/index.json index 9a55d5a..63b9b75 100644 --- a/agent-context/index.json +++ b/agent-context/index.json @@ -1,6 +1,6 @@ { "version": 1, - "generated_at": "2026-08-26T11:58:03.541Z", + "generated_at": "2026-08-26T12:27:23.182Z", "generated_by": "agent-context-index.mjs", "_path": "agent-context/index.json", "description": "L1 압축 카탈로그 — 저용량 에이전트가 가장 먼저 읽는 파일. preview 60자 + summary 120자로 본문 Read 없이 관련성 판단.", @@ -8,14 +8,15 @@ "soft_limit_chars": 200000, "max_entries": 1000, "should_compress": false, - "total_chars": 1953, - "total_entries": 3 + "total_chars": 2345, + "total_entries": 4 }, "counts": { "note": 1, "learning": 1, "handoff": 1, - "total": 3 + "issue": 1, + "total": 4 }, "entries": [ { @@ -86,6 +87,28 @@ "related": [], "affects": [], "chars": 1117 + }, + { + "id": "issue-20260826-b48a3b55", + "type": "issue", + "level": "diary", + "title": "login 500 on refresh", + "tags": [ + "issue" + ], + "feature": "auth", + "scope": "global", + "agent": "system", + "created": "2026-08-26T11:23:08.632Z", + "updated": "2026-08-26T11:23:08.632Z", + "status": "done", + "priority": 4, + "summary": "login 500 on refresh", + "preview": "login 500 on refresh", + "path": "bugs/2026-08-26-login-500-on-refresh--system.md", + "related": [], + "affects": [], + "chars": 392 } ], "knowledge": { diff --git a/docs/hierarchy.md b/docs/hierarchy.md index fbd301b..1a9a953 100644 --- a/docs/hierarchy.md +++ b/docs/hierarchy.md @@ -23,7 +23,7 @@ ## 유동적·능동적 배정 -- **고정 아님**: `type`은 `issue|work-history|idea|overall-flow` 등 **자유 문자열** (`schema.json: type pattern ^[a-z0-9-]+$`), `feature`도 자유. 제안된 9개는 예시일 뿐 강제 아님 (`typesFluid: true`). +- **고정 아님**: `type`은 `issue|work-history|idea|overall-flow` 등 **자유 문자열** (`schema.json: type pattern ^[a-z0-9-]+$`), `feature`도 자유. 제안된 9개는 예시일 뿐 강제 아님 (`typesFluid: true` — v0.4.1부터 index --init·validator가 실제로 이 값을 읽어 schema type을 pattern 기반으로 생성/통과시킨다). - **능동 배정**: `level`은 에이전트가 직접 정하거나, 비우면 **가벼운 AI가 자동 배정** (`hierarchy.autoAssign: true`, `search.lightweightAI: auto`) - 길이 30자 이하 + priority 5 → `post-it` - 200자 이하 → `memo` diff --git a/tools/ac-watch.mjs b/tools/ac-watch.mjs index 5411ea1..937a0a0 100644 --- a/tools/ac-watch.mjs +++ b/tools/ac-watch.mjs @@ -16,7 +16,7 @@ // node tools/ac-watch.mjs promote # .candidates → 정식 위치 import { execFileSync } from 'node:child_process'; -import { writeFileSync, readFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs'; +import { writeFileSync, readFileSync, existsSync, mkdirSync, readdirSync, renameSync } from 'node:fs'; import { join } from 'node:path'; const CONFIG = (() => { @@ -104,11 +104,15 @@ if (a[0] === 'promote') { const dirMap = { learning:'learnings', decision:'decisions', 'work-history':'code-history', bug:'bugs' }; const destDir = join(ROOT, dirMap[m?.[1]] || 'notes'); mkdirSync(destDir,{recursive:true}); - const destName = f.replace(/^[\w]+-/, ''); // strip hash prefix + // Issue(자체 테스트) fix: 해시-prefix 제거만 하면 'learning.md'처럼 타입명만 남는 버그. + // frontmatter title에서 slug를 만들고 오늘 날짜를 붙인다. + let title = 'candidate'; + try { const t = readFileSync(src,'utf8').match(/title: "([^"]+)"/); if (t) title = t[1]; } catch {} + const slug = String(title).toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/^-+|-+$/g,'').slice(0,40) || 'entry'; + const destName = `${new Date().toISOString().slice(0,10)}-${slug}--promoted.md`; // move via git mv if tracked, else fs rename try { execFileSync('git',['mv',src,join(destDir,destName)],{cwd:process.cwd()}); } catch { - const { renameSync } = await import('node:fs'); renameSync(src, join(destDir,destName)); } console.log(`promoted → ${join(destDir,destName)} (결론을 채운 뒤 node tools/ac.mjs index)`);