tink-harness 1.12.0 → 1.14.0

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,7 +1,7 @@
1
1
  {
2
2
  "name": "tink",
3
3
  "description": "A small harness layer for Claude Code and Codex.",
4
- "version": "1.12.0",
4
+ "version": "1.14.0",
5
5
  "author": {
6
6
  "name": "dotori"
7
7
  }
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to Tink are tracked here.
4
4
 
5
+ ## [1.14.0] - 2026-06-19
6
+
7
+ - Added `CLAUDE_CONFIG_DIR` support: global installs now respect the env var (set via direnv or shell) so commands and skills land in the right config directory instead of always defaulting to `~/.claude`.
8
+ - Added `tink-harness update --all-repos`: finds every repo under the home directory that has Tink installed and updates each one. Uses `direnv exec` when available so per-repo `.envrc` overrides (including `CLAUDE_CONFIG_DIR`) are applied automatically; falls back to parsing simple `export` lines from `.envrc` otherwise.
9
+
10
+ ## [1.13.0] - 2026-06-19
11
+
12
+ - Added focused opt-in harnesses for recurring agent workflows: `issue-triage`, `bug-diagnosis-loop`, `review-two-axis`, `decision-map`, and `architecture-deepening`.
13
+ - Improved existing harnesses with selected workflow patterns: requirements interviews now inspect repo-discoverable answers first, plan consensus can compare interface alternatives and split unresolved decisions, delegation briefs reference existing artifacts and redact sensitive content, ship/PR merge records conflict intent, and harness curation has clearer idea-to-ship routing.
14
+ - Updated `/tink:cast` routing and Codex core rules so the new focused harnesses are considered only when their trigger changes the procedure. README and README.ko now describe the new selection surface.
15
+
5
16
  ## [1.12.0] - 2026-06-18
6
17
 
7
18
  - Added evidence lifecycle manager groundwork: `/tink:verify` now records a human-readable `.tink/current/evidence.md` summary card, config includes a `completion_policy` field for optional strict "no evidence, no done" behavior, and the dashboard lifecycle summary now exposes ROI hints, trust levels, and Activity-tab run review cards for failed or blocked runs without adding a new public replay command.
package/README.ko.md CHANGED
@@ -10,7 +10,7 @@ Tink는 사소하지 않은 모든 에이전트 작업을 눈에 보이는 파
10
10
 
11
11
  <sub>Claude Code와 Codex를 위한 작은 하네스 레이어</sub>
12
12
 
13
- **최신 패키지:** v1.12.0 — 검증 사람이 읽기 쉬운 evidence card를 남기고, strict 완료 정책의 “no evidence, no done” 기반을 추가했습니다. 대시보드에는 하네스 신뢰도, ROI, 실패/차단 run 복기 카드가 표시됩니다. 전체 변경 이력은 [CHANGELOG](CHANGELOG.md)를 확인하세요.
13
+ **최신 패키지:** v1.14.0 — 글로벌 설치 `CLAUDE_CONFIG_DIR` 환경변수를 반영하고, `update --all-repos`로 하위 모든 Tink 레포를 번에 업데이트할 있게 됐습니다. direnv가 있으면 레포별 `.envrc`를 자동으로 로드합니다. 전체 변경 이력은 [CHANGELOG](CHANGELOG.md)를 확인하세요.
14
14
 
15
15
  [English](README.md) · **한국어** · [변경 이력](CHANGELOG.md)
16
16
 
@@ -175,7 +175,9 @@ Claude Code에서는 `/tink:*`, Codex에서는 `$tink:*`을 씁니다. 예전 `$
175
175
 
176
176
  Tink는 이제 비단순 작업에 대해 `.tink/current/contract.json`도 만듭니다. 이 파일에는 작업 종류, 위험, 성공 조건, 금지 사항, 검증 명령이 들어갑니다.
177
177
 
178
- 더 크거나 모호한 작업에서는 `cast`가 에이전트의 생각 단계를 파일로 더 잘 드러내는 하네스를 고를 수 있습니다. 모호한 아이디어는 `requirements-interview`, 큰 계획은 `plan-consensus`, 긴 실행은 `goal-checkpoint`, 안전한 인수인계는 `delegation-brief`를 씁니다. 모두 `/tink:cast` 또는 `$tink:cast`가 고르는 재사용 하네스이며, 별도 CLI 명령은 아닙니다.
178
+ 더 크거나 모호한 작업에서는 `cast`가 에이전트의 생각 단계를 파일로 더 잘 드러내는 하네스를 고를 수 있습니다. 모호한 아이디어는 `requirements-interview`, 큰 계획은 `plan-consensus`, 긴 실행은 `goal-checkpoint`, 안전한 인수인계는 `delegation-brief`를 씁니다.
179
+
180
+ 더 특화된 작업에서는 focused harness도 선택할 수 있습니다. 이슈·PR·QA 정리는 `issue-triage`, 어려운 버그 재현 루프는 `bug-diagnosis-loop`, Standards와 Spec을 나누는 리뷰는 `review-two-axis`, 여러 세션에 걸친 미해결 결정은 `decision-map`, module/interface/seam 구조 개선은 `architecture-deepening`이 담당합니다. 모두 `/tink:cast` 또는 `$tink:cast`가 고르는 재사용 하네스이며, 별도 CLI 명령은 아닙니다.
179
181
 
180
182
  ### `/tink:verify` / `$tink:verify`
181
183
 
@@ -212,7 +214,7 @@ Tink가 아는 모든 것은 직접 읽고, diff 보고, 지울 수 있는 평
212
214
 
213
215
  이 전부를 움직이는 원칙은 세 가지입니다.
214
216
 
215
- 1. **일반 작업에는 하네스가 필요 없습니다.** 평범한 코드 변경·리뷰·문서 작업은 기본 절차(계획 → 단계 → 검증 증거)만으로 진행합니다. 하네스는 특화된 절차가 실제로 결과를 바꿀 때만 로드됩니다 — 출시 안전판, 목표 체크포인트, 계획 비평, 요구사항 인터뷰, 도메인 워크플로.
217
+ 1. **일반 작업에는 하네스가 필요 없습니다.** 평범한 코드 변경·리뷰·문서 작업은 기본 절차(계획 → 단계 → 검증 증거)만으로 진행합니다. 하네스는 특화된 절차가 실제로 결과를 바꿀 때만 로드됩니다 — 출시 안전판, 목표 체크포인트, 계획 비평, 요구사항 인터뷰, 이슈 정리, 어려운 버그 진단 루프, 두 축 리뷰, decision map, architecture deepening, 도메인 워크플로.
216
218
  2. **제안만 합니다.** 대시보드·`frog`·`weave`는 실제 사용 신호로 제안을 준비할 뿐입니다. 재사용되는 것(하네스, 메모리, 삭제)은 반드시 별도 명시 승인을 거칩니다. 오늘 실행의 승인이 미래 실행이 물려받을 변경을 허가하지 않습니다.
217
219
  3. **느낌이 아니라 증거.** 실행 기록, 실패한 체크, evidence summary card, friction 이벤트가 무엇을 개선하고(`weave`), 초안에서 하네스로 승격하고, 정리할지(`frog`)를 결정합니다. 증거가 약하면 삭제가 아니라 유지·관찰이 기본입니다.
218
220
 
package/README.md CHANGED
@@ -17,14 +17,14 @@
17
17
  <p><sub>A small harness layer for Claude Code and Codex</sub></p>
18
18
 
19
19
  <p>
20
- <a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.12.0"><img src="https://img.shields.io/github/v/release/dotoricode/tink-harness?label=release&color=2ea44f" alt="GitHub release"></a>
20
+ <a href="https://github.com/dotoricode/tink-harness/releases/tag/v1.13.0"><img src="https://img.shields.io/github/v/release/dotoricode/tink-harness?label=release&color=2ea44f" alt="GitHub release"></a>
21
21
  <a href="https://www.npmjs.com/package/tink-harness"><img src="https://img.shields.io/npm/v/tink-harness?label=npm&color=cb3837" alt="npm version"></a>
22
22
  <a href="https://github.com/dotoricode/tink-harness/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/dotoricode/tink-harness/ci.yml?branch=main&label=ci" alt="CI"></a>
23
23
  <a href="https://github.com/dotoricode/tink-harness/blob/main/LICENSE"><img src="https://img.shields.io/github/license/dotoricode/tink-harness" alt="License"></a>
24
24
  <a href="https://github.com/dotoricode/tink-harness/stargazers"><img src="https://img.shields.io/github/stars/dotoricode/tink-harness?style=social" alt="GitHub stars"></a>
25
25
  </p>
26
26
 
27
- <p><strong>Latest package:</strong> v1.12.0 - Tink now records a human-readable evidence card after verification, adds the strict completion-policy groundwork for "no evidence, no done", and shows dashboard hints for harness trust, ROI, and failed/blocked run review. See <a href="CHANGELOG.md">CHANGELOG</a> for release history.</p>
27
+ <p><strong>Latest package:</strong> v1.14.0 - Tink respects <code>CLAUDE_CONFIG_DIR</code> for global installs and adds <code>update --all-repos</code> to refresh every Tink-installed repo in one command, with direnv support for per-repo env overrides. See <a href="CHANGELOG.md">CHANGELOG</a> for release history.</p>
28
28
 
29
29
  **English** · [한국어](README.ko.md) · [Changelog](CHANGELOG.md)
30
30
 
@@ -219,7 +219,9 @@ In Tink, `cast` is the main path. It reads the task, chooses or drafts the right
219
219
 
220
220
  Use it when the task is more than a quick answer.
221
221
 
222
- For bigger or fuzzier work, `cast` can expose more of the agent's thinking as files without adding new commands. Ambiguous ideas can start with `requirements-interview`, broad plans with `plan-consensus`, long runs with `goal-checkpoint`, and safe handoffs with `delegation-brief`. These are reusable harnesses selected by `/tink:cast` or `$tink:cast`, not separate CLI workflows.
222
+ For bigger or fuzzier work, `cast` can expose more of the agent's thinking as files without adding new commands. Ambiguous ideas can start with `requirements-interview`, broad plans with `plan-consensus`, long runs with `goal-checkpoint`, and safe handoffs with `delegation-brief`.
223
+
224
+ More specialized work can opt into focused harnesses: `issue-triage` for issue/PR/QA intake, `bug-diagnosis-loop` for hard bugs that need a red-capable repro loop, `review-two-axis` for Standards vs Spec review, `decision-map` for multi-session unknowns, and `architecture-deepening` for module/interface/seam design. These are selected by `/tink:cast` or `$tink:cast`; they are not separate CLI workflows.
223
225
 
224
226
  ### `/tink:verify` / `$tink:verify`
225
227
 
@@ -266,7 +268,7 @@ Everything Tink knows lives in plain files you can read, diff, and delete:
266
268
 
267
269
  Three rules drive all of it:
268
270
 
269
- 1. **Generic work runs without a harness.** An ordinary code change, review, or doc edit runs on the base run contract alone — plan, steps, verification evidence. A harness is loaded only when a specialized procedure actually changes what happens: release gates, goal checkpoints, plan critique, requirements interviews, domain workflows.
271
+ 1. **Generic work runs without a harness.** An ordinary code change, review, or doc edit runs on the base run contract alone — plan, steps, verification evidence. A harness is loaded only when a specialized procedure actually changes what happens: release gates, goal checkpoints, plan critique, requirements interviews, issue triage, hard-bug diagnosis loops, two-axis reviews, decision maps, architecture deepening, or other domain workflows.
270
272
  2. **Suggestions only.** The dashboard, `frog`, and `weave` prepare proposals from real usage signals. Nothing reusable — a harness, a memory entry, a deletion — is saved without its own explicit approval. Approving today's run never authorizes changes that future runs would inherit.
271
273
  3. **Evidence over vibes.** Run records, failed checks, evidence summary cards, and friction events decide what gets improved (`weave`), promoted from draft to harness, or cleaned up (`frog`). Weak evidence defaults to keep-and-observe, never to delete.
272
274
 
package/VERSIONING.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Versioning
2
2
 
3
- Current version: `1.12.0`
3
+ Current version: `1.14.0`
4
4
 
5
5
  Tink follows semver from `1.0.0` onward.
6
6
 
package/bin/install.js CHANGED
@@ -126,7 +126,7 @@ function argValue(name) {
126
126
  }
127
127
 
128
128
  function usage() {
129
- console.log(`Tink installer for Claude Code and Codex\n\nUsage:\n tink-harness [install] [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--with-hook] [--clean-codex-picker] [--dry-run] [--force]\n tink-harness update [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--clean-codex-picker] [--dry-run] [--force]\n tink-harness dashboard [--no-open]\n\nIf the command is not installed yet, use:\n npx tink-harness@latest [install]\n npx tink-harness@latest update\n\nCommands:\n install Install Tink.\n update Update Tink to the latest templates. Asks only the agent surface; Tink-owned files always refresh, user-modified harness/memory/config files are kept.\n dashboard Generate the harness health report from local .tink records and open it in your browser. Use --no-open to skip opening.\n\nDefault interactive flow:\n 1. Select language\n 2. Show TINK wizard\n 3. Select Claude Code, Codex, or both\n 4. Select components\n 5. Select repo/global installation scope\n 6. Select Advanced options\n 7. Select git tracking policy for project state\n\nAdvanced options:\n --dry-run Preview only. Show what would be written or removed, but do not change files.\n --force Overwrite user-modified files. Use only when you want official templates to replace local edits.\n --clean-codex-picker Codex-only cleanup. Remove repo-local Claude Tink surfaces that show as Source Command Tink entries.\n\nEnvironment:\n TINK_INSTALL_SURFACES=claude|codex|all\n TINK_CLEAN_CODEX_PICKER=1\n\nScopes:\n repo Install shared .tink files into the current project.\n global Install shared .tink files into your home directory.\n`);
129
+ console.log(`Tink installer for Claude Code and Codex\n\nUsage:\n tink-harness [install] [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--with-hook] [--clean-codex-picker] [--dry-run] [--force]\n tink-harness update [--scope=repo|global] [--global] [--lang=en|ko|zh] [--yes] [--clean-codex-picker] [--dry-run] [--force]\n tink-harness update --all-repos\n tink-harness dashboard [--no-open]\n\nIf the command is not installed yet, use:\n npx tink-harness@latest [install]\n npx tink-harness@latest update\n\nCommands:\n install Install Tink.\n update Update Tink to the latest templates. Asks only the agent surface; Tink-owned files always refresh, user-modified harness/memory/config files are kept.\n dashboard Generate the harness health report from local .tink records and open it in your browser. Use --no-open to skip opening.\n\nDefault interactive flow:\n 1. Select language\n 2. Show TINK wizard\n 3. Select Claude Code, Codex, or both\n 4. Select components\n 5. Select repo/global installation scope\n 6. Select Advanced options\n 7. Select git tracking policy for project state\n\nAdvanced options:\n --dry-run Preview only. Show what would be written or removed, but do not change files.\n --force Overwrite user-modified files. Use only when you want official templates to replace local edits.\n --clean-codex-picker Codex-only cleanup. Remove repo-local Claude Tink surfaces that show as Source Command Tink entries.\n --all-repos Update all repos with Tink under the home directory. Uses direnv if available to load per-repo .envrc.\n\nEnvironment:\n TINK_INSTALL_SURFACES=claude|codex|all\n TINK_CLEAN_CODEX_PICKER=1\n CLAUDE_CONFIG_DIR Override ~/.claude for global installs (e.g. set by direnv per project)\n CODEX_HOME Override ~/.codex for Codex skill installs\n\nScopes:\n repo Install shared .tink files into the current project.\n global Install shared .tink files into your home directory.\n`);
130
130
  }
131
131
 
132
132
  function findTinkRoot() {
@@ -228,6 +228,15 @@ function codexHome() {
228
228
  return process.env.CODEX_HOME || path.join(os.homedir(), '.codex');
229
229
  }
230
230
 
231
+ // CLAUDE_CONFIG_DIR replaces ~/.claude for global installs (like direnv per-project overrides).
232
+ // Repo-scope installs always use <repo>/.claude regardless of this env var.
233
+ function claudeDir(target) {
234
+ if (process.env.CLAUDE_CONFIG_DIR && target === os.homedir()) {
235
+ return process.env.CLAUDE_CONFIG_DIR;
236
+ }
237
+ return path.join(target, '.claude');
238
+ }
239
+
231
240
  function legacyComponentOptionsFor(agent, language) {
232
241
  const options = COMPONENTS[language].filter((item) => {
233
242
  if (item.value === 'commands') return includesClaude(agent);
@@ -364,8 +373,8 @@ function locationSummary(agent, scope) {
364
373
  return [
365
374
  `Repo target: ${repoTarget}`,
366
375
  `Shared .tink target: ${path.join(installTarget, '.tink')}`,
367
- includesClaude(agent) ? `Claude Code command target: ${path.join(installTarget, '.claude/commands/tink')}` : null,
368
- includesClaude(agent) ? `Claude Code skill target: ${path.join(installTarget, '.claude/skills/tink')}` : null,
376
+ includesClaude(agent) ? `Claude Code command target: ${path.join(claudeDir(installTarget), 'commands/tink')}` : null,
377
+ includesClaude(agent) ? `Claude Code skill target: ${path.join(claudeDir(installTarget), 'skills/tink')}` : null,
369
378
  includesCodex(agent) ? `Codex skills target: ${path.join(codexHome(), 'skills')}` : null,
370
379
  includesCodex(agent) ? `Codex picker cleanup target: ${path.join(process.cwd(), '.claude')}` : null
371
380
  ].filter(Boolean).join('\n');
@@ -710,12 +719,12 @@ function copyDir(src, dest, base) {
710
719
 
711
720
  function copyTinkCommands(templateRoot, target) {
712
721
  const commandSrc = path.join(templateRoot, 'claude/commands/tink');
713
- const commandDest = path.join(target, '.claude/commands/tink');
714
- const flatCommandDest = path.join(target, '.claude/commands');
722
+ const commandDest = path.join(claudeDir(target), 'commands/tink');
723
+ const flatCommandDest = path.join(claudeDir(target), 'commands');
715
724
  const legacyFlatCommands = ['tink-setup.md', 'tink-forge.md', 'tink-list.md', 'tink-purge.md', 'tink-hone.md'];
716
725
  const legacyNamespaceCommands = ['forge.md', 'purge.md', 'hone.md'];
717
726
  const legacyTinyCommands = ['tiny-setup.md', 'tiny-use.md', 'tiny-list.md', 'tiny-save.md'];
718
- const legacyDirs = [path.join(flatCommandDest, 'tiny'), path.join(target, '.claude/skills/tiny')];
727
+ const legacyDirs = [path.join(flatCommandDest, 'tiny'), path.join(claudeDir(target), 'skills/tiny')];
719
728
  for (const name of legacyFlatCommands) {
720
729
  const legacy = path.join(flatCommandDest, name);
721
730
  if (fs.existsSync(legacy)) {
@@ -863,7 +872,7 @@ function hookCommandFor(scope, target) {
863
872
  }
864
873
 
865
874
  function registerClaudeHook(target, scope, base) {
866
- const settingsPath = path.join(target, '.claude/settings.json');
875
+ const settingsPath = path.join(claudeDir(target), 'settings.json');
867
876
  const settings = readJsonFile(settingsPath, {});
868
877
  const command = hookCommandFor(scope, target);
869
878
  settings.hooks ||= {};
@@ -893,7 +902,7 @@ function copySelected(scope, components, agent) {
893
902
  }
894
903
  if (wantsClaudeSkill(components)) {
895
904
  if (includesClaude(agent) && !cleanupCodexPicker) {
896
- copyDir(path.join(templateRoot, 'claude/skills'), path.join(target, '.claude/skills'), target);
905
+ copyDir(path.join(templateRoot, 'claude/skills'), path.join(claudeDir(target), 'skills'), target);
897
906
  }
898
907
  }
899
908
  if (wantsCodexSkills(components)) {
@@ -995,8 +1004,8 @@ function doneLineFor(agent) {
995
1004
 
996
1005
  function updateResultSummary(agent, targets) {
997
1006
  const locations = [
998
- includesClaude(agent) ? `Claude Code commands: ${path.join(targets.installTarget, '.claude/commands/tink')}` : null,
999
- includesClaude(agent) ? `Claude Code skill: ${path.join(targets.installTarget, '.claude/skills/tink')}` : null,
1007
+ includesClaude(agent) ? `Claude Code commands: ${path.join(claudeDir(targets.installTarget), 'commands/tink')}` : null,
1008
+ includesClaude(agent) ? `Claude Code skill: ${path.join(claudeDir(targets.installTarget), 'skills/tink')}` : null,
1000
1009
  includesCodex(agent) ? `Codex skills: ${path.join(targets.codexTarget, 'skills')}` : null,
1001
1010
  `Tink shared files: ${path.join(targets.installTarget, '.tink')}`
1002
1011
  ].filter(Boolean);
@@ -1216,12 +1225,119 @@ async function resolveChoices() {
1216
1225
  return { agent, scope, components, gitPolicy, hookScope, language };
1217
1226
  }
1218
1227
 
1228
+ function findAllTinkRepos() {
1229
+ const found = [];
1230
+ const skip = new Set(['node_modules', '.git', 'vendor', 'dist', 'build', 'out', 'target', '.cache']);
1231
+
1232
+ function scan(dir, depth) {
1233
+ if (depth > 4) return;
1234
+ let entries;
1235
+ try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
1236
+ let hasTink = false;
1237
+ for (const entry of entries) {
1238
+ if (!entry.isDirectory()) continue;
1239
+ if (entry.name === '.tink') { hasTink = true; continue; }
1240
+ if (skip.has(entry.name) || entry.name.startsWith('.')) continue;
1241
+ scan(path.join(dir, entry.name), depth + 1);
1242
+ }
1243
+ if (hasTink) found.push(dir);
1244
+ }
1245
+
1246
+ scan(os.homedir(), 0);
1247
+ return found;
1248
+ }
1249
+
1250
+ function isDirenvAvailable() {
1251
+ return spawnSync('direnv', ['version'], { encoding: 'utf8' }).status === 0;
1252
+ }
1253
+
1254
+ function parseEnvrc(envrcPath, repoDir) {
1255
+ if (!fs.existsSync(envrcPath)) return {};
1256
+ const env = {};
1257
+ for (const line of fs.readFileSync(envrcPath, 'utf8').split('\n')) {
1258
+ const m = line.match(/^\s*export\s+([A-Z_][A-Z0-9_]*)=(.*)/);
1259
+ if (!m) continue;
1260
+ let val = m[2].trim().replace(/^["']|["']$/g, '');
1261
+ val = val
1262
+ .replace(/\$HOME|\bHOME\b/g, os.homedir())
1263
+ .replace(/\$PWD|\bPWD\b/g, repoDir)
1264
+ .replace(/^~/, os.homedir());
1265
+ env[m[1]] = val;
1266
+ }
1267
+ return env;
1268
+ }
1269
+
1270
+ async function runAllRepos() {
1271
+ const allRepos = findAllTinkRepos();
1272
+ const sourceRoot = path.resolve(root);
1273
+ const repos = allRepos.filter((r) => path.resolve(r) !== sourceRoot);
1274
+
1275
+ if (repos.length === 0) {
1276
+ console.log('No repos with Tink installed found under home directory.');
1277
+ return;
1278
+ }
1279
+
1280
+ const hasDirenv = isDirenvAvailable();
1281
+ const installScript = path.join(root, 'bin/install.js');
1282
+
1283
+ console.log(`Found ${repos.length} repo(s) with Tink installed:\n`);
1284
+ for (const repo of repos) {
1285
+ const envrc = path.join(repo, '.envrc');
1286
+ const envVars = hasDirenv ? {} : parseEnvrc(envrc, repo);
1287
+ const claudeTarget = envVars.CLAUDE_CONFIG_DIR
1288
+ ? envVars.CLAUDE_CONFIG_DIR
1289
+ : path.join(repo, '.claude');
1290
+ const note = fs.existsSync(envrc)
1291
+ ? hasDirenv
1292
+ ? `(direnv)`
1293
+ : envVars.CLAUDE_CONFIG_DIR
1294
+ ? `(.envrc → CLAUDE_CONFIG_DIR=${envVars.CLAUDE_CONFIG_DIR})`
1295
+ : `(.envrc, no CLAUDE_CONFIG_DIR)`
1296
+ : '';
1297
+ console.log(` ${repo} ${note}`);
1298
+ console.log(` → ${claudeTarget}/commands/tink`);
1299
+ }
1300
+ console.log('');
1301
+
1302
+ for (const repo of repos) {
1303
+ console.log(`▶ ${path.basename(repo)} (${repo})`);
1304
+ const envrc = path.join(repo, '.envrc');
1305
+ const extraEnv = hasDirenv ? {} : parseEnvrc(envrc, repo);
1306
+ const mergedEnv = { ...process.env, ...extraEnv };
1307
+
1308
+ let result;
1309
+ if (hasDirenv && fs.existsSync(envrc)) {
1310
+ result = spawnSync(
1311
+ 'direnv', ['exec', repo, 'node', installScript, 'update', '--yes', '--scope=repo'],
1312
+ { cwd: repo, env: process.env, stdio: 'inherit', encoding: 'utf8' }
1313
+ );
1314
+ } else {
1315
+ result = spawnSync(
1316
+ process.execPath, [installScript, 'update', '--yes', '--scope=repo'],
1317
+ { cwd: repo, env: mergedEnv, stdio: 'inherit', encoding: 'utf8' }
1318
+ );
1319
+ }
1320
+
1321
+ if (result.status !== 0) {
1322
+ console.error(` ✗ failed (exit ${result.status})`);
1323
+ } else {
1324
+ console.log(` ✓ done`);
1325
+ }
1326
+ console.log('');
1327
+ }
1328
+ }
1329
+
1219
1330
  async function main() {
1220
1331
  if (command === 'help' || args.includes('--help')) {
1221
1332
  usage();
1222
1333
  process.exit(0);
1223
1334
  }
1224
1335
 
1336
+ if (command === 'update' && args.includes('--all-repos')) {
1337
+ await runAllRepos();
1338
+ return;
1339
+ }
1340
+
1225
1341
  if (command === 'dashboard') {
1226
1342
  runDashboard();
1227
1343
  return;
package/commands/cast.md CHANGED
@@ -160,6 +160,38 @@ Optional current-run artifacts are created only when their harness is selected:
160
160
  - `goals.json`: current-run goals for `goal-checkpoint`; keep 2-6 goals, one active goal, status, done criteria, verification, and evidence.
161
161
  - `delegation.md`: handoff or parallel-work packets for `delegation-brief`; include packet scope, forbidden actions, expected evidence, and reconciliation notes. Do not start tmux panes, worktrees, workers, or external agents from this harness.
162
162
 
163
+ ## Evidence Split
164
+ Evidence Split is a base-run habit, not a separate harness. It keeps real work small while the task is happening by splitting broad or uncertain work into evidence-sized packets.
165
+
166
+ Use Evidence Split at cast time and again during implementation when:
167
+ - the first plan has several uncertain facts,
168
+ - implementation starts coupling several files or concepts,
169
+ - a check fails and the next action is unclear,
170
+ - context is becoming broad or stale,
171
+ - independent verification, review, or handoff would reduce risk.
172
+
173
+ Skip it for tiny, obvious edits where a packet would not change the next action.
174
+
175
+ Packet vocabulary:
176
+ - `probe`: answer one unknown with 1-3 inputs.
177
+ - `patch`: make one narrow implementation change.
178
+ - `verify`: prove one success condition or failure recovery.
179
+ - `review`: inspect one risk, regression, or omission.
180
+ - `decision`: record one branch, chosen option, and evidence.
181
+
182
+ Represent packets in existing run state:
183
+ - `steps.json`: packetized steps and status.
184
+ - `context-map.json`: the input files, sources, or excluded context for each packet.
185
+ - `notes.md`: why work was split or re-split during implementation.
186
+ - `delegation.md`: only when `delegation-brief` is selected or another human/agent packet is explicitly needed.
187
+
188
+ Safety defaults:
189
+ - Do not start workers, tmux panes, worktrees, or external agents automatically.
190
+ - Packet outputs are evidence, risks, recommendations, or patch candidates by default; direct edits require the main agent's normal approval and ownership.
191
+ - Do not let multiple packets edit the same file concurrently.
192
+ - Keep secrets, public contracts, broad refactors, release/publish actions, and final reconciliation under the main agent's control.
193
+ - Keep each packet to 1-3 primary inputs when possible.
194
+
163
195
  Create `contract.json` before loading harness bodies. It should be short, factual, and based on the user request plus visible project context:
164
196
 
165
197
  ```json
@@ -445,7 +477,7 @@ Rule: while such a run is active, END every assistant response with a progress b
445
477
  ## Base run (no harness)
446
478
  Generic task-type harnesses (`code-change`, `bug-fix`, `research`, `review`, `docs`) are retired from the default set. Generic work runs as a **base run**: the run state contract alone - `plan.md`, `checks.md`, `steps.json`, `contract.json` - already enforces scope, verification commands, and evidence for ordinary code, bug, research, review, and docs work.
447
479
 
448
- - Select a harness only when its specialized procedure changes what would actually happen: visible-thinking overlays (`requirements-interview`, `plan-consensus`, `goal-checkpoint`, `delegation-brief`), risk gates (`ship`, `pre-publish-multi-agent-verify`, `pr-merge`), meta harnesses (`harness-curation`, `harness-synthesis`), `tink-feedback-apply`, or user-created and synthesized domain harnesses.
480
+ - Select a harness only when its specialized procedure changes what would actually happen: visible-thinking overlays (`requirements-interview`, `plan-consensus`, `goal-checkpoint`, `delegation-brief`), focused work harnesses (`issue-triage`, `bug-diagnosis-loop`, `review-two-axis`, `decision-map`, `architecture-deepening`), risk gates (`ship`, `pre-publish-multi-agent-verify`, `pr-merge`), meta harnesses (`harness-curation`, `harness-synthesis`), `tink-feedback-apply`, or user-created and synthesized domain harnesses.
449
481
  - Never force a loose-fit harness just to show a harness name. "No harness" is a valid and common selection.
450
482
  - In user-facing output call this `기본 절차` (Korean) or `base run` (English), with one short explanation line such as `기본 절차로 진행합니다 - 별도 하네스 없이 실행 상태 계약(계획·검증·증거)만 사용`.
451
483
  - The base run does not weaken anything: contract checks, Stitch, overlay rules, and the progress display still apply unchanged.
@@ -480,17 +512,24 @@ This is the Lane 3 full path from Quick triage. Lanes 1 and 2 intentionally skip
480
512
  - new pattern not covered yet
481
513
 
482
514
  These are task types, not harness names. Generic types (code change, bug fix, research, review, docs) default to the base run; a harness is added only when a specialized one genuinely fits.
483
- 6. Consider GJC-style visible-thinking overlays as normal Tink harnesses, not as new command surfaces:
515
+ 6. Apply the Evidence Split check before choosing harnesses. If it changes the next action, represent the first packets in `steps.json` and connect each packet to context or verification evidence in `context-map.json`. Keep this check lightweight and skip it for tiny work.
516
+ 7. Consider GJC-style visible-thinking overlays as normal Tink harnesses, not as new command surfaces:
484
517
  - If the request is an ambiguous idea, early product concept, or underspecified implementation prompt, prefer `requirements-interview` before planning or coding. This is the default harness when Stitch is expected to trigger for goal ambiguity or missing acceptance criteria.
485
518
  - If the request asks for a plan, architecture decision, large refactor, migration, or broad public contract change, consider `plan-consensus`.
486
519
  - If the work naturally splits into multiple durable milestones, add `goal-checkpoint` and create `.tink/current/goals.json` after approval.
487
520
  - If parallel review, independent verification, or handoff would reduce risk, add `delegation-brief` and create `.tink/current/delegation.md` after approval. This harness prepares briefs only; it never starts tmux, worktrees, workers, or external agents.
521
+ 8. Consider focused work harnesses only when their trigger is strong enough to change the procedure:
522
+ - Use `issue-triage` for issue/PR/QA intake, ready-for-agent briefs, needs-info/wontfix decisions, or vertical issue slices.
523
+ - Use `bug-diagnosis-loop` for hard bugs, regressions, intermittent failures, or performance problems where a red-capable loop must come before code changes.
524
+ - Use `review-two-axis` for PR/branch/diff review when Standards and Spec should be reported separately.
525
+ - Use `decision-map` only when a loose idea has multiple unresolved decisions that need research, prototype, or discussion tickets across sessions.
526
+ - Use `architecture-deepening` only when the work is explicitly about module/interface/seam shape, deep modules, leverage, locality, or testability.
488
527
 
489
528
  **Overlay selection is rule-bound, not taste.** After drafting the Goals list for the approval payload, re-check before presenting it:
490
529
  - `goal-checkpoint` is REQUIRED (not optional) when ANY of these is true: the Goals list has 2+ goals; 2+ harnesses run sequentially; the plan is expected to need 4+ steps; or the work spans multiple components/directories. Create `goals.json` after approval.
491
530
  - `plan-consensus` must be explicitly considered for any from-scratch implementation, reimplementation, migration, or public contract/API design. If skipped, record a one-line reason in the 오버레이 점검 line.
492
531
  - The context budget and the "prefer 1-3 harnesses" guidance never justify dropping a REQUIRED overlay: overlays are cheap state files, not extra loaded context. A large task judged "fine with default harnesses" because the synthesis probe found a fit is a selection bug - the probe only answers whether a custom procedure is needed, not whether overlays are needed.
493
- 7. Pick the smallest effective set using the context budget policy below: the base run plus 0-3 specialized harnesses. When no specialized harness fits, select the base run alone - do not force a generic fit. Do not use a hard cap when several tiny harnesses add useful checks without crowding context. When the task is ambiguous (Stitch goal-ambiguity is expected to trigger), start with `requirements-interview` alone; add a second harness only after the user clarifies. Do not bundle 2+ harnesses for ambiguous tasks upfront.
532
+ 9. Pick the smallest effective set using the context budget policy below: the base run plus 0-3 specialized harnesses. When no specialized harness fits, select the base run alone - do not force a generic fit. Do not use a hard cap when several tiny harnesses add useful checks without crowding context. When the task is ambiguous (Stitch goal-ambiguity is expected to trigger), start with `requirements-interview` alone; add a second harness only after the user clarifies. Do not bundle 2+ harnesses for ambiguous tasks upfront.
494
533
 
495
534
  After selecting, run a quick quality check using the index metadata for each chosen harness:
496
535
  - If fewer than 2 words in `use_when` match the current task description (case-insensitive) → treat as a Stitch harness-mismatch signal
@@ -498,26 +537,26 @@ This is the Lane 3 full path from Quick triage. Lanes 1 and 2 intentionally skip
498
537
  - If `asks` is empty or missing and the task goal is not self-evident → treat as a Stitch goal-ambiguity signal
499
538
  Feed any signals into the Stitch evaluation at step 16.
500
539
 
501
- 8. Add any rule graph check candidates to `contract.json` verification if they are relevant and cheap. For risky commands, set `approval_required: true`.
502
- 9. Add opt-in guard candidates to `notes.md` only as suggestions. Do not register enforcement hooks unless the user separately approves.
503
- 10. Run the synthesis probe on the initial harness choice. The probe produces one of three outcomes: strong fit (0-1 yes), generic fit (2-3 yes), or no fit (4-5 yes or no harness matches).
504
- 11. If the probe finds no fit, load `harness-synthesis` and draft a domain-specific harness for this run instead of forcing a bad fit.
505
- 12. If the probe finds a generic fit (2-3 yes), propose a run-only draft harness or domain rules alongside the base run or selected harness. Do not save it by default.
506
- 13. If too many tools, skills, agents, or harnesses are available, load `harness-curation` and choose the smallest effective set before loading more context.
507
- 14. If lightweight signals show a recurring operating habit, use `harness-curation` (its habit calibration section) to make one advisory recommendation without loading a separate body.
508
- 15. If the user points to research, notes, examples, prior failures, or "what I learned today", synthesize from those inputs. Extract behavior-shaping rules and reusable procedure, not a summary.
509
- 16. Run Stitch once before committing to `.tink/current/`. If it triggers, show exactly one proposal before approval. Call `AskUserQuestion` as described in the Interaction policy section.
510
- 17. Ask for explicit approval before non-trivial work.
511
- 18. After approval, read only the selected harness files and any approved run-only draft.
512
- 19. Create `.tink/current/` files from the run state contract, including `contract.json`, `session.json`, `context-pack.md`, `context-map.json`, `context-metrics-evaluation.json`, and `excluded-context.md`. If selected, also create `goals.json` for `goal-checkpoint` and `delegation.md` for `delegation-brief`.
513
- 20. Execute the first safe step immediately:
540
+ 10. Add any rule graph check candidates to `contract.json` verification if they are relevant and cheap. For risky commands, set `approval_required: true`.
541
+ 11. Add opt-in guard candidates to `notes.md` only as suggestions. Do not register enforcement hooks unless the user separately approves.
542
+ 12. Run the synthesis probe on the initial harness choice. The probe produces one of three outcomes: strong fit (0-1 yes), generic fit (2-3 yes), or no fit (4-5 yes or no harness matches).
543
+ 13. If the probe finds no fit, load `harness-synthesis` and draft a domain-specific harness for this run instead of forcing a bad fit.
544
+ 14. If the probe finds a generic fit (2-3 yes), propose a run-only draft harness or domain rules alongside the base run or selected harness. Do not save it by default.
545
+ 15. If too many tools, skills, agents, or harnesses are available, load `harness-curation` and choose the smallest effective set before loading more context.
546
+ 16. If lightweight signals show a recurring operating habit, use `harness-curation` (its habit calibration section) to make one advisory recommendation without loading a separate body.
547
+ 17. If the user points to research, notes, examples, prior failures, or "what I learned today", synthesize from those inputs. Extract behavior-shaping rules and reusable procedure, not a summary.
548
+ 18. Run Stitch once before committing to `.tink/current/`. If it triggers, show exactly one proposal before approval. Call `AskUserQuestion` as described in the Interaction policy section.
549
+ 19. Ask for explicit approval before non-trivial work.
550
+ 20. After approval, read only the selected harness files and any approved run-only draft.
551
+ 21. Create `.tink/current/` files from the run state contract, including `contract.json`, `session.json`, `context-pack.md`, `context-map.json`, `context-metrics-evaluation.json`, and `excluded-context.md`. If selected, also create `goals.json` for `goal-checkpoint` and `delegation.md` for `delegation-brief`.
552
+ 22. Execute the first safe step immediately:
514
553
  - inspect relevant files,
515
554
  - run a read-only diagnostic,
516
555
  - draft the first artifact,
517
556
  - or reproduce the issue.
518
- 21. Keep `steps.json`, `notes.md`, `contract.json`, and `session.json` current as work progresses. When present, keep `goals.json` and `delegation.md` aligned with actual status and evidence. When the Progress display trigger applies, end every response with the progress block.
519
- 22. Before final, run `/tink:verify` behavior for required contract checks or state why verification is blocked.
520
- 23. If the task exposed a repeated mistake or reusable improvement, use the Reusable State Save Gate approval payload below. Save only after separate user approval.
557
+ 23. Keep `steps.json`, `notes.md`, `contract.json`, and `session.json` current as work progresses. Re-run Evidence Split when new uncertainty, coupling, failed checks, or context sprawl appears; update packetized steps and context evidence before continuing. When present, keep `goals.json` and `delegation.md` aligned with actual status and evidence. When the Progress display trigger applies, end every response with the progress block.
558
+ 24. Before final, run `/tink:verify` behavior for required contract checks or state why verification is blocked.
559
+ 25. If the task exposed a repeated mistake or reusable improvement, use the Reusable State Save Gate approval payload below. Save only after separate user approval.
521
560
 
522
561
 
523
562
  ## Synthesis probe
@@ -2,6 +2,10 @@
2
2
 
3
3
  이 문서는 남은 로드맵을 번호가 붙은 단계가 아니라 실제 작업 단위로 다시 정리한다. 모든 작업은 Claude Code와 Codex를 함께 지원하고, macOS와 Windows에서 동작해야 하며, 사용자가 명시적으로 원하지 않는 한 새 public command surface를 만들지 않는다.
4
4
 
5
+ ## 관리 규칙
6
+
7
+ 포괄적인 아이디어는 바로 구현 목록에 넣지 않고 먼저 요구사항, 성공 기준, 제외 범위, 검증 근거로 좁힌다. 구현이 완료된 작업 단위는 이 활성 목록에서 제거하고, 완료 사실은 구현된 기반, PR 문서, changelog, 또는 별도 완료 기록에 남긴다.
8
+
5
9
  ## 구현된 기반
6
10
 
7
11
  ### 하네스 생애주기 신호
@@ -87,6 +91,20 @@ Standalone CLI를 더 짧게 입력하고, 로컬 health report를 더 쉽게
87
91
  - `dashboard`는 기본적으로 로컬 정적 파일만 만든다. 서버, watcher, hidden cache, 자동 하네스 수정은 하지 않는다.
88
92
  - 생성 파일 경로가 플랫폼별로 안정화된 뒤에만 선택적인 open/export flag를 검토한다.
89
93
 
94
+ ## Evidence Split / Parallel Evidence
95
+
96
+ 작업 병렬화보다 먼저, Tink의 기본 작업 루프에 Evidence Split을 넣는다. Tink를 별도 multi-agent runtime으로 만들지 않고, 큰 작업을 작은 증거 packet으로 나누는 기본 동작부터 안정화한다. 상세 연구 기록은 `docs/swarm-fast-lane.ko.md`와 `docs/swarm-fast-lane.md`에 둔다.
97
+
98
+ - `/tink:cast`와 `$tink:cast`는 하네스 선택 전에 `probe`, `patch`, `verify`, `review`, `decision` packet으로 나눌 수 있는지 점검한다.
99
+ - 실제 작업 중에도 불확실성, 검증 실패, context 확대, 변경 결합이 생기면 다시 packet으로 나눈다.
100
+ - packet은 전체 작업이 아니라 1-3개 입력만 가진 작은 단위를 본다.
101
+ - 외부 worker가 필요할 때도 기본적으로 파일을 직접 수정하지 않고 evidence와 patch candidate만 반환한다.
102
+ - 메인 에이전트만 최종 patch 선택, 파일 수정, 검증을 책임진다.
103
+ - 성공 지표는 "항상 더 빠름"이 아니라 main context 감소, 재작업 감소, 실패 조기 발견, 검증 통과율 유지 또는 개선으로 둔다.
104
+ - 초기 모드는 core behavior인 Evidence Split으로 두고, 실제 worker runtime은 별도 후속 작업으로 미룬다.
105
+ - worker 출력은 future runtime에서도 300단어 이하, evidence-only, confidence 포함으로 제한한다.
106
+ - public contract, secrets, 넓은 repo scan, 동일 파일 동시 수정이 필요한 작업에서는 선택하지 않는다.
107
+
90
108
  ## 제외
91
109
 
92
110
  release evidence bundling은 계속 제외한다. release history, public release note, portfolio framing은 사용자나 팀의 판단 영역이다. Tink는 검증 artifact를 남길 수 있지만, 공개 release evidence를 어떻게 묶을지는 대신 결정하지 않는다.
@@ -2,6 +2,10 @@
2
2
 
3
3
  This document restates the remaining roadmap as work units instead of numbered phases. Each unit should support Claude Code and Codex, work on macOS and Windows, and avoid new public command surfaces unless the user explicitly asks for one.
4
4
 
5
+ ## Management Rule
6
+
7
+ Broad ideas should not enter the implementation list directly. First narrow them into requirements, success criteria, out-of-scope boundaries, and verification evidence. Once a work unit is implemented, remove it from this active list and record the completion in the implemented baseline, PR docs, changelog, or another completion record.
8
+
5
9
  ## Implemented Baseline
6
10
 
7
11
  ### Harness Lifecycle Signals
@@ -87,6 +91,20 @@ Make the standalone CLI easier to type and make the local health report easier t
87
91
  - Keep `dashboard` local and static by default: no server, watcher, hidden cache, or automatic harness edits.
88
92
  - Allow an optional open/export flag only after the generated file path behavior is stable across platforms.
89
93
 
94
+ ## Evidence Split / Parallel Evidence
95
+
96
+ Before adding parallel workers, add Evidence Split to Tink's default work loop. Tink should not become a separate multi-agent runtime; it should first make large work divisible into small evidence packets. The research notes live in `docs/swarm-fast-lane.ko.md` and `docs/swarm-fast-lane.md`.
97
+
98
+ - `/tink:cast` and `$tink:cast` check whether work should split into `probe`, `patch`, `verify`, `review`, or `decision` packets before harness selection.
99
+ - During implementation, Tink re-splits work when uncertainty, failed checks, context sprawl, or coupled changes appear.
100
+ - Packets see only 1-3 inputs, not the whole task.
101
+ - If external workers are used later, they do not edit files by default; they return evidence and patch candidates.
102
+ - The main agent owns final patch selection, file edits, and verification.
103
+ - Success is measured by less main-agent context, less rework, earlier failure detection, and equal or better verification pass rate, not by claiming universal raw speed.
104
+ - The initial implementation is the core Evidence Split behavior; actual worker runtime remains deferred.
105
+ - Future worker output should be capped at 300 words and include evidence and confidence.
106
+ - Do not select it for unclear public contracts, secrets, broad repository scans, or same-file concurrent edits.
107
+
90
108
  ## Excluded
91
109
 
92
110
  Release evidence bundling remains excluded. Release history, public release notes, and portfolio framing belong to the user or team. Tink may keep verification artifacts, but it should not decide how public release evidence is packaged.
@@ -0,0 +1,46 @@
1
+ # 스킬 패턴 기반 Tink 하네스 확장
2
+
3
+ ## 문제
4
+
5
+ Matt Pocock 계열 스킬과 일반 워크플로 스킬을 Tink에 적용하고 싶었지만, 스킬을 그대로 모두 하네스로 복사하면 Tink의 기본 경로가 무거워지고 역할이 흐려질 위험이 있었습니다.
6
+
7
+ 이번 작업의 핵심은 "스킬 목록을 많이 넣기"가 아니라, 반복적인 작업 절차 중 Tink의 선택과 검증 행동을 실제로 바꾸는 것만 선별하는 것이었습니다.
8
+
9
+ ## 해결
10
+
11
+ 새 opt-in 하네스 5개를 추가했습니다.
12
+
13
+ - `issue-triage`
14
+ - 이슈, 외부 PR, QA 보고, 넓은 계획을 상태·agent-ready brief·세로 slice로 정리합니다.
15
+ - `bug-diagnosis-loop`
16
+ - 어려운 버그, 회귀, flake, 성능 문제에서 코드 수정 전 red-capable feedback loop를 먼저 확보하게 합니다.
17
+ - `review-two-axis`
18
+ - PR·브랜치·diff 리뷰를 Standards와 Spec 두 축으로 나눠 한쪽 통과가 다른 쪽 실패를 가리지 않게 합니다.
19
+ - `decision-map`
20
+ - 여러 세션이 필요한 느슨한 아이디어를 research/prototype/discuss ticket 지도와 frontier로 관리합니다.
21
+ - `architecture-deepening`
22
+ - deep module, interface, seam, leverage, locality, testability 관점으로 구조 개선 후보와 계획을 정리합니다.
23
+
24
+ 기존 하네스도 보강했습니다.
25
+
26
+ - `requirements-interview`: 코드·문서에서 찾을 수 있는 답은 먼저 탐색하고, 결정 분기에는 추천 답안을 제시합니다.
27
+ - `plan-consensus`: interface 대안 비교와 미해결 결정 ticket 분해를 반영했습니다.
28
+ - `delegation-brief`: handoff 문서처럼 기존 artifact 참조, suggested harnesses/skills, 민감정보 제외 원칙을 추가했습니다.
29
+ - `ship`, `pr-merge`: 충돌이나 범위 의심 시 primary source와 원 의도를 확인하고 tradeoff를 기록하게 했습니다.
30
+ - `harness-curation`: idea → planning → issue intake → implementation → review/ship/merge 라우팅 힌트를 추가했습니다.
31
+
32
+ `/tink:cast`와 Codex core rules도 갱신해 새 하네스들이 실제 선택 후보로 고려되도록 했습니다. README와 한국어 README에는 focused harness 선택 표면을 설명했습니다.
33
+
34
+ ## 검증
35
+
36
+ - `npm test`
37
+ - `git diff --check`
38
+ - `commands/cast.md`, `templates/claude/commands/tink/cast.md`, `.claude/commands/tink/cast.md` 3-copy 동기화 확인
39
+ - `templates/tink/harnesses/index.json` JSON parse 확인
40
+ - 새 하네스 필수 섹션 및 100줄 이하 기준 확인
41
+
42
+ ## 참고
43
+
44
+ - 일반 코드 변경·문서·리뷰는 여전히 기본 절차(base run)가 기본값입니다.
45
+ - 새 하네스들은 "조금 더 무거워져도 되는" opt-in 절차로 추가했지만, 기본 cast 경로에서 무조건 로드하지 않도록 trigger를 좁게 두었습니다.
46
+ - writing/teaching 계열 스킬은 Tink 핵심 역할과 거리가 있어 하네스로 복사하지 않았습니다.