jhste-skills 0.3.3 → 0.3.5

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.5 - 2026-06-28
4
+
5
+ ### Added
6
+ - Added `jhste-long-running-work-loop`, a narrow orchestration skill for multi-session and long-running work that preserves goals, phases, approval boundaries, resume points, and durable-state routing without replacing code-quality, PRD, issue, triage, or handoff workflows.
7
+
8
+ ### Changed
9
+ - Updated smoke-test expected skill counts now that the bundled/core skill set includes the new long-running work loop skill.
10
+
11
+ ### Validation
12
+ - `npm test` passed.
13
+ - `jhste-skills guard --scope changed --format text --fail-on error` passed with 0 warnings/errors.
14
+
15
+ ## 0.3.4 - 2026-06-26
16
+
17
+ ### Changed
18
+ - Shifted groundwork and red-team review guidance away from fixed checklist axes and toward context-based failure-mode review of the changed execution path.
19
+ - Tightened DB/API and code-quality skill guidance around caller-appropriate response shapes, storage-backed invariants, authorization/data-isolation paths, and understandable failure behavior without turning those examples into a mandatory checklist.
20
+ - Clarified red-team review versus red-team questioning/interrogation triggers while preserving the red-team wording and intent.
21
+ - Clarified architecture, PRD, issue-slicing, and triage skill trigger boundaries to reduce accidental over-triggering.
22
+
23
+ ### Added
24
+ - Added `sync`/`update --skills-only` to refresh installed skill files without touching repository profiles, bridge blocks, hooks, or deep-scan outputs.
25
+
3
26
  ## 0.3.3 - 2026-06-26
4
27
 
5
28
  ### Removed
package/README.ja.md CHANGED
@@ -36,6 +36,7 @@ AI コーディングエージェントは高速ですが、失敗パターン
36
36
  ```text
37
37
  non-trivial code change の前:
38
38
  goal、premise、ownership boundary、data contract、failure path、SOLID-informed review lens を確認
39
+ 固定 checklist を埋めるのではなく、changed execution path で本当に重要な failure mode を文脈に合わせて確認
39
40
 
40
41
  編集中:
41
42
  repo-local instructions を権威として扱う
@@ -107,6 +108,12 @@ changed-file guard を手動で実行するには:
107
108
  jhste-skills guard --scope changed --format text --fail-on error
108
109
  ```
109
110
 
111
+ このリポジトリを最新化した後、プロジェクトの bridge、profile、hook、scan output には触れず、インストール済み skill ファイルだけを更新するには:
112
+
113
+ ```bash
114
+ jhste-skills update --yes --skills-only
115
+ ```
116
+
110
117
  任意で repo-wide advisory scan を実行するには:
111
118
 
112
119
  ```bash
package/README.ko.md CHANGED
@@ -37,6 +37,7 @@ AI 코딩 에이전트는 빠르지만, 반복적으로 비슷한 방식으로
37
37
  ```text
38
38
  non-trivial code change 전:
39
39
  목표, 전제, ownership boundary, data contract, failure path, final behavior predicate, SOLID-informed review lens 확인
40
+ 고정 체크리스트를 채우기보다 변경된 실행 경로에서 실제로 중요한 실패 모드를 맥락에 맞게 확인
40
41
 
41
42
  수정 중:
42
43
  repo-local instructions를 권위로 취급
@@ -108,6 +109,12 @@ npx jhste-skills install --skill-set core
108
109
  jhste-skills guard --scope changed --format text --fail-on error
109
110
  ```
110
111
 
112
+ 이 저장소를 최신으로 당긴 뒤 프로젝트 bridge, profile, hook, scan output은 건드리지 않고 설치된 skill 파일만 새로고침하려면:
113
+
114
+ ```bash
115
+ jhste-skills update --yes --skills-only
116
+ ```
117
+
111
118
  선택적으로 repo-wide advisory scan을 실행하려면:
112
119
 
113
120
  ```bash
package/README.md CHANGED
@@ -37,6 +37,7 @@ AI coding agents are fast, but they fail in predictable ways:
37
37
  ```text
38
38
  Before a non-trivial code change:
39
39
  check the goal, premise, ownership boundary, data contract, failure path, final behavior predicates, and SOLID-informed review lens
40
+ identify the failure modes that matter for the changed execution path instead of filling out a fixed checklist
40
41
 
41
42
  While editing:
42
43
  treat repo-local instructions as the authority
@@ -108,6 +109,12 @@ To run the changed-file guard manually:
108
109
  jhste-skills guard --scope changed --format text --fail-on error
109
110
  ```
110
111
 
112
+ To refresh only the installed skill files after pulling this repository, without touching a project bridge, profile, hook, or scan output:
113
+
114
+ ```bash
115
+ jhste-skills update --yes --skills-only
116
+ ```
117
+
111
118
  To run an optional repo-wide advisory scan:
112
119
 
113
120
  ```bash
package/README.zh.md CHANGED
@@ -36,6 +36,7 @@ AI 编程代理很快,但经常以可预测的方式失败:
36
36
  ```text
37
37
  在 non-trivial code change 前:
38
38
  检查目标、前提、ownership boundary、data contract、failure path、SOLID-informed review lens
39
+ 不填写固定 checklist,而是根据 changed execution path 找出真正重要的 failure mode
39
40
 
40
41
  修改过程中:
41
42
  将 repo-local instructions 视为权威
@@ -107,6 +108,12 @@ npx jhste-skills install --skill-set core
107
108
  jhste-skills guard --scope changed --format text --fail-on error
108
109
  ```
109
110
 
111
+ 拉取本仓库最新内容后,如果只想刷新已安装的 skill 文件,不触碰项目 bridge、profile、hook 或 scan output:
112
+
113
+ ```bash
114
+ jhste-skills update --yes --skills-only
115
+ ```
116
+
110
117
  选择性运行 repo-wide advisory scan:
111
118
 
112
119
  ```bash
package/cli/sync-core.mjs CHANGED
@@ -22,11 +22,13 @@ function usage(command = 'sync') {
22
22
  console.log(`jhste-skills ${command}
23
23
  Usage:
24
24
  jhste-skills ${command} [--repo <path>] [--skills-dir <path>] [--yes] [--force]
25
+ jhste-skills ${command} [--skills-only] [--skills-dir <path>] [--yes]
25
26
  jhste-skills ${command} [--skill-set core|vendor|all] [--skip-hooks] [--no-bridge] [--allow-profile-overwrite]
26
27
  Notes:
27
28
  ${command} reconciles installed skills and already-managed repo outputs using the current local jhste-skills source.
28
29
  It does not self-update the jhste-skills source or run git pull automatically.
29
30
  Installed skill directories are refreshed by default when they differ from the current source.
31
+ --skills-only refreshes installed skills without touching repo profile, bridge files, hooks, or deep-scan outputs.
30
32
  --force refreshes generated/managed profiles; modified profiles need --force --allow-profile-overwrite.
31
33
  Unmanaged skill directories require --allow-unmanaged-skill-overwrite.
32
34
  `);
@@ -52,7 +54,7 @@ function normalizeSyncOptions(argv, cwd) {
52
54
  const args = parseArgs(argv);
53
55
  if (args.help || args.h) return { help: true, errors: [] };
54
56
  const errors = [];
55
- const supported = new Set(['repo', 'skills-dir', 'yes', 'y', 'force', 'skill-set', 'skip-hooks', 'no-bridge', 'allow-unmanaged-skill-overwrite', 'allow-profile-overwrite', 'help', 'h', '_']);
57
+ const supported = new Set(['repo', 'skills-dir', 'yes', 'y', 'force', 'skill-set', 'skills-only', 'skip-hooks', 'no-bridge', 'allow-unmanaged-skill-overwrite', 'allow-profile-overwrite', 'help', 'h', '_']);
56
58
  for (const key of Object.keys(args)) {
57
59
  if (!supported.has(key)) errors.push(`unknown option --${key}.`);
58
60
  }
@@ -60,6 +62,7 @@ function normalizeSyncOptions(argv, cwd) {
60
62
 
61
63
  const force = readBooleanOption(args, 'force', errors);
62
64
  const yes = readBooleanOption(args, 'yes', errors) || readBooleanOption(args, 'y', errors);
65
+ const skillsOnly = readBooleanOption(args, 'skills-only', errors);
63
66
  const skipHooks = readBooleanOption(args, 'skip-hooks', errors);
64
67
  const noBridge = readBooleanOption(args, 'no-bridge', errors);
65
68
  const allowUnmanagedSkillOverwrite = readBooleanOption(args, 'allow-unmanaged-skill-overwrite', errors);
@@ -95,6 +98,7 @@ function normalizeSyncOptions(argv, cwd) {
95
98
  repoInfo: findGitRootInfo(repoStart),
96
99
  repoStart,
97
100
  skipHooks,
101
+ skillsOnly,
98
102
  skillSet,
99
103
  skillsDir,
100
104
  yes,
@@ -177,8 +181,8 @@ function buildSyncPlan(options, command) {
177
181
  ? skillNamesForSet(options.skillSet)
178
182
  : (installedSkills.length > 0 ? installedSkills : skillNamesForSet('all'));
179
183
  const repoRoot = options.repoInfo.isGitRepo ? options.repoInfo.repoRoot : null;
180
- const managedRepo = repoLooksManaged(repoRoot);
181
- const hooks = detectSyncHooks(repoRoot, options.skipHooks);
184
+ const managedRepo = !options.skillsOnly && repoLooksManaged(repoRoot);
185
+ const hooks = options.skillsOnly ? [] : detectSyncHooks(repoRoot, options.skipHooks);
182
186
 
183
187
  const plan = {
184
188
  command,
@@ -190,7 +194,7 @@ function buildSyncPlan(options, command) {
190
194
  allowProfileOverwrite: options.allowProfileOverwrite,
191
195
  forceSkills: true,
192
196
  installMissing: false,
193
- overrides: [],
197
+ overrides: options.skillsOnly ? ['--skills-only'] : [],
194
198
  skillSet: options.skillSet || (installedSkills.length > 0 ? 'detected' : 'all'),
195
199
  skillNames,
196
200
  installSkills: true,
@@ -200,7 +204,7 @@ function buildSyncPlan(options, command) {
200
204
  repoInfo: options.repoInfo,
201
205
  repoRoot,
202
206
  connectRepo: managedRepo,
203
- repoSkippedReason: managedRepo ? null : 'not managed by jhste-skills yet',
207
+ repoSkippedReason: options.skillsOnly ? 'skills-only requested; not touching repo outputs' : (managedRepo ? null : 'not managed by jhste-skills yet'),
204
208
  writeProfile: managedRepo,
205
209
  writeBridge: managedRepo && !options.noBridge,
206
210
  hooks,
package/docs/CLI.md CHANGED
@@ -88,6 +88,7 @@ Safety contract:
88
88
  ```bash
89
89
  jhste-skills sync --yes --repo /path/to/repo
90
90
  jhste-skills sync --yes --repo /path/to/repo --skills-dir /path/to/skills
91
+ jhste-skills sync --yes --skills-only
91
92
  jhste-skills sync --yes --skill-set all
92
93
  jhste-skills sync --yes --force --allow-profile-overwrite
93
94
  ```
@@ -98,6 +99,7 @@ Stable contract:
98
99
  - only refreshes repo outputs that already look managed by jhste-skills (generated/legacy-generated `.jhste/profile.yaml`, managed bridge markers, or managed hooks);
99
100
  - does not bootstrap unmanaged repositories; use `install` or `connect` for first-time setup;
100
101
  - preserves non-managed hooks and does not touch source files, CI, `package.json`, or lockfiles;
102
+ - `--skills-only` refreshes installed skills only and never writes repo profile, bridge blocks, hooks, or deep-scan outputs, even when `--repo` points at a managed repo;
101
103
  - `--force` refreshes generated/managed profiles but does not overwrite modified profiles unless `--allow-profile-overwrite` is also passed; unmanaged differing skill directories require `--allow-unmanaged-skill-overwrite`;
102
104
  - `sync`/`update` may adopt additional known jhste skills into an already managed skills directory and refresh them without the extra overwrite flag.
103
105
 
@@ -107,9 +109,11 @@ Stable contract:
107
109
 
108
110
  ```bash
109
111
  jhste-skills update --yes --repo /path/to/repo
112
+ jhste-skills update --yes --skills-only
110
113
  ```
111
114
 
112
115
  It is meant for the common workflow of pulling the latest `jhste-skills` source first, then reconciling local installed copies and managed repo outputs. It does not self-update the package or run `git pull` for you.
116
+ Use `--skills-only` when you want the latest skill files in the local skills directory but do not want to touch the current repository's managed profile, bridge block, hooks, or deep-scan outputs.
113
117
 
114
118
  ## `deep-scan`
115
119
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jhste-skills",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Installable engineering guardrails and workflow skills for AI coding agents.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -74,7 +74,7 @@ export const recipeRequirements = {
74
74
  'skills/grilling/SKILL.md': ['read-only by default'],
75
75
  'skills/grill-me/SKILL.md': ['read-only by default'],
76
76
  'skills/improve-codebase-architecture/SKILL.md': ['Default to a concise Markdown architecture review', 'HTML/Tailwind/Mermaid report only when requested'],
77
- 'skills/jhste-engineering-groundwork/SKILL.md': ['Senior-quality pre-edit gate', 'partial-failure or rollback path', 'Adjacent-code scope creep', 'Changed responsibility', 'bounded fix', 'Final behavior predicates'],
77
+ 'skills/jhste-engineering-groundwork/SKILL.md': ['Senior-quality pre-edit gate', 'recovery or rollback expectation', 'Adjacent-code scope creep', 'Changed responsibility', 'bounded fix', 'Final behavior predicates'],
78
78
  'skills/jhste-red-team-review/SKILL.md': ['Severity rubric and path tracing', 'changed execution path', 'changes required', 'actual consumer', 'residual risk'],
79
79
  'skills/jhste-red-team-review/references/red-team-review.md': ['Severity rubric', 'Trace at least one changed execution path', 'one main reason to change', 'Current proof'],
80
80
  };
@@ -13,7 +13,7 @@ export function runConnectScenarios({ root, tmp, skillsDir }) {
13
13
  fs.mkdirSync(nonGitCwd, { recursive: true });
14
14
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--yes', '--skills-dir', nonGitCwdSkills, '--skip-deep-scan'], { cwd: nonGitCwd });
15
15
  if (fs.existsSync(path.join(nonGitCwd, '.jhste'))) fail('install outside git repo created .jhste');
16
- if (skillDirs(nonGitCwdSkills).length !== 20) fail('install outside git repo did not install 20 bundled skills');
16
+ if (skillDirs(nonGitCwdSkills).length !== 21) fail('install outside git repo did not install 21 bundled skills');
17
17
 
18
18
  const explicitNonGitRepo = path.join(tmp, 'explicit-non-git-repo');
19
19
  const explicitNonGitSkills = path.join(tmp, 'explicit-non-git-skills');
@@ -42,6 +42,6 @@ export function runConnectScenarios({ root, tmp, skillsDir }) {
42
42
  if (connectMissing.status !== 3) fail(`connect missing skills should exit 3, got ${connectMissing.status}`);
43
43
  if (fs.existsSync(path.join(connectMissingRepo, '.jhste'))) fail('connect missing skills created .jhste');
44
44
  run(process.execPath, [path.join(root, 'cli/connect.mjs'), '--mode', 'normal', '--yes', '--repo', connectMissingRepo, '--skills-dir', connectMissingSkills, '--skip-deep-scan', '--install-missing'], { cwd: connectMissingRepo });
45
- if (skillDirs(connectMissingSkills).length !== 20) fail('connect --install-missing did not install 20 bundled skills');
45
+ if (skillDirs(connectMissingSkills).length !== 21) fail('connect --install-missing did not install 21 bundled skills');
46
46
  if (!fs.existsSync(path.join(connectMissingRepo, '.jhste', 'profile.yaml'))) fail('connect --install-missing did not create profile');
47
47
  }
@@ -112,7 +112,7 @@ function runDefaultInstall(ctx) {
112
112
  const manifest = readManagedSkillsManifest(skillsDir);
113
113
  if (manifest.managed_by !== 'jhste-skills' || !manifest.skills?.['jhste-red-team-review']?.digest) fail('skills manifest missing managed skill digest');
114
114
  const defaultSkillDirs = skillDirs(skillsDir);
115
- if (defaultSkillDirs.length !== 20) fail(`default install should copy 20 bundled skills, got ${defaultSkillDirs.length}`);
115
+ if (defaultSkillDirs.length !== 21) fail(`default install should copy 21 bundled skills, got ${defaultSkillDirs.length}`);
116
116
  if (!defaultSkillDirs.includes('improve-codebase-architecture')) fail('default install should copy vendored workflow skills');
117
117
  }
118
118
 
@@ -171,7 +171,33 @@ run_jhste_skills guard --scope staged --format text --fail-on warning
171
171
 
172
172
  const managedManifest = readManagedSkillsManifest(skillsDir);
173
173
  if (!managedManifest.skills?.[adoptedSkillName]?.digest) fail('update did not record adopted known skill in manifest');
174
-
174
+ const profilePath = path.join(repo, '.jhste', 'profile.yaml');
175
+ const profileBeforeSkillsOnly = fs.readFileSync(profilePath, 'utf8');
176
+ fs.writeFileSync(skillPath, '# stale local copy for skills-only\n');
177
+ fs.writeFileSync(agentsPath, updatedAgents.replace(
178
+ 'Repo-local instructions in this file remain authoritative.',
179
+ 'Bridge text that skills-only must not replace.',
180
+ ));
181
+ fs.writeFileSync(preCommitPath, `#!/usr/bin/env sh
182
+ # jhste-skills managed hook start
183
+ # mode=blocking hook=pre-commit scope=staged
184
+ echo "skills-only must not replace hook"
185
+ run_jhste_skills guard --scope staged --format text --fail-on warning
186
+ # jhste-skills managed hook end
187
+ `, { mode: 0o755 });
188
+ run(process.execPath, [path.join(root, 'cli/update.mjs'), '--yes', '--repo', repo, '--skills-dir', skillsDir, '--skills-only'], { cwd: repo });
189
+ if (fs.readFileSync(skillPath, 'utf8') !== fs.readFileSync(sourceSkillPath, 'utf8')) {
190
+ fail('update --skills-only did not refresh an installed skill');
191
+ }
192
+ if (!fs.readFileSync(agentsPath, 'utf8').includes('Bridge text that skills-only must not replace.')) {
193
+ fail('update --skills-only rewrote a managed bridge block');
194
+ }
195
+ if (!fs.readFileSync(preCommitPath, 'utf8').includes('skills-only must not replace hook')) {
196
+ fail('update --skills-only rewrote a managed hook');
197
+ }
198
+ if (fs.readFileSync(profilePath, 'utf8') !== profileBeforeSkillsOnly) {
199
+ fail('update --skills-only rewrote a managed profile');
200
+ }
175
201
  let migratedManifest = assertLegacySkillRenameMigration({
176
202
  root, repo, skillsDir, manifest: managedManifest, legacyName: 'diagnose', canonicalName: 'diagnosing-bugs', digest: 'legacy-digest',
177
203
  });
@@ -242,7 +268,7 @@ function runSkillSetScenarios({ root, tmp }) {
242
268
  fs.writeFileSync(path.join(allRepo, 'AGENTS.md'), '# All skill repo\n');
243
269
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--yes', '--repo', allRepo, '--skills-dir', allSkillsDir, '--skip-deep-scan', '--skip-hooks', '--skill-set', 'all'], { cwd: allRepo });
244
270
  const allSkillDirs = skillDirs(allSkillsDir);
245
- if (allSkillDirs.length !== 20) fail(`--skill-set all should copy 20 skills, got ${allSkillDirs.length}`);
271
+ if (allSkillDirs.length !== 21) fail(`--skill-set all should copy 21 skills, got ${allSkillDirs.length}`);
246
272
  if (!allSkillDirs.includes('jhste-red-team-review') || !allSkillDirs.includes('improve-codebase-architecture')) fail('--skill-set all missing core or vendored skill');
247
273
  }
248
274
 
@@ -27,7 +27,7 @@ function runCustomAndMinimalScenarios({ root, tmp }) {
27
27
  fs.writeFileSync(path.join(minimalRepo, 'AGENTS.md'), '# Minimal repo\n');
28
28
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--mode', 'minimal', '--yes', '--repo', minimalRepo, '--skills-dir', minimalSkillsDir, '--skip-deep-scan'], { cwd: minimalRepo });
29
29
  const minimalSkillDirs = skillDirs(minimalSkillsDir);
30
- if (minimalSkillDirs.length !== 7) fail(`--mode minimal should copy 7 core skills, got ${minimalSkillDirs.length}`);
30
+ if (minimalSkillDirs.length !== 8) fail(`--mode minimal should copy 8 core skills, got ${minimalSkillDirs.length}`);
31
31
  if (fs.existsSync(path.join(minimalRepo, '.jhste'))) fail('--mode minimal created .jhste');
32
32
  if (fs.existsSync(path.join(minimalRepo, '.git', 'hooks', 'pre-commit'))) fail('--mode minimal created pre-commit hook');
33
33
  if (fs.readFileSync(path.join(minimalRepo, 'AGENTS.md'), 'utf8') !== '# Minimal repo\n') fail('--mode minimal modified AGENTS.md');
@@ -47,7 +47,7 @@ function runFullModeScenarios({ root, tmp }) {
47
47
  fs.writeFileSync(path.join(fullModeRepo, 'AGENTS.md'), '# Full mode repo\n');
48
48
  run(process.execPath, [path.join(root, 'cli/install.mjs'), '--mode', 'full', '--yes', '--repo', fullModeRepo, '--skills-dir', fullModeSkillsDir, '--skip-deep-scan'], { cwd: fullModeRepo });
49
49
  const fullModeSkillDirs = skillDirs(fullModeSkillsDir);
50
- if (fullModeSkillDirs.length !== 20) fail(`--mode full should copy 20 skills, got ${fullModeSkillDirs.length}`);
50
+ if (fullModeSkillDirs.length !== 21) fail(`--mode full should copy 21 skills, got ${fullModeSkillDirs.length}`);
51
51
  const fullPreCommit = path.join(fullModeRepo, '.git', 'hooks', 'pre-commit');
52
52
  const fullPrePush = path.join(fullModeRepo, '.git', 'hooks', 'pre-push');
53
53
  if (!fs.existsSync(fullPreCommit) || !fs.existsSync(fullPrePush)) fail('--mode full did not install pre-commit and pre-push');
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: codebase-design
3
- description: Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a boundary goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
3
+ description: Shared vocabulary for designing deep modules and module interfaces. Use when designing or improving a module interface, deciding where a boundary goes, making code more testable or AI-navigable, or when another skill needs deep-module vocabulary. For repo-wide refactor candidate discovery, use improve-codebase-architecture.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: grill-me
3
- description: Direct personal grilling mode for stress-testing the user's own plan or reasoning. Use when the user asks to be grilled, challenged, pressure-tested, or questioned aggressively about their plan.
3
+ description: Direct red-team interrogation of the user's own plan or reasoning. Use when the user asks to be grilled, challenged, pressure-tested, red-teamed, or questioned aggressively about their plan. Not for reviewing an already-changed code diff; use jhste-red-team-review for that.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: grill-with-docs
3
- description: Stress-test a plan against project domain language and record resulting decisions in CONTEXT.md or ADRs. Use when the user wants grilling plus documentation, ADR, glossary, or CONTEXT updates.
3
+ description: Red-team questioning of a plan against project domain language, then recording resulting decisions in CONTEXT.md or ADRs. Use when the user wants grilling plus documentation, ADR, glossary, or CONTEXT updates. Not for reviewing an already-changed code diff; use jhste-red-team-review for that.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: grilling
3
- description: General plan/design stress-test interview. Use when the user asks to challenge, pressure-test, red-team, grill, or find gaps in a plan before building, without requesting documentation updates.
3
+ description: Red-team questioning for plans and designs before implementation. Use when the user asks to challenge, pressure-test, red-team, grill, interrogate, or find gaps in a plan, without requesting documentation updates. Not for reviewing an already-changed code diff; use jhste-red-team-review for that.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: improve-codebase-architecture
3
- description: Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable.
3
+ description: Repo-wide or area-wide architecture review to find deepening/refactoring opportunities, informed by CONTEXT.md and docs/adr/. Use when the user wants broad architecture improvement, refactoring opportunities, consolidation of tightly-coupled modules, or better testability and AI-navigability. Not for every local code change; use jhste-architecture-review for the current diff.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jhste-architecture-review
3
- description: Advisory architecture review guidance for module boundaries, SOLID-informed design review, side effects, and pass-through abstraction. Use when changing module boundaries, app structure, side-effect placement, or responsibility splits.
3
+ description: Advisory architecture review for current code changes touching module boundaries, app structure, side-effect placement, responsibility splits, or pass-through abstraction. Use during or after local code changes; for repo-wide architecture improvement use improve-codebase-architecture, and for module interface vocabulary use codebase-design.
4
4
  ---
5
5
 
6
6
  # jhste-architecture-review
@@ -23,7 +23,7 @@ When reviewing a proposed change, ask:
23
23
 
24
24
  - Bad: `route.ts` performs auth, schema parsing, business rules, database queries, error mapping, and response DTO shaping inline.
25
25
  - Better: route/controller does request parsing and response mapping; a usecase owns business invariants; a repository/query owns persistence; errors are mapped through a small public-error boundary.
26
- - Why: caller contracts, authorization, partial-failure handling, and test boundaries are easier to inspect from entrypoint to side effect.
26
+ - Why: caller contracts, authorization, failure behavior, and test boundaries are easier to inspect from entrypoint to side effect.
27
27
 
28
28
  ### React client path split
29
29
 
@@ -82,4 +82,3 @@ Change adjacent code only when it sits on the changed execution path and leaving
82
82
  - Bad: a caller accepts a broad config, interface, or props bag while using only a small slice, creating unrelated coupling.
83
83
  - Better: depend on the smallest useful contract, while keeping cohesive public contracts together when they are read and changed together.
84
84
  - Why: ISP should reduce coupling, not fragment a contract that always moves as one unit.
85
-
@@ -16,6 +16,7 @@ Use repo-local instructions first. Treat this skill as shared advisory guidance
16
16
  - Do not log secrets, tokens, passwords, cookies, authorization headers, sessions, or raw sensitive payloads.
17
17
  - Tests should verify observable behavior through the module interface, not implementation details, function-name existence, or incidental strings.
18
18
  - Do not stop at happy-path-only coverage for changed behavior; include the most relevant edge, failure, side-effect, idempotency, or regression case.
19
+ - For code with side effects or multi-step work, make the failure behavior understandable to callers and users; do not let the code silently imply success when the changed path did not complete safely.
19
20
  - Mock external boundaries, not internal collaborators you control.
20
21
  - Before adding a new helper, type, or shape, check for the existing source of truth.
21
22
  - Use SOLID-informed coding discipline as advisory guidance for concrete maintenance and failure risks: one responsibility, extension boundaries only when variants force repeated edits, stable caller contracts, right-sized interfaces, and visible side-effect dependencies. Do not add abstraction only to satisfy a SOLID label.
@@ -48,8 +48,8 @@ When code crosses async UI, env, or persistence paths, be skeptical of fragile a
48
48
  ### Mutation write safety
49
49
 
50
50
  - Bad: a route loops over writes and returns success after the first non-throwing path.
51
- - Better: define the idempotency key or dedupe rule, use a transaction/batch/upsert where needed, check affected rows, and report partial failure explicitly.
52
- - Why: duplicate execution, retry, and rollback behavior are observable instead of assumed.
51
+ - Better: define the write rule at the layer that can enforce it, check the outcome that matters to callers, and report unsafe or incomplete results instead of implying success.
52
+ - Why: duplicate execution, retry, and recovery behavior are observable instead of assumed.
53
53
 
54
54
  ### Import/ops script
55
55
 
@@ -7,5 +7,5 @@ Routine validation should use fixtures, dry runs, or focused smoke checks. Live
7
7
  ## Producer / consumer recipe
8
8
 
9
9
  - Bad: a crawler fetches pages, normalizes fields, deduplicates, writes the database, and sends notifications in one loop.
10
- - Better: the producer emits a versioned artifact; the consumer validates, deduplicates, persists, and reports partial failures with a resumable cursor.
10
+ - Better: the producer emits a versioned artifact; the consumer validates, deduplicates, persists, and reports write outcomes with a resumable cursor.
11
11
  - Why: flaky network behavior is separated from write safety, fixtures can replay artifacts, and duplicate writes are easier to prevent.
@@ -15,7 +15,9 @@ Use this skill for API and persistence boundary changes. Repo-local API contract
15
15
  - Use parameter binding or a safe query abstraction for SQL.
16
16
  - Keep request and response contracts explicit enough that caller drift is visible before runtime.
17
17
  - Validate database rows or third-party records before treating them as domain objects when shape matters.
18
- - Make write safety visible for repeated execution, batch mutation, or idempotent retry paths.
18
+ - Map storage rows to response shapes that match the caller's permission and purpose; do not let internal or higher-privilege data leak through convenient reuse.
19
+ - Make write safety visible at the layer that actually preserves the rule; do not rely on app-side checks alone when storage behavior can contradict them.
20
+ - For authorization or data-isolation changes, inspect the actual policy and execution path instead of trusting a single route, role, or helper as proof.
19
21
  - Return public-safe errors; do not leak raw database, stack, or secret-like details.
20
22
  - For API or persistence changes, verification should prefer the actual contract surface when feasible: route handler behavior, request/response shape, auth or tenant scoping, SQL binding behavior, migration/application path, or service boundary used by callers.
21
23
 
@@ -43,7 +43,9 @@ For non-trivial code changes, check these before editing:
43
43
  10. **Verification plan** — tests, guards, builds, or manual checks to run, plus any checks likely to be skipped.
44
44
  11. **Final behavior predicates** — concrete public behavior that must change, public/API/DB/UI shape that must not change, expected error behavior, persistence or side-effect expectations, and backward-compatibility constraints.
45
45
 
46
- Keep these items available as internal review evidence, but do not make the user read the full evidence block every time. User-facing output should usually be one or two plain sentences covering:
46
+ For changes touching user data, API/DB, permissions, files, external calls, batch writes, async UI actions, exports, or lifecycle state, do not reduce review to a fixed checklist. Follow the changed execution path and use repo-local rules, domain invariants, caller expectations, persistence behavior, side effects, user-visible states, operational impact, and verification evidence to identify the failure modes that matter for this change. Prefer concrete risk statements over named frameworks or exhaustive lists.
47
+
48
+ Keep the full evidence available internally, but do not make the user read it every time. User-facing output should usually be one or two plain sentences covering:
47
49
 
48
50
  - scope checked;
49
51
  - main risks;
@@ -82,7 +84,7 @@ Avoid: "Should I create an issue?" without supporting reasoning.
82
84
 
83
85
  ## Senior-quality pre-edit gate
84
86
 
85
- For non-trivial code changes, compare at least two plausible shapes before editing: the smallest local patch and one cleaner boundary-preserving alternative. State the invariant that must remain true, the changed class/module/function responsibility, the caller contract entering and leaving the boundary, the test boundary that will prove behavior, the rejected alternative, and the partial-failure or rollback path. Keep this quiet for docs-only, comment-only, formatting-only, and trivial rename-only work.
87
+ For non-trivial code changes, compare at least two plausible shapes before editing: the smallest local patch and one cleaner boundary-preserving alternative. State the invariant that must remain true, the changed class/module/function responsibility, the caller contract entering and leaving the boundary, the test boundary that will prove behavior, the rejected alternative, and the recovery or rollback expectation for failure after a side effect. Keep this quiet for docs-only, comment-only, formatting-only, and trivial rename-only work.
86
88
 
87
89
  Adjacent-code scope creep is allowed only when the adjacent code is on the changed execution path and leaving it untouched creates a concrete failure mode. Otherwise emit an Issue candidate rather than widening the change.
88
90
 
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: jhste-long-running-work-loop
3
+ description: "Coordinate multi-session or long-running work while preserving state, approval boundaries, and resume points. Use when work spans sessions, wait states, recurring reviews, multiple repos, or durable decisions; does not replace code-quality, PRD, issue, triage, or handoff skills."
4
+ ---
5
+
6
+ # jhste-long-running-work-loop
7
+
8
+ Use this skill to decide whether a task needs a durable work loop, then keep the loop small, reviewable, and safe. Repo-local instructions remain authoritative.
9
+
10
+ This is an orchestration skill. Do not reimplement code quality review, PRD writing, issue breakdown, triage, or handoff workflows. Route to the narrower skill when that is the actual task.
11
+
12
+ ## Scope
13
+
14
+ Use for work that is likely to lose important state across time, tools, repositories, or sessions:
15
+
16
+ - multi-session implementation or review work;
17
+ - recurring review/check-in loops;
18
+ - external waiting states such as CI, preview deploys, reviewer replies, approvals, vendor/API responses, or customer input;
19
+ - workflows spanning PRD, issues, implementation, review, and release notes;
20
+ - work that touches multiple repositories or external systems;
21
+ - hard-to-reverse design decisions that need a durable decision record;
22
+ - tasks where the next session or next agent must resume safely.
23
+
24
+ Skip for:
25
+
26
+ - simple Q&A;
27
+ - typo fixes;
28
+ - formatting-only work;
29
+ - small README edits;
30
+ - small single-file fixes that can finish in one session;
31
+ - direct requests that are only PRD drafting, issue breakdown, triage, or handoff;
32
+ - work where the changed code path can be handled by `jhste-engineering-groundwork`, guard, and `jhste-red-team-review` alone.
33
+
34
+ When skipping, use the narrower workflow. If useful, briefly note that a long-running loop is unnecessary.
35
+
36
+ ## Contract
37
+
38
+ 1. **Decide if this is actually long-running.**
39
+ If not, route to the smallest applicable skill or workflow.
40
+
41
+ 2. **Define the work loop before expanding scope.**
42
+ Capture only:
43
+ - current goal;
44
+ - current phase;
45
+ - definition of done;
46
+ - explicit out-of-scope items;
47
+ - open decisions;
48
+ - external blockers or wait states;
49
+ - approval boundaries;
50
+ - next checkpoint;
51
+ - required review gates.
52
+
53
+ 3. **Preserve context only when it will reduce future failure.**
54
+ Do not turn project docs into scratchpads. Do not persist raw thought, private reasoning, secrets, or noisy progress logs.
55
+
56
+ 4. **Choose the right durable surface.**
57
+ - Domain vocabulary or stable domain context -> `CONTEXT.md`.
58
+ - Hard-to-reverse design decision with real trade-offs -> ADR.
59
+ - Active work state, blockers, acceptance, and next action -> issue or PR notes.
60
+ - Next-session or next-agent continuation only -> `handoff`.
61
+ - Ephemeral, obvious, or soon-stale state -> do not persist.
62
+
63
+ 5. **Resume by verifying, not trusting.**
64
+ On resume, re-check the current repo, branch, issue/PR, CI, deployment, or external state before relying on old notes. Mark stale assumptions as not checked.
65
+
66
+ 6. **Respect approval boundaries.**
67
+ Proceed without asking for reading, searching, summarizing, planning, drafting, review notes, and issue candidates when repo-local instructions allow it.
68
+ Ask before send, push, merge, deploy, delete, publish, production data changes, secret exposure, cost-bearing actions, broad tracker edits, or destructive/irreversible changes.
69
+
70
+ 7. **Delegate to existing skills.**
71
+ - Before non-trivial code changes, use `jhste-engineering-groundwork`.
72
+ - After non-trivial code changes, run the configured guard when available and use `jhste-red-team-review`.
73
+ - For PRDs, use `to-prd`.
74
+ - For issue breakdown, use `to-issues`.
75
+ - For tracker triage, use `triage`.
76
+ - For next-agent/session summaries, use `handoff`.
77
+ - For domain glossary or ADR work, use `grill-with-docs` or the repo's domain-documentation workflow.
78
+
79
+ ## Minimal loop note
80
+
81
+ When a durable loop is warranted, keep the note compact:
82
+
83
+ ```md
84
+ ## Long-running work loop
85
+
86
+ Goal:
87
+ - ...
88
+
89
+ Current phase:
90
+ - ...
91
+
92
+ Definition of done:
93
+ - ...
94
+
95
+ Out of scope:
96
+ - ...
97
+
98
+ Open decisions:
99
+ - ...
100
+
101
+ External blockers / wait states:
102
+ - ...
103
+
104
+ Approval required before:
105
+ - ...
106
+
107
+ Durable state location:
108
+ - ...
109
+
110
+ Next checkpoint:
111
+ - ...
112
+
113
+ Review gates:
114
+ - ...
115
+ ```
116
+
117
+ Prefer referencing existing artifacts by path or URL over duplicating their contents.
118
+
119
+ ## Context storage rules
120
+
121
+ Unless repo-local docs define another role, treat `CONTEXT.md` as stable domain context, not a work log. Use it only for glossary or domain context that future agents need to understand the project correctly.
122
+
123
+ Create or update an ADR only when all are true:
124
+
125
+ 1. the decision is hard to reverse;
126
+ 2. future readers would wonder why it was chosen;
127
+ 3. there were real alternatives and trade-offs.
128
+
129
+ Use issue or PR notes for active work state because that state naturally expires when the work closes.
130
+
131
+ Use handoff for continuation context that helps the next session but does not deserve permanent repo documentation.
132
+
133
+ Record nothing when the information is trivial, already obvious from code/tests/diff, likely to go stale quickly, or not useful to future work.
134
+
135
+ ## Output style
136
+
137
+ Be brief. Report:
138
+
139
+ - whether the long-running loop is warranted;
140
+ - the chosen durable surface, if any;
141
+ - the next checkpoint;
142
+ - any action that requires approval;
143
+ - which narrower skill should handle the next concrete step.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: jhste-red-team-review
3
- description: Read-only completion-time red-team review and issue-candidate handoff for non-trivial code changes. Use before declaring code work complete.
3
+ description: Read-only red-team code review for actual diffs or changed files after implementation, with issue-candidate handoff for residual risks. Use before declaring non-trivial code work complete. For pre-implementation red-team questioning or interrogation of a plan, use grilling, grill-me, or grill-with-docs.
4
4
  ---
5
5
 
6
6
  # jhste-red-team-review
7
7
 
8
- Use this skill after non-trivial code changes and before reporting completion. Repo-local instructions remain authoritative.
8
+ Use this skill after non-trivial code changes and before reporting completion. This is red-team code review for changed code, not plan interrogation. Repo-local instructions remain authoritative.
9
9
 
10
10
  ## Automation and side effects
11
11
 
@@ -37,7 +37,7 @@ Perform the changed-code review, inspect guard/test output, and run bounded fix/
37
37
 
38
38
  ## Severity rubric and path tracing
39
39
 
40
- For non-trivial code changes, name the main responsibility of changed classes/modules/functions, apply the SOLID-informed review lens where relevant, trace at least one changed execution path from entrypoint through validation/auth/state to the side effect or result, and state any changed paths not checked. Use `changes required` for new guard or review warnings on changed files that can be fixed within the changed execution path, and for P0/P1 issues that can cause data loss, security/privacy exposure, misleading success, broken runtime behavior, or failed documented acceptance. Use `residual risk` when the bounded review completed but lower-severity, heuristic, environmental, or out-of-scope risks remain. Use `pass` only after inspecting the relevant diff and finding no material follow-up, with current proof for the changed public behavior or a clear explanation of why consumer-path proof was not feasible.
40
+ For non-trivial code changes, name the main responsibility of changed classes/modules/functions, apply the SOLID-informed review lens where relevant, trace at least one changed execution path from entrypoint through validation/auth/state to the side effect or result, and state any changed paths not checked. Do not stop at a fixed checklist; attack the changed path in the way most likely to reveal real failures for this repo, domain, caller, and runtime. Use `changes required` for new guard or review warnings on changed files that can be fixed within the changed execution path, and for P0/P1 issues that can cause data loss, security/privacy exposure, misleading success, broken runtime behavior, or failed documented acceptance. Use `residual risk` when the bounded review completed but lower-severity, heuristic, environmental, or out-of-scope risks remain. Use `pass` only after inspecting the relevant diff and finding no material follow-up, with current proof for the changed public behavior or a clear explanation of why consumer-path proof was not feasible.
41
41
 
42
42
  ## Issue candidate protocol
43
43
 
@@ -13,7 +13,10 @@ Use an objective red-team checklist. Prefer concrete findings over broad praise.
13
13
  - Failure handling is observable and does not silently pretend success.
14
14
  - Type expectations, API contracts, and caller assumptions still line up after the change.
15
15
  - Auth, permission, and user-data isolation risks are called out when relevant.
16
+ - API and persistence contracts are checked through the public shape and caller expectations that matter for the changed path.
16
17
  - Create/update/delete paths do not appear vulnerable to data loss, duplicate writes, or misleading success states.
18
+ - Mutation and side-effect safety are reviewed through the real write path, including what callers and users see if the path is repeated, interrupted, or only partly succeeds.
19
+ - State transitions are reviewed where stale or inconsistent state would mislead users, leak access, or break the domain rule.
17
20
  - Build, import, env, route, and runtime assumptions that could break deployment are called out when relevant.
18
21
  - Actual consumer-path proof is preferred when feasible: public API route, CLI command, UI route, worker/scheduler path, service entrypoint, fresh-client flow, or documented acceptance path.
19
22
  - Performance risks such as duplicate requests, avoidable rerenders, or obviously heavy work on hot paths are called out when relevant.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: to-issues
3
- description: Break a plan, spec, or PRD into issue-ready vertical slices. Use when the user wants implementation tickets or work breakdown; create tracker issues when directly requested or when repo-local workflow gives standing approval for ticket creation.
3
+ description: Break an existing plan, spec, or PRD into issue-ready vertical implementation slices. Use when the user wants implementation tickets, issue breakdown, or work breakdown from known requirements. For drafting product requirements from conversation context, use to-prd; create tracker issues only when directly requested or when repo-local workflow gives standing approval.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: to-prd
3
- description: Draft a PRD from the current conversation context and make it ready for the project's normal PRD workflow. Use when the user wants a PRD; publish/create tracker items when directly requested or when repo-local workflow gives standing approval for PRD tracker writes.
3
+ description: Draft a PRD from the current conversation context and make it ready for the project's normal PRD workflow. Use when the user asks for a PRD or product requirements document. For issue-ready implementation slices from an existing plan or PRD, use to-issues; publish/create tracker items only when directly requested or when repo-local workflow gives standing approval.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: triage
3
- description: Triage issues through a state machine driven by triage roles. Use when user wants to create an issue, triage issues, review incoming bugs or feature requests, prepare issues for an AFK agent, or manage issue workflow.
3
+ description: Triage existing or newly requested issues through a state machine driven by triage roles. Use when the user wants to create a specific issue, triage issues, review incoming bugs or feature requests, prepare issues for an AFK agent, or manage issue workflow. For PRDs use to-prd; for bulk implementation slice generation from a plan use to-issues.
4
4
  ---
5
5
 
6
6
  ## jhste compatibility