Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 2 additions & 14 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,8 @@
{
"name": "domain",
"source": "./skills/domain",
"description": "0.10.1 (2026-06-03) `_is_name` now accepts a DIGIT-LEADING NAME — first char may be an UPPERCASE letter OR a digit 0-9, so `/domain init 8VERB` works (previously rejected: digit-leading start); subsequent chars unchanged (UPPERCASE/digit/`-`/`+`). 0.10.0 — bare `/domain` + `/domain list` now LINT for scattered report-like `.md` (a basename token audit|report|verdict|gap|finding|impl OR an ISO date like `2026-06-02`) sitting loose at the repo root or under `docs/` WHILE a domain is active, and emit a `⚠ 분리보관 감지` advisory naming each stray with its `/domain absorb <file>` runbook (excludes the domain's own pair / CHANGELOG / README / `.log.md` / already-absorbed pointer files; read-only). 0.9.0 — new `absorb <file> [--state]` verb enforces combined-storage (합산보관) over scattered docs/*.md: folds an existing separate report/finding `.md` into the ACTIVE domain's single doc pair (default → <NAME>.log.md as a dated `## <ISO> — absorbed <rel>` entry embedding the body; `--state` → <NAME>.md snapshot), then replaces the source with a one-line `<!-- absorbed into … -->` pointer (idempotent — an already-absorbed pointer file is skipped; refuses to absorb the domain's own pair). Resolves the active domain via the same _get_active / _snap_path / _log_path logic the other verbs use. Maintain UPPERCASE <NAME>.md (snapshot = final-goal milestone checkboxes) + sister <NAME>.log.md (append-only step log) at project root — auto-scaffolds both, defaults NAME to uppercase basename of git root. Verbs: /domain <NAME> (SELECT the session's active domain → later verbs default to it + show a final-goal progress bar `▓▓▓░░ NN% · done/total` from the snapshot's checkboxes) · /domain (show active) · /domain list (alias ls — repo-wide index; with a DOMAINS.tape roster it is AUTHORITATIVE: tables each registered domain ★ = active · @goal · progress · location, progress/@goal stay DERIVED so the checked-in roster holds only NAME→path and never churns; flags ghosts + unregistered; no roster → legacy disk-scan) · /domain list --sync (reconcile DOMAINS.tape with disk — bootstraps the roster) · /domain <task> (append `- [x]` to log) · /domain todo <task> (`- [ ]`) · /domain done <match> (flip [ ]→[x]) · /domain title <text> (alias subtitle — OPTIONAL `@title:` display header: icon · name · alias, e.g. `🧠 IIT4 — 의식 측정자(尺)`, rendered in place of plain `active domain: NAME`; absence keeps current output, no lint warning) · /domain new <header>. Progress is final-goal-based (snapshot completion), not log-based — it doesn't drift as the log grows. Path resolution: a DOMAINS.tape roster row (`@domain NAME := \"path\"`) wins FIRST, so a domain can live at ANY path (e.g. `domains/RUNTIME/RUNTIME.md`); absent a roster entry it falls back to root → folder-nested → root-default-scaffold (log follows the snapshot's dir), so folder-nested meta-domains no longer regenerate an empty root scaffold each call. The folder-nested fallback only matches when the nested file's first line is the domain header `# <NAME>` (guards against false-matching an unrelated same-named file like a digest on case-insensitive filesystems). 0.8.8: /domain set now SELF-HEALS the DOMAINS.tape roster (auto-registers an on-disk-but-unregistered domain — the gap that ghosted anima's LIFE) and warns on a stale SSOT shadow (the working-tree <NAME>.md is UNTRACKED or BEHIND origin/main → progress/closure may read a stale local copy; reference_domain_init_untracked_ssot); a perpetual `@goal` (no-termination marker like `종료 조건 없음`/`perpetual`/`open horizon`) renders a ♾️ perpetual badge so the progress bar reads as frontier-depletion, NOT a 100% completion countdown (per feedback-closure-is-physical-limit).",
"version": "0.10.1"
"description": "0.11.0 (2026-06-07) ML subverbs unify the retired `skillopt` + `skillopt-hook` plugins under `/domain`: `/domain doctor` (skill-train readiness) · `/domain train [--bg]` (NATIVE pip-free SkillOpt loop — rollout → reflect → edit → held-out gate via `claude -p` = your Claude Code subscription, NOT a metered API; only a SEPARATE skill.md is optimized — the domain's own DOMAIN.md / verdicts / log are NEVER touched) · `consume <skill.md>` · `activate`/`deactivate` (write ~/.sidecar/domain-skill/active-skill.md) · `status`/`log`. Bundled `examples/toyqa` (6 format-sensitive QA items) proves the loop end-to-end with NO external data/pip. ML verbs route to `bin/_domain_ml.sh` (+ `bin/_domain_ml.py` engine); ALL existing domain verbs route to `_domain.hexa` UNCHANGED. 0.10.1 (2026-06-03) `_is_name` now accepts a DIGIT-LEADING NAME — first char may be an UPPERCASE letter OR a digit 0-9, so `/domain init 8VERB` works (previously rejected: digit-leading start); subsequent chars unchanged (UPPERCASE/digit/`-`/`+`). 0.10.0 — bare `/domain` + `/domain list` now LINT for scattered report-like `.md` (a basename token audit|report|verdict|gap|finding|impl OR an ISO date like `2026-06-02`) sitting loose at the repo root or under `docs/` WHILE a domain is active, and emit a `⚠ 분리보관 감지` advisory naming each stray with its `/domain absorb <file>` runbook (excludes the domain's own pair / CHANGELOG / README / `.log.md` / already-absorbed pointer files; read-only). 0.9.0 — new `absorb <file> [--state]` verb enforces combined-storage (합산보관) over scattered docs/*.md: folds an existing separate report/finding `.md` into the ACTIVE domain's single doc pair (default → <NAME>.log.md as a dated `## <ISO> — absorbed <rel>` entry embedding the body; `--state` → <NAME>.md snapshot), then replaces the source with a one-line `<!-- absorbed into … -->` pointer (idempotent — an already-absorbed pointer file is skipped; refuses to absorb the domain's own pair). Resolves the active domain via the same _get_active / _snap_path / _log_path logic the other verbs use. Maintain UPPERCASE <NAME>.md (snapshot = final-goal milestone checkboxes) + sister <NAME>.log.md (append-only step log) at project root — auto-scaffolds both, defaults NAME to uppercase basename of git root. Verbs: /domain <NAME> (SELECT the session's active domain → later verbs default to it + show a final-goal progress bar `▓▓▓░░ NN% · done/total` from the snapshot's checkboxes) · /domain (show active) · /domain list (alias ls — repo-wide index; with a DOMAINS.tape roster it is AUTHORITATIVE: tables each registered domain ★ = active · @goal · progress · location, progress/@goal stay DERIVED so the checked-in roster holds only NAME→path and never churns; flags ghosts + unregistered; no roster → legacy disk-scan) · /domain list --sync (reconcile DOMAINS.tape with disk — bootstraps the roster) · /domain <task> (append `- [x]` to log) · /domain todo <task> (`- [ ]`) · /domain done <match> (flip [ ]→[x]) · /domain title <text> (alias subtitle — OPTIONAL `@title:` display header: icon · name · alias, e.g. `🧠 IIT4 — 의식 측정자(尺)`, rendered in place of plain `active domain: NAME`; absence keeps current output, no lint warning) · /domain new <header>. Progress is final-goal-based (snapshot completion), not log-based — it doesn't drift as the log grows. Path resolution: a DOMAINS.tape roster row (`@domain NAME := \"path\"`) wins FIRST, so a domain can live at ANY path (e.g. `domains/RUNTIME/RUNTIME.md`); absent a roster entry it falls back to root → folder-nested → root-default-scaffold (log follows the snapshot's dir), so folder-nested meta-domains no longer regenerate an empty root scaffold each call. The folder-nested fallback only matches when the nested file's first line is the domain header `# <NAME>` (guards against false-matching an unrelated same-named file like a digest on case-insensitive filesystems). 0.8.8: /domain set now SELF-HEALS the DOMAINS.tape roster (auto-registers an on-disk-but-unregistered domain — the gap that ghosted anima's LIFE) and warns on a stale SSOT shadow (the working-tree <NAME>.md is UNTRACKED or BEHIND origin/main → progress/closure may read a stale local copy; reference_domain_init_untracked_ssot); a perpetual `@goal` (no-termination marker like `종료 조건 없음`/`perpetual`/`open horizon`) renders a ♾️ perpetual badge so the progress bar reads as frontier-depletion, NOT a 100% completion countdown (per feedback-closure-is-physical-limit).",
"version": "0.11.0"
},
{
"name": "domain-doc-guard",
Expand Down Expand Up @@ -434,18 +434,6 @@
"description": "/gap — multi-axis gap exploration. 42 breakthrough-strategy lenses · 8 families (F4 + F6 each have 6 lenses; `occams-razor` lives in both — hypothesis side and design side). Bare /gap = inline-triage + deep-dive only hot families. /gap full = exhaustive 8-subagent fan-out. /gap <scope> targets the sweep. /gap list prints the catalogue. Surfaces + prioritises gaps; never fixes.",
"version": "0.2.0"
},
{
"name": "skillopt",
"source": "./commands/skillopt",
"description": "0.5.0 (2026-06-07) AUTO-USE (activate) — `/skillopt activate <skill.md>` copies a trained skill to the SSOT ~/.sidecar/skillopt/active-skill.md so the companion `skillopt-hook` auto-injects it at every SessionStart (no command needed); `/skillopt deactivate` removes it, `/skillopt agent-active on|off` toggles a one-line nudge that tells the agent to PROPOSE (never auto-run) `/skillopt train` for repeatable scored tasks. The USE-vs-TRAIN split: USE is automatic + opt-in + cheap; TRAIN stays a command/agent decision (cost-bearing). 0.4.0 (2026-06-07) BACKGROUND TRAIN + HARDER EXAMPLE — `/skillopt train --bg` detaches the run (nohup → log under ~/.sidecar/skillopt/), returns immediately; `/skillopt status` shows running-state + score/step progress, `/skillopt log` tails. The bundled `examples/toyqa` dataset swapped to 6 format-sensitive QA items (chemical symbols, ISO codes, rounding…) that an EMPTY skill answers in a full sentence → STRICT exact-match fails → a real learning gradient (the optimizer learns a 'reply with only the value' rule, then the held-out gate rises); train_size 6 · batch 3 · sel 5 for stronger signal. 0.3.0 (2026-06-07) EXECUTABLE CLI — `/skillopt` now runs directly via a `!`-exec dispatcher (`bin/skillopt.sh`, prefs-style: resolves its own cached install dir, so the user never types a long path). `/skillopt train` runs the loop in one token; `/skillopt doctor|ckpts|consume <skill.md>|help` all dispatch. Honest 0-edit runs reported as such; claude -p clarified = subscription (NOT metered). 0.2.0 (2026-06-07) sidecar-OWNED env adapter — the only domain code (run a task + score it) now ships IN the plugin at `commands/skillopt/examples/<domain>/`, NOT a clone of the upstream package; `bin/skillopt_run.py` injects sidecar adapters into the upstream hard-coded `_ENV_REGISTRY` at runtime (additive · survives `_register_builtins`) then runs the upstream trainer. Bundled reference `examples/toyqa/` = 4-item exact-match QA proving the loop runs end-to-end on local `claude -p` (no API key, no external data — target+optimizer both shell out to the Claude Code CLI = subscription, NOT metered); `examples/_base/default.yaml` vendors the upstream base config so examples are self-contained (plain `pip install skillopt` ships no `configs/`). Verified: baseline→rollout→reflect(on failures)→gate→test execute against real claude calls; an edit lands only when the optimizer judges a failure generalizable AND the held-out gate improves (no forced edit). 0.1.0 (2026-06-07) initial — /skillopt drives SkillOpt (microsoft/SkillOpt · `pip install skillopt`, arXiv:2605.23904), the text-space optimizer that trains a natural-language SKILL DOCUMENT for a frozen Claude Code agent via rollout → reflect → edit → held-out gate (DL analogy: skill.md = weights · rollout = forward · reflect = backprop · gate = validation early-stop). Subverbs — doctor (pip pkg + claude CLI + harness wiring readiness) · ckpts (list the package's bundled pretrained skill.md artifacts) · consume <skill.md> (load a trained skill into THIS session as additive system guidance) · train <config.yaml> (run the loop with Claude Code as the target harness — env TARGET_BACKEND=claude_code_exec · CLAUDE_SETTING_SOURCES=user,project so the sidecar tapes ride along as FIXED scaffolding; refuses to run without a real scoring env adapter — no fabricated scores) · help. HARD INVARIANT: only the skill.md is optimized — the model, the governance tapes (= SkillOpt's fixed prompts/*_system.md), and every *-guard safety hook stay UNCHANGED; the trained skill is a SEPARATE per-domain file injected via --append-system-prompt; /skillopt never edits a .tape or a guard (a held-out UTILITY gate is not a SAFETY check — kept orthogonal). Wraps the upstream pip CLI; does not vendor or fork it. Companion: microsoft/SkillLens (arXiv:2605.23899).",
"version": "0.5.0"
},
{
"name": "skillopt-hook",
"source": "./hooks/skillopt-hook",
"description": "0.1.0 (2026-06-07) SessionStart hook — auto-USES a trained skill without a command. If the user activated a learned skill (`/skillopt activate <skill.md>` → ~/.sidecar/skillopt/active-skill.md), injects it as additionalContext at session start so the agent applies it automatically (prefs-hook split: the command writes the SSOT, the hook auto-injects). OPT-IN + safe: silent when nothing is activated; NEVER trains (training is cost-bearing — stays a command/agent decision); always exits 0 (fail-open). Optional `~/.sidecar/skillopt/agent-active` marker adds a one-line nudge to PROPOSE (never auto-run) `/skillopt train` for repeatable auto-scorable tasks. Hook half of the skillopt USE-vs-TRAIN split; the `skillopt` command plugin is the TRAIN/activate half. NO env opt-out — the SSOT files are the switch.",
"version": "0.1.0"
},
{
"name": "sidecar",
"source": "./commands/sidecar",
Expand Down
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,26 @@ For the full audit trail, see `git log`.

---

## 2026-06-07 — 🎓 domain 0.11.0 — `/domain train` 으로 통일 · skillopt + skillopt-hook 폐기

스킬 학습 능력을 별도 플러그인 대신 **`/domain` 하나로 통일**. 네이티브 · pip 무의존.

- 🎓 **domain 0.11.0** — ML 서브버브 추가: `/domain doctor`(학습 준비 점검) ·
`/domain train [--bg]`(네이티브 pip-free SkillOpt 루프 — rollout → reflect → edit →
held-out gate, 백엔드 `claude -p` = 구독, 과금 API 아님) · `consume <skill.md>` ·
`activate`/`deactivate`(`~/.sidecar/domain-skill/active-skill.md`) · `status`/`log`.
ML 서브버브는 `bin/_domain_ml.sh`(+ `bin/_domain_ml.py` ~120줄 엔진)로 라우팅,
기존 도메인 버브는 `_domain.hexa` 로 **그대로** 유지.
- 🔒 **HARD INVARIANT** — 학습은 **별도 skill.md 만** 최적화. 도메인 자신의
`DOMAIN.md` / verdicts / 로그는 절대 자동 편집 안 함(B 분리).
- 📦 번들 `examples/toyqa`(format-sensitive QA 6 + 5) — 외부 데이터/pip 없이
baseline→rollout→reflect→gate 루프가 end-to-end 도는 걸 증명.
- 🗑 **skillopt(0.5.0) · skillopt-hook(0.1.0) 폐기** — 두 디렉터리 제거,
marketplace 엔트리 삭제. 모든 능력이 `/domain` 으로 흡수됨(USE=activate/hook 대체는
domain activate + SessionStart, TRAIN=domain train).
- 검증: `/domain doctor` smoke(claude CLI + 네이티브 엔진 감지) · py/sh 문법 · JSON 유효 ·
g22 lockstep(plugin 0.11.0 ↔ marketplace 0.11.0) + CHANGELOG 동일 커밋.

## 2026-06-07 — 🎓 skillopt 0.5.0 + skillopt-hook 0.1.0 — 자동 사용(하이브리드)

"명령어 안 치고 자동으로" + "에이전트 적극 활용"을 USE-vs-TRAIN 분리로 구현.
Expand Down
19 changes: 0 additions & 19 deletions commands/skillopt/.claude-plugin/plugin.json

This file was deleted.

Loading