@opengsd/gsd-core 1.7.0-rc.2 → 1.7.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/GEMINI.md +25 -23
  4. package/README.md +3 -3
  5. package/agents/gsd-advisor-researcher.md +1 -1
  6. package/agents/gsd-ai-researcher.md +1 -1
  7. package/agents/gsd-code-fixer.md +1 -1
  8. package/agents/gsd-debug-session-manager.md +1 -1
  9. package/agents/gsd-debugger.md +1 -1
  10. package/agents/gsd-domain-researcher.md +1 -1
  11. package/agents/gsd-eval-auditor.md +1 -1
  12. package/agents/gsd-executor.md +4 -4
  13. package/agents/gsd-intel-updater.md +1 -1
  14. package/agents/gsd-mempalace-curator.md +1 -1
  15. package/agents/gsd-phase-researcher.md +2 -2
  16. package/agents/gsd-plan-checker.md +1 -1
  17. package/agents/gsd-planner.md +2 -2
  18. package/agents/gsd-project-researcher.md +2 -2
  19. package/agents/gsd-research-synthesizer.md +1 -1
  20. package/agents/gsd-ui-researcher.md +2 -2
  21. package/agents/gsd-verifier.md +2 -2
  22. package/bin/install.js +108 -458
  23. package/commands/gsd/mempalace-capture.md +1 -1
  24. package/commands/gsd/mempalace-recall.md +9 -5
  25. package/commands/gsd/next.md +29 -0
  26. package/commands/gsd/ns-workflow.md +5 -2
  27. package/gsd-core/bin/ensure-runtime-build.cjs +246 -0
  28. package/gsd-core/bin/gsd-tools.cjs +25 -1
  29. package/gsd-core/bin/lib/capability-registry.cjs +207 -205
  30. package/gsd-core/bin/lib/check-command-router.cjs +111 -1
  31. package/gsd-core/bin/lib/clusters.cjs +1 -0
  32. package/gsd-core/bin/lib/config.cjs +19 -1
  33. package/gsd-core/bin/lib/core-utils.cjs +41 -0
  34. package/gsd-core/bin/lib/external-job.cjs +287 -0
  35. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +151 -0
  36. package/gsd-core/bin/lib/graphify.cjs +41 -9
  37. package/gsd-core/bin/lib/milestone.cjs +7 -1
  38. package/gsd-core/bin/lib/phase.cjs +14 -2
  39. package/gsd-core/bin/lib/plan-scan.cjs +9 -1
  40. package/gsd-core/bin/lib/profile-output.cjs +1 -1
  41. package/gsd-core/bin/lib/prohibition-enforcement.cjs +21 -19
  42. package/gsd-core/bin/lib/roadmap.cjs +17 -2
  43. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +18 -13
  44. package/gsd-core/bin/lib/runtime-name-policy.cjs +8 -10
  45. package/gsd-core/bin/lib/shell-command-projection.cjs +12 -8
  46. package/gsd-core/bin/lib/smart-entry.cjs +521 -0
  47. package/gsd-core/bin/lib/surface.cjs +18 -9
  48. package/gsd-core/bin/lib/update-context.cjs +0 -5
  49. package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
  50. package/gsd-core/bin/shared/model-catalog.json +0 -5
  51. package/gsd-core/bin/shared/runtime-aliases.manifest.json +0 -5
  52. package/gsd-core/references/gates.md +1 -1
  53. package/gsd-core/references/planning-config.md +1 -1
  54. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  55. package/gsd-core/workflows/add-backlog.md +1 -1
  56. package/gsd-core/workflows/add-phase.md +1 -1
  57. package/gsd-core/workflows/add-tests.md +1 -1
  58. package/gsd-core/workflows/add-todo.md +1 -1
  59. package/gsd-core/workflows/ai-integration-phase.md +1 -1
  60. package/gsd-core/workflows/audit-fix.md +1 -1
  61. package/gsd-core/workflows/audit-milestone.md +1 -1
  62. package/gsd-core/workflows/audit-uat.md +1 -1
  63. package/gsd-core/workflows/autonomous.md +1 -1
  64. package/gsd-core/workflows/check-todos.md +1 -1
  65. package/gsd-core/workflows/cleanup.md +1 -1
  66. package/gsd-core/workflows/code-review-fix.md +1 -1
  67. package/gsd-core/workflows/code-review.md +1 -1
  68. package/gsd-core/workflows/complete-milestone.md +1 -1
  69. package/gsd-core/workflows/debug.md +1 -1
  70. package/gsd-core/workflows/diagnose-issues.md +1 -1
  71. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  72. package/gsd-core/workflows/discuss-phase/modes/auto.md +1 -1
  73. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  74. package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
  75. package/gsd-core/workflows/discuss-phase.md +2 -2
  76. package/gsd-core/workflows/do.md +1 -1
  77. package/gsd-core/workflows/docs-update.md +1 -1
  78. package/gsd-core/workflows/edit-phase.md +1 -1
  79. package/gsd-core/workflows/eval-review.md +1 -1
  80. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
  81. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  82. package/gsd-core/workflows/execute-phase.md +4 -5
  83. package/gsd-core/workflows/execute-plan.md +1 -1
  84. package/gsd-core/workflows/explore.md +1 -1
  85. package/gsd-core/workflows/extract-learnings.md +1 -1
  86. package/gsd-core/workflows/forensics.md +1 -1
  87. package/gsd-core/workflows/graduation.md +1 -1
  88. package/gsd-core/workflows/health.md +1 -1
  89. package/gsd-core/workflows/help/modes/full.md +14 -0
  90. package/gsd-core/workflows/help/modes/topic.md +1 -0
  91. package/gsd-core/workflows/import.md +1 -1
  92. package/gsd-core/workflows/ingest-docs.md +1 -1
  93. package/gsd-core/workflows/insert-phase.md +1 -1
  94. package/gsd-core/workflows/list-seeds.md +1 -1
  95. package/gsd-core/workflows/list-workspaces.md +1 -1
  96. package/gsd-core/workflows/manager.md +1 -1
  97. package/gsd-core/workflows/map-codebase.md +1 -1
  98. package/gsd-core/workflows/milestone-summary.md +1 -1
  99. package/gsd-core/workflows/mvp-phase.md +1 -1
  100. package/gsd-core/workflows/new-milestone.md +1 -1
  101. package/gsd-core/workflows/new-project.md +1 -1
  102. package/gsd-core/workflows/new-workspace.md +1 -1
  103. package/gsd-core/workflows/next.md +1 -1
  104. package/gsd-core/workflows/pause-work.md +1 -1
  105. package/gsd-core/workflows/plan-milestone-gaps.md +1 -1
  106. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  107. package/gsd-core/workflows/plan-phase.md +9 -2
  108. package/gsd-core/workflows/plan-review-convergence.md +1 -1
  109. package/gsd-core/workflows/plant-seed.md +1 -1
  110. package/gsd-core/workflows/pr-branch.md +1 -1
  111. package/gsd-core/workflows/profile-user.md +1 -1
  112. package/gsd-core/workflows/progress.md +1 -1
  113. package/gsd-core/workflows/quick.md +1 -1
  114. package/gsd-core/workflows/reapply-patches.md +1 -1
  115. package/gsd-core/workflows/remove-phase.md +1 -1
  116. package/gsd-core/workflows/remove-workspace.md +1 -1
  117. package/gsd-core/workflows/resume-project.md +1 -1
  118. package/gsd-core/workflows/review.md +43 -7
  119. package/gsd-core/workflows/scan.md +1 -1
  120. package/gsd-core/workflows/secure-phase.md +1 -1
  121. package/gsd-core/workflows/settings-advanced.md +3 -1
  122. package/gsd-core/workflows/settings-integrations.md +1 -1
  123. package/gsd-core/workflows/settings.md +1 -1
  124. package/gsd-core/workflows/ship.md +1 -1
  125. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  126. package/gsd-core/workflows/sketch.md +1 -1
  127. package/gsd-core/workflows/smart-entry.md +120 -0
  128. package/gsd-core/workflows/spec-phase.md +8 -6
  129. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  130. package/gsd-core/workflows/spike.md +1 -1
  131. package/gsd-core/workflows/stats.md +1 -1
  132. package/gsd-core/workflows/thread.md +1 -1
  133. package/gsd-core/workflows/transition.md +1 -1
  134. package/gsd-core/workflows/ui-phase.md +1 -1
  135. package/gsd-core/workflows/ui-review.md +1 -1
  136. package/gsd-core/workflows/ultraplan-phase.md +1 -1
  137. package/gsd-core/workflows/update.md +3 -6
  138. package/gsd-core/workflows/validate-phase.md +1 -1
  139. package/gsd-core/workflows/verify-phase.md +1 -1
  140. package/gsd-core/workflows/verify-work.md +62 -4
  141. package/package.json +3 -5
  142. package/scripts/ci-test-scope.cjs +19 -1
  143. package/scripts/generate-package-identity.cjs +27 -2
  144. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -148
  145. package/scripts/lint-regression-test-names.allowlist.json +1 -273
  146. package/scripts/lint-test-file-count.allowlist.json +7 -91
  147. package/scripts/research-profiles.cjs +6 -6
  148. package/scripts/run-tests.cjs +16 -3
  149. package/scripts/slurm-adapter.cjs +269 -0
  150. package/scripts/sync-manifest-versions.cjs +3 -2
  151. package/skills/gsd-mempalace-capture/SKILL.md +1 -1
  152. package/skills/gsd-mempalace-recall/SKILL.md +9 -5
  153. package/skills/gsd-next/SKILL.md +30 -0
  154. package/skills/gsd-ns-workflow/SKILL.md +4 -1
  155. package/gemini-extension.json +0 -6
@@ -10,7 +10,7 @@ const capabilities = {
10
10
  "ai-integration": {
11
11
  "id": "ai-integration",
12
12
  "role": "feature",
13
- "version": "1.7.0-rc.2",
13
+ "version": "1.7.0-rc.3",
14
14
  "title": "AI design contract",
15
15
  "description": "AI-SPEC design contract workflow for phases that build AI systems; owns the AI integration command, agents, and workflow.ai_integration_phase activation key.",
16
16
  "tier": "full",
@@ -63,7 +63,7 @@ const capabilities = {
63
63
  "antigravity": {
64
64
  "id": "antigravity",
65
65
  "role": "runtime",
66
- "version": "1.7.0-rc.2",
66
+ "version": "1.7.0-rc.3",
67
67
  "title": "Antigravity",
68
68
  "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
69
69
  "tier": "core",
@@ -141,7 +141,7 @@ const capabilities = {
141
141
  "assumption-delta": {
142
142
  "id": "assumption-delta",
143
143
  "role": "feature",
144
- "version": "1.7.0-rc.2",
144
+ "version": "1.7.0-rc.3",
145
145
  "title": "Assumption-delta architecture checkpoint",
146
146
  "description": "Rarely-firing advisory checkpoint that triggers when a phase makes something plural, optional, or chosen that used to be singular, required, or derived. Surfaces one identity-model question (promote the new general representation to primary, or add it alongside?) so a silent primary-key drift does not accumulate into a later user-facing bug. Non-blocking; fires only on a detected signal.",
147
147
  "tier": "full",
@@ -187,7 +187,7 @@ const capabilities = {
187
187
  "audit": {
188
188
  "id": "audit",
189
189
  "role": "feature",
190
- "version": "1.7.0-rc.2",
190
+ "version": "1.7.0-rc.3",
191
191
  "title": "Audit",
192
192
  "description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `gsd-tools audit-uat` (cross-phase UAT outstanding items) and `gsd-tools audit-open` (structured open-artifact scan across debug, tasks, threads, todos, seeds, UAT, verification, context-questions).",
193
193
  "tier": "full",
@@ -224,7 +224,7 @@ const capabilities = {
224
224
  "augment": {
225
225
  "id": "augment",
226
226
  "role": "runtime",
227
- "version": "1.7.0-rc.2",
227
+ "version": "1.7.0-rc.3",
228
228
  "title": "Augment Code",
229
229
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
230
230
  "tier": "core",
@@ -327,7 +327,7 @@ const capabilities = {
327
327
  "claude": {
328
328
  "id": "claude",
329
329
  "role": "runtime",
330
- "version": "1.7.0-rc.2",
330
+ "version": "1.7.0-rc.3",
331
331
  "title": "Claude Code",
332
332
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
333
333
  "tier": "core",
@@ -411,7 +411,7 @@ const capabilities = {
411
411
  "cline": {
412
412
  "id": "cline",
413
413
  "role": "runtime",
414
- "version": "1.7.0-rc.2",
414
+ "version": "1.7.0-rc.3",
415
415
  "title": "Cline",
416
416
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
417
417
  "tier": "core",
@@ -472,7 +472,7 @@ const capabilities = {
472
472
  "code-review": {
473
473
  "id": "code-review",
474
474
  "role": "feature",
475
- "version": "1.7.0-rc.2",
475
+ "version": "1.7.0-rc.3",
476
476
  "title": "Code review",
477
477
  "description": "Source-file code review and review-fix workflow support for completed execution work.",
478
478
  "tier": "full",
@@ -533,7 +533,7 @@ const capabilities = {
533
533
  "codebuddy": {
534
534
  "id": "codebuddy",
535
535
  "role": "runtime",
536
- "version": "1.7.0-rc.2",
536
+ "version": "1.7.0-rc.3",
537
537
  "title": "CodeBuddy",
538
538
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
539
539
  "tier": "core",
@@ -636,7 +636,7 @@ const capabilities = {
636
636
  "codex": {
637
637
  "id": "codex",
638
638
  "role": "runtime",
639
- "version": "1.7.0-rc.2",
639
+ "version": "1.7.0-rc.3",
640
640
  "title": "OpenAI Codex CLI",
641
641
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
642
642
  "tier": "core",
@@ -707,7 +707,7 @@ const capabilities = {
707
707
  "copilot": {
708
708
  "id": "copilot",
709
709
  "role": "runtime",
710
- "version": "1.7.0-rc.2",
710
+ "version": "1.7.0-rc.3",
711
711
  "title": "GitHub Copilot",
712
712
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
713
713
  "tier": "core",
@@ -778,7 +778,7 @@ const capabilities = {
778
778
  "cursor": {
779
779
  "id": "cursor",
780
780
  "role": "runtime",
781
- "version": "1.7.0-rc.2",
781
+ "version": "1.7.0-rc.3",
782
782
  "title": "Cursor",
783
783
  "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
784
784
  "tier": "core",
@@ -881,7 +881,7 @@ const capabilities = {
881
881
  "drift": {
882
882
  "id": "drift",
883
883
  "role": "feature",
884
- "version": "1.7.0-rc.2",
884
+ "version": "1.7.0-rc.3",
885
885
  "title": "Drift detection gates",
886
886
  "description": "Drift detection gates for the planning loop. At execute:wave:post: a blocking schema drift gate (detects schema files changed without a database push) and a non-blocking codebase drift gate (detects structural additions not reflected in STRUCTURE.md). At plan:pre: a non-blocking, warn-only codebase drift gate (gated on workflow.plan_drift_precheck) that flags a stale codebase map before planning, so plans are authored against a fresh STRUCTURE.md instead of discovering drift mid-execution.",
887
887
  "tier": "full",
@@ -956,10 +956,93 @@ const capabilities = {
956
956
  }
957
957
  ]
958
958
  },
959
+ "external-job": {
960
+ "id": "external-job",
961
+ "role": "feature",
962
+ "version": "1.7.0-rc.3",
963
+ "title": "Async external-job scheduler adapter",
964
+ "description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/<job>.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies execute:wave:pre, but execute-phase.md only dispatches execute:wave:post today (wave:pre is declared in the loop host contract but not rendered); wiring wave:pre dispatch is a core-loop change #1164 explicitly puts out of scope, so this capability registers at wave:post and the executor honors the runtime_budget classification guidance before running any tagged task. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).",
965
+ "tier": "full",
966
+ "requires": [],
967
+ "engines": {
968
+ "gsd": ">=1.7.0"
969
+ },
970
+ "runtimeCompat": {
971
+ "supported": [
972
+ "*"
973
+ ],
974
+ "unsupported": []
975
+ },
976
+ "skills": [],
977
+ "agents": [],
978
+ "hooks": [],
979
+ "config": {
980
+ "external_job.enabled": {
981
+ "type": "boolean",
982
+ "default": false,
983
+ "description": "Master toggle for the async external-job producer capability. Default-off: the core loop consumes manifests whether or not this is on, but no manifest is ever written unless an executor opts in here."
984
+ },
985
+ "external_job.backend": {
986
+ "type": "enum",
987
+ "values": [
988
+ "slurm"
989
+ ],
990
+ "default": "slurm",
991
+ "description": "Scheduler backend. SLURM is the first adapter; the field is the pluggability seam for future backends (LSF, PBS, Kubernetes batch). Core never interprets this value."
992
+ },
993
+ "external_job.artifact_dir": {
994
+ "type": "string",
995
+ "default": "Artifacts/jobs",
996
+ "description": "Root for per-job artifact directories (e.g. Artifacts/jobs/<jobid>/). Avoids fixed log paths and hardcoding a cluster/project layout. Surfaced by the adapter (`slurm-adapter.cjs submit` prints the resolved value); override via GSD_EXTERNAL_JOB_ARTIFACT_DIR."
997
+ },
998
+ "external_job.submit_timeout_ms": {
999
+ "type": "number",
1000
+ "default": 30000,
1001
+ "description": "Hard timeout (ms) for the scheduler submit subprocess (e.g. sbatch). Bounded per CLAUDE.md unbounded-subprocess policy. Read by the adapter (env GSD_SLURM_SUBMIT_TIMEOUT_MS overrides)."
1002
+ },
1003
+ "external_job.poll_timeout_ms": {
1004
+ "type": "number",
1005
+ "default": 15000,
1006
+ "description": "Hard timeout (ms) for the scheduler poll subprocess (squeue, with sacct fallback). Read by the adapter (env GSD_SLURM_POLL_TIMEOUT_MS overrides)."
1007
+ }
1008
+ },
1009
+ "steps": [],
1010
+ "contributions": [
1011
+ {
1012
+ "point": "execute:wave:post",
1013
+ "into": "executor",
1014
+ "fragment": {
1015
+ "path": "fragments/execute-wave-post.md",
1016
+ "inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n Why wave:post, not wave:pre (#1164 refinement A): execute-phase.md only\n dispatches execute:wave:post today — wave:pre is declared in the loop host\n contract but not rendered. Wiring wave:pre dispatch is a core-loop change\n #1164 puts out of scope. The executor therefore honors this classification\n guidance BEFORE running any task tagged <runtime_budget>long_compute</runtime_budget>,\n whether in the current or a subsequent wave, and externalizes rather than\n blocking the turn. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
1017
+ },
1018
+ "produces": [
1019
+ ".planning/async-jobs/<job>.json"
1020
+ ],
1021
+ "consumes": [
1022
+ "PLAN.md"
1023
+ ],
1024
+ "when": "external_job.enabled",
1025
+ "onError": "skip"
1026
+ },
1027
+ {
1028
+ "point": "plan:post",
1029
+ "into": "planner",
1030
+ "fragment": {
1031
+ "path": "fragments/plan-post.md",
1032
+ "inline": "<!-- external-job capability — plan:post fragment, injected into the planner (#1164). -->\n\n## Tag runtime budgets on long tasks\n\nFor every `<task>` likely to exceed ~2 minutes of real compute, emit a\n`<runtime_budget>` child element so execute can classify it:\n\n- `<runtime_budget>quick</runtime_budget>` — under ~2 min; runs normally.\n- `<runtime_budget>medium</runtime_budget>` — ~2–30 min; foreground, but with\n progress expectations.\n- `<runtime_budget>unknown</runtime_budget>` — runtime not yet characterized;\n execute must run a first-health check and set a soft-review deadline before\n trusting the child timeout. Define a progress signal and an abort condition.\n- `<runtime_budget>long_compute</runtime_budget>` — legitimately over ~30–60 min\n (HPC solver, model training, large simulations). Execute must **externalize**\n this as an async external job (see the execute:wave:post fragment) rather than\n blocking the agent turn.\n\nFor any `long_compute` task, also declare the async contract the executor will\nneed: the `submit_command`, the `expected_artifacts` the job must produce, and\nthe `verification_command` that proves the output before the plan can close.\nDo not hardcode a cluster account, partition, or project path — the planner\nnever knows the scheduler layout; it declares the contract, the executor's\nadapter fills the backend specifics.\n"
1033
+ },
1034
+ "produces": [],
1035
+ "consumes": [],
1036
+ "when": "external_job.enabled",
1037
+ "onError": "skip"
1038
+ }
1039
+ ],
1040
+ "gates": []
1041
+ },
959
1042
  "gap-analysis": {
960
1043
  "id": "gap-analysis",
961
1044
  "role": "feature",
962
- "version": "1.7.0-rc.2",
1045
+ "version": "1.7.0-rc.3",
963
1046
  "title": "Post-planning gap analysis",
964
1047
  "description": "Proactive, non-blocking post-planning coverage report. After all PLAN.md files are generated, cross-references every REQ-ID and D-ID from REQUIREMENTS.md and CONTEXT.md against plan bodies. Emits a Source | Item | Status table. Does not block phase advancement.",
965
1048
  "tier": "standard",
@@ -997,85 +1080,10 @@ const capabilities = {
997
1080
  }
998
1081
  ]
999
1082
  },
1000
- "gemini": {
1001
- "id": "gemini",
1002
- "role": "runtime",
1003
- "version": "1.7.0-rc.2",
1004
- "title": "Gemini CLI",
1005
- "description": "Google Gemini CLI — commands-only artifact layout (TOML); Gemini hook event dialect; settings-json hook surface; tier-2 support.",
1006
- "tier": "core",
1007
- "requires": [],
1008
- "engines": {
1009
- "gsd": ">=1.6.0"
1010
- },
1011
- "runtime": {
1012
- "configHome": {
1013
- "kind": "dot-home",
1014
- "name": ".gemini",
1015
- "env": [
1016
- "GEMINI_CONFIG_DIR"
1017
- ]
1018
- },
1019
- "localConfigDir": ".gemini",
1020
- "configFormat": "settings-json",
1021
- "artifactLayout": {
1022
- "global": [
1023
- {
1024
- "kind": "commands",
1025
- "destSubpath": "commands/gsd",
1026
- "prefix": "gsd-",
1027
- "nesting": "flat",
1028
- "recursive": false,
1029
- "converter": null
1030
- }
1031
- ],
1032
- "local": [
1033
- {
1034
- "kind": "commands",
1035
- "destSubpath": "commands/gsd",
1036
- "prefix": "gsd-",
1037
- "nesting": "flat",
1038
- "recursive": false,
1039
- "converter": null
1040
- }
1041
- ]
1042
- },
1043
- "commandStyle": "slash-hyphen",
1044
- "hooksSurface": "settings-json",
1045
- "hookEvents": "gemini",
1046
- "sandboxTier": "none",
1047
- "supportTier": 2,
1048
- "installSurface": "settings-json",
1049
- "writesSharedSettings": true,
1050
- "permissionWriter": null,
1051
- "extendedHookEvents": [
1052
- "BeforeAgent",
1053
- "AfterAgent",
1054
- "BeforeModel"
1055
- ],
1056
- "hostIntegration": {
1057
- "embeddingMode": "declarative",
1058
- "commandSurface": "slash-toml",
1059
- "dispatch": {
1060
- "namedDispatch": true,
1061
- "nested": false,
1062
- "maxDepth": 1,
1063
- "background": "undocumented",
1064
- "subagentToolkit": "undocumented",
1065
- "backgroundDispatch": false
1066
- },
1067
- "modelMode": "passive",
1068
- "hookBus": "host",
1069
- "stateIO": "filesystem",
1070
- "transport": "mcp",
1071
- "runtime": "node"
1072
- }
1073
- }
1074
- },
1075
1083
  "graphify": {
1076
1084
  "id": "graphify",
1077
1085
  "role": "feature",
1078
- "version": "1.7.0-rc.2",
1086
+ "version": "1.7.0-rc.3",
1079
1087
  "title": "Knowledge graph",
1080
1088
  "description": "Build, query, and inspect the project knowledge graph in `.planning/graphs/`; exposes graphify CLI subcommands (build, query, status, diff) and the /gsd-graphify skill.",
1081
1089
  "tier": "full",
@@ -1116,7 +1124,7 @@ const capabilities = {
1116
1124
  "hermes": {
1117
1125
  "id": "hermes",
1118
1126
  "role": "runtime",
1119
- "version": "1.7.0-rc.2",
1127
+ "version": "1.7.0-rc.3",
1120
1128
  "title": "Hermes Agent",
1121
1129
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
1122
1130
  "tier": "core",
@@ -1187,7 +1195,7 @@ const capabilities = {
1187
1195
  "intel": {
1188
1196
  "id": "intel",
1189
1197
  "role": "feature",
1190
- "version": "1.7.0-rc.2",
1198
+ "version": "1.7.0-rc.3",
1191
1199
  "title": "Codebase intelligence",
1192
1200
  "description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `gsd-tools intel` subcommands (query, status, update, diff, snapshot, patch-meta, validate, extract-exports, api-surface) and backs `/gsd-map-codebase` and `gsd-intel-updater`.",
1193
1201
  "tier": "full",
@@ -1239,7 +1247,7 @@ const capabilities = {
1239
1247
  "kilo": {
1240
1248
  "id": "kilo",
1241
1249
  "role": "runtime",
1242
- "version": "1.7.0-rc.2",
1250
+ "version": "1.7.0-rc.3",
1243
1251
  "title": "Kilo Code",
1244
1252
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
1245
1253
  "tier": "core",
@@ -1332,7 +1340,7 @@ const capabilities = {
1332
1340
  "kimi": {
1333
1341
  "id": "kimi",
1334
1342
  "role": "runtime",
1335
- "version": "1.7.0-rc.2",
1343
+ "version": "1.7.0-rc.3",
1336
1344
  "title": "Kimi CLI",
1337
1345
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.",
1338
1346
  "tier": "core",
@@ -1406,7 +1414,7 @@ const capabilities = {
1406
1414
  "mempalace": {
1407
1415
  "id": "mempalace",
1408
1416
  "role": "feature",
1409
- "version": "1.7.0-rc.2",
1417
+ "version": "1.7.0-rc.3",
1410
1418
  "title": "MemPalace memory",
1411
1419
  "description": "Cross-session, cross-project memory: deliberate recall before discuss/plan and verbatim capture + temporal-KG sync at phase boundaries, via the MemPalace MCP server and CLI.",
1412
1420
  "tier": "full",
@@ -1442,7 +1450,7 @@ const capabilities = {
1442
1450
  "replace"
1443
1451
  ],
1444
1452
  "default": "augment",
1445
- "description": "How MemPalace relates to GSD native memory. Only 'augment' (additive) is implemented today; 'kg_backend' and 'replace' are forward-declared (routing seam not yet built) and currently behave as 'augment'."
1453
+ "description": "How MemPalace relates to GSD native memory during recall/capture. 'augment' (default): the palace is an additive layer alongside .planning/graphs/ — native memory stays authoritative. 'kg_backend': knowledge-graph queries resolve against the palace's temporal KG as the primary source, with .planning/graphs/ as fallback. 'replace': recall resolves through the palace as the source of truth, native memory as fallback. Every mode stays onError:skip and default-resilient — an unreachable palace degrades to native memory, and GSD keeps writing .planning/graphs/ so no memory is lost. Cross-mode migration of existing .planning/graphs/ into the palace is a separate, not-yet-implemented concern."
1446
1454
  },
1447
1455
  "mempalace.wing": {
1448
1456
  "type": "string",
@@ -1555,7 +1563,7 @@ const capabilities = {
1555
1563
  "into": "orchestrator",
1556
1564
  "fragment": {
1557
1565
  "path": "fragments/recall-discuss.md",
1558
- "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness.** Only `augment` is currently wired: always treat the palace as an *additional* recall layer on top of GSD's native memory — never skip `.planning/graphs/` or STATE. `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
1566
+ "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness** (`mempalace.memory_mode`). `augment` (default): the palace is an *additional* layer — never skip `.planning/graphs/` or STATE. `kg_backend`: query the palace's temporal KG as the *primary* graph source, with `.planning/graphs/` as fallback. `replace`: resolve recall *through the palace as the source of truth*, native memory as fallback. In every mode an unreachable palace falls back to native memory — recall never blocks.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
1559
1567
  },
1560
1568
  "produces": [],
1561
1569
  "consumes": [],
@@ -1567,7 +1575,7 @@ const capabilities = {
1567
1575
  "into": "verifier",
1568
1576
  "fragment": {
1569
1577
  "path": "fragments/capture-problems.md",
1570
- "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: `mempalace mine` / `mempalace hook run`. Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness.** Only `augment` is currently wired: the fact is an *additive* mirror alongside `.planning/graphs/` (never a replacement). `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
1578
+ "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: `mempalace mine` / `mempalace hook run`. Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness** (`mempalace.memory_mode`). Under `augment` the fact is an *additive* mirror alongside `.planning/graphs/`. Under `kg_backend`/`replace` the palace is the *authoritative* store for the fact; GSD still writes `.planning/graphs/` through its normal graphify, so an unreachable palace never loses it.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
1571
1579
  },
1572
1580
  "produces": [],
1573
1581
  "consumes": [],
@@ -1580,7 +1588,7 @@ const capabilities = {
1580
1588
  "nyquist": {
1581
1589
  "id": "nyquist",
1582
1590
  "role": "feature",
1583
- "version": "1.7.0-rc.2",
1591
+ "version": "1.7.0-rc.3",
1584
1592
  "title": "Nyquist validation",
1585
1593
  "description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
1586
1594
  "tier": "full",
@@ -1630,7 +1638,7 @@ const capabilities = {
1630
1638
  "opencode": {
1631
1639
  "id": "opencode",
1632
1640
  "role": "runtime",
1633
- "version": "1.7.0-rc.2",
1641
+ "version": "1.7.0-rc.3",
1634
1642
  "title": "OpenCode",
1635
1643
  "description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
1636
1644
  "tier": "core",
@@ -1719,7 +1727,7 @@ const capabilities = {
1719
1727
  "pattern-mapper": {
1720
1728
  "id": "pattern-mapper",
1721
1729
  "role": "feature",
1722
- "version": "1.7.0-rc.2",
1730
+ "version": "1.7.0-rc.3",
1723
1731
  "title": "Pattern mapping",
1724
1732
  "description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
1725
1733
  "tier": "full",
@@ -1773,7 +1781,7 @@ const capabilities = {
1773
1781
  "profile-pipeline": {
1774
1782
  "id": "profile-pipeline",
1775
1783
  "role": "feature",
1776
- "version": "1.7.0-rc.2",
1784
+ "version": "1.7.0-rc.3",
1777
1785
  "title": "Developer profiling pipeline",
1778
1786
  "description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `gsd-tools` commands: scan-sessions, extract-messages, profile-sample (pipeline phase) and write-profile, profile-questionnaire, generate-dev-preferences, generate-claude-profile, generate-claude-md (output phase). Backs the /gsd-profile-user skill and gsd-user-profiler agent.",
1779
1787
  "tier": "full",
@@ -1850,7 +1858,7 @@ const capabilities = {
1850
1858
  "qwen": {
1851
1859
  "id": "qwen",
1852
1860
  "role": "runtime",
1853
- "version": "1.7.0-rc.2",
1861
+ "version": "1.7.0-rc.3",
1854
1862
  "title": "Qwen Code",
1855
1863
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
1856
1864
  "tier": "core",
@@ -1925,7 +1933,7 @@ const capabilities = {
1925
1933
  "research": {
1926
1934
  "id": "research",
1927
1935
  "role": "feature",
1928
- "version": "1.7.0-rc.2",
1936
+ "version": "1.7.0-rc.3",
1929
1937
  "title": "Phase research",
1930
1938
  "description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
1931
1939
  "tier": "standard",
@@ -1977,7 +1985,7 @@ const capabilities = {
1977
1985
  "schema-gate": {
1978
1986
  "id": "schema-gate",
1979
1987
  "role": "feature",
1980
- "version": "1.7.0-rc.2",
1988
+ "version": "1.7.0-rc.3",
1981
1989
  "title": "Schema push detection gate",
1982
1990
  "description": "Detects ORM schema-relevant files in the phase scope during planning and injects a mandatory [BLOCKING] schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.",
1983
1991
  "tier": "full",
@@ -2023,7 +2031,7 @@ const capabilities = {
2023
2031
  "security": {
2024
2032
  "id": "security",
2025
2033
  "role": "feature",
2026
- "version": "1.7.0-rc.2",
2034
+ "version": "1.7.0-rc.3",
2027
2035
  "title": "Security enforcement",
2028
2036
  "description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
2029
2037
  "tier": "full",
@@ -2122,7 +2130,7 @@ const capabilities = {
2122
2130
  "tdd": {
2123
2131
  "id": "tdd",
2124
2132
  "role": "feature",
2125
- "version": "1.7.0-rc.2",
2133
+ "version": "1.7.0-rc.3",
2126
2134
  "title": "Test-driven development",
2127
2135
  "description": "Injects TDD heuristics into the planner and enforces RED/GREEN gate compliance on type:tdd plans after execution. Owns workflow.tdd_mode; the --tdd CLI flag is the ephemeral override.",
2128
2136
  "tier": "full",
@@ -2175,7 +2183,7 @@ const capabilities = {
2175
2183
  "trae": {
2176
2184
  "id": "trae",
2177
2185
  "role": "runtime",
2178
- "version": "1.7.0-rc.2",
2186
+ "version": "1.7.0-rc.3",
2179
2187
  "title": "Trae IDE",
2180
2188
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
2181
2189
  "tier": "core",
@@ -2261,7 +2269,7 @@ const capabilities = {
2261
2269
  "ui": {
2262
2270
  "id": "ui",
2263
2271
  "role": "feature",
2264
- "version": "1.7.0-rc.2",
2272
+ "version": "1.7.0-rc.3",
2265
2273
  "title": "UI design contracts",
2266
2274
  "description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
2267
2275
  "tier": "full",
@@ -2356,7 +2364,7 @@ const capabilities = {
2356
2364
  "windsurf": {
2357
2365
  "id": "windsurf",
2358
2366
  "role": "runtime",
2359
- "version": "1.7.0-rc.2",
2367
+ "version": "1.7.0-rc.3",
2360
2368
  "title": "Windsurf",
2361
2369
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
2362
2370
  "tier": "core",
@@ -2474,7 +2482,7 @@ const byLoopPoint = {
2474
2482
  "into": "orchestrator",
2475
2483
  "fragment": {
2476
2484
  "path": "fragments/recall-discuss.md",
2477
- "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness.** Only `augment` is currently wired: always treat the palace as an *additional* recall layer on top of GSD's native memory — never skip `.planning/graphs/` or STATE. `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
2485
+ "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness** (`mempalace.memory_mode`). `augment` (default): the palace is an *additional* layer — never skip `.planning/graphs/` or STATE. `kg_backend`: query the palace's temporal KG as the *primary* graph source, with `.planning/graphs/` as fallback. `replace`: resolve recall *through the palace as the source of truth*, native memory as fallback. In every mode an unreachable palace falls back to native memory — recall never blocks.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
2478
2486
  },
2479
2487
  "produces": [],
2480
2488
  "consumes": [],
@@ -2702,7 +2710,21 @@ const byLoopPoint = {
2702
2710
  "onError": "skip"
2703
2711
  }
2704
2712
  ],
2705
- "contributions": [],
2713
+ "contributions": [
2714
+ {
2715
+ "capId": "external-job",
2716
+ "point": "plan:post",
2717
+ "into": "planner",
2718
+ "fragment": {
2719
+ "path": "fragments/plan-post.md",
2720
+ "inline": "<!-- external-job capability — plan:post fragment, injected into the planner (#1164). -->\n\n## Tag runtime budgets on long tasks\n\nFor every `<task>` likely to exceed ~2 minutes of real compute, emit a\n`<runtime_budget>` child element so execute can classify it:\n\n- `<runtime_budget>quick</runtime_budget>` — under ~2 min; runs normally.\n- `<runtime_budget>medium</runtime_budget>` — ~2–30 min; foreground, but with\n progress expectations.\n- `<runtime_budget>unknown</runtime_budget>` — runtime not yet characterized;\n execute must run a first-health check and set a soft-review deadline before\n trusting the child timeout. Define a progress signal and an abort condition.\n- `<runtime_budget>long_compute</runtime_budget>` — legitimately over ~30–60 min\n (HPC solver, model training, large simulations). Execute must **externalize**\n this as an async external job (see the execute:wave:post fragment) rather than\n blocking the agent turn.\n\nFor any `long_compute` task, also declare the async contract the executor will\nneed: the `submit_command`, the `expected_artifacts` the job must produce, and\nthe `verification_command` that proves the output before the plan can close.\nDo not hardcode a cluster account, partition, or project path — the planner\nnever knows the scheduler layout; it declares the contract, the executor's\nadapter fills the backend specifics.\n"
2721
+ },
2722
+ "produces": [],
2723
+ "consumes": [],
2724
+ "when": "external_job.enabled",
2725
+ "onError": "skip"
2726
+ }
2727
+ ],
2706
2728
  "gates": [
2707
2729
  {
2708
2730
  "capId": "gap-analysis",
@@ -2729,13 +2751,30 @@ const byLoopPoint = {
2729
2751
  "execute:wave:post": {
2730
2752
  "steps": [],
2731
2753
  "contributions": [
2754
+ {
2755
+ "capId": "external-job",
2756
+ "point": "execute:wave:post",
2757
+ "into": "executor",
2758
+ "fragment": {
2759
+ "path": "fragments/execute-wave-post.md",
2760
+ "inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n Why wave:post, not wave:pre (#1164 refinement A): execute-phase.md only\n dispatches execute:wave:post today — wave:pre is declared in the loop host\n contract but not rendered. Wiring wave:pre dispatch is a core-loop change\n #1164 puts out of scope. The executor therefore honors this classification\n guidance BEFORE running any task tagged <runtime_budget>long_compute</runtime_budget>,\n whether in the current or a subsequent wave, and externalizes rather than\n blocking the turn. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
2761
+ },
2762
+ "produces": [
2763
+ ".planning/async-jobs/<job>.json"
2764
+ ],
2765
+ "consumes": [
2766
+ "PLAN.md"
2767
+ ],
2768
+ "when": "external_job.enabled",
2769
+ "onError": "skip"
2770
+ },
2732
2771
  {
2733
2772
  "capId": "mempalace",
2734
2773
  "point": "execute:wave:post",
2735
2774
  "into": "verifier",
2736
2775
  "fragment": {
2737
2776
  "path": "fragments/capture-problems.md",
2738
- "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: `mempalace mine` / `mempalace hook run`. Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness.** Only `augment` is currently wired: the fact is an *additive* mirror alongside `.planning/graphs/` (never a replacement). `kg_backend`/`replace` are forward-declared and behave as `augment` today.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
2777
+ "inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: `mempalace mine` / `mempalace hook run`. Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness** (`mempalace.memory_mode`). Under `augment` the fact is an *additive* mirror alongside `.planning/graphs/`. Under `kg_backend`/`replace` the palace is the *authoritative* store for the fact; GSD still writes `.planning/graphs/` through its normal graphify, so an unreachable palace never loses it.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
2739
2778
  },
2740
2779
  "produces": [],
2741
2780
  "consumes": [],
@@ -2928,6 +2967,11 @@ const configKeys = {
2928
2967
  "workflow.drift_action": "drift",
2929
2968
  "workflow.schema_drift_gate": "drift",
2930
2969
  "workflow.plan_drift_precheck": "drift",
2970
+ "external_job.enabled": "external-job",
2971
+ "external_job.backend": "external-job",
2972
+ "external_job.artifact_dir": "external-job",
2973
+ "external_job.submit_timeout_ms": "external-job",
2974
+ "external_job.poll_timeout_ms": "external-job",
2931
2975
  "workflow.post_planning_gaps": "gap-analysis",
2932
2976
  "graphify.enabled": "graphify",
2933
2977
  "intel.enabled": "intel",
@@ -3013,6 +3057,39 @@ const configSchema = {
3013
3057
  "default": true,
3014
3058
  "description": "Enable the non-blocking codebase drift pre-check at plan:pre, before /gsd:plan-phase spawns the planner. When enabled, a stale STRUCTURE.md (structural additions exceeding drift_threshold) is surfaced up front as a warn-only advisory pointing to /gsd:map-codebase; it never blocks planning and never spawns the mapper agent. Separate from schema_drift_gate so autonomous/CI runs can silence the plan-time advisory while keeping the execute:wave:post gates enabled."
3015
3059
  },
3060
+ "external_job.enabled": {
3061
+ "owner": "external-job",
3062
+ "type": "boolean",
3063
+ "default": false,
3064
+ "description": "Master toggle for the async external-job producer capability. Default-off: the core loop consumes manifests whether or not this is on, but no manifest is ever written unless an executor opts in here."
3065
+ },
3066
+ "external_job.backend": {
3067
+ "owner": "external-job",
3068
+ "type": "enum",
3069
+ "default": "slurm",
3070
+ "description": "Scheduler backend. SLURM is the first adapter; the field is the pluggability seam for future backends (LSF, PBS, Kubernetes batch). Core never interprets this value.",
3071
+ "values": [
3072
+ "slurm"
3073
+ ]
3074
+ },
3075
+ "external_job.artifact_dir": {
3076
+ "owner": "external-job",
3077
+ "type": "string",
3078
+ "default": "Artifacts/jobs",
3079
+ "description": "Root for per-job artifact directories (e.g. Artifacts/jobs/<jobid>/). Avoids fixed log paths and hardcoding a cluster/project layout. Surfaced by the adapter (`slurm-adapter.cjs submit` prints the resolved value); override via GSD_EXTERNAL_JOB_ARTIFACT_DIR."
3080
+ },
3081
+ "external_job.submit_timeout_ms": {
3082
+ "owner": "external-job",
3083
+ "type": "number",
3084
+ "default": 30000,
3085
+ "description": "Hard timeout (ms) for the scheduler submit subprocess (e.g. sbatch). Bounded per CLAUDE.md unbounded-subprocess policy. Read by the adapter (env GSD_SLURM_SUBMIT_TIMEOUT_MS overrides)."
3086
+ },
3087
+ "external_job.poll_timeout_ms": {
3088
+ "owner": "external-job",
3089
+ "type": "number",
3090
+ "default": 15000,
3091
+ "description": "Hard timeout (ms) for the scheduler poll subprocess (squeue, with sacct fallback). Read by the adapter (env GSD_SLURM_POLL_TIMEOUT_MS overrides)."
3092
+ },
3016
3093
  "workflow.post_planning_gaps": {
3017
3094
  "owner": "gap-analysis",
3018
3095
  "type": "boolean",
@@ -3041,7 +3118,7 @@ const configSchema = {
3041
3118
  "owner": "mempalace",
3042
3119
  "type": "enum",
3043
3120
  "default": "augment",
3044
- "description": "How MemPalace relates to GSD native memory. Only 'augment' (additive) is implemented today; 'kg_backend' and 'replace' are forward-declared (routing seam not yet built) and currently behave as 'augment'.",
3121
+ "description": "How MemPalace relates to GSD native memory during recall/capture. 'augment' (default): the palace is an additive layer alongside .planning/graphs/ — native memory stays authoritative. 'kg_backend': knowledge-graph queries resolve against the palace's temporal KG as the primary source, with .planning/graphs/ as fallback. 'replace': recall resolves through the palace as the source of truth, native memory as fallback. Every mode stays onError:skip and default-resilient — an unreachable palace degrades to native memory, and GSD keeps writing .planning/graphs/ so no memory is lost. Cross-mode migration of existing .planning/graphs/ into the palace is a separate, not-yet-implemented concern.",
3045
3122
  "values": [
3046
3123
  "augment",
3047
3124
  "kg_backend",
@@ -3181,7 +3258,7 @@ const runtimes = {
3181
3258
  "antigravity": {
3182
3259
  "id": "antigravity",
3183
3260
  "role": "runtime",
3184
- "version": "1.7.0-rc.2",
3261
+ "version": "1.7.0-rc.3",
3185
3262
  "title": "Antigravity",
3186
3263
  "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
3187
3264
  "tier": "core",
@@ -3259,7 +3336,7 @@ const runtimes = {
3259
3336
  "augment": {
3260
3337
  "id": "augment",
3261
3338
  "role": "runtime",
3262
- "version": "1.7.0-rc.2",
3339
+ "version": "1.7.0-rc.3",
3263
3340
  "title": "Augment Code",
3264
3341
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
3265
3342
  "tier": "core",
@@ -3362,7 +3439,7 @@ const runtimes = {
3362
3439
  "claude": {
3363
3440
  "id": "claude",
3364
3441
  "role": "runtime",
3365
- "version": "1.7.0-rc.2",
3442
+ "version": "1.7.0-rc.3",
3366
3443
  "title": "Claude Code",
3367
3444
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
3368
3445
  "tier": "core",
@@ -3446,7 +3523,7 @@ const runtimes = {
3446
3523
  "cline": {
3447
3524
  "id": "cline",
3448
3525
  "role": "runtime",
3449
- "version": "1.7.0-rc.2",
3526
+ "version": "1.7.0-rc.3",
3450
3527
  "title": "Cline",
3451
3528
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
3452
3529
  "tier": "core",
@@ -3507,7 +3584,7 @@ const runtimes = {
3507
3584
  "codebuddy": {
3508
3585
  "id": "codebuddy",
3509
3586
  "role": "runtime",
3510
- "version": "1.7.0-rc.2",
3587
+ "version": "1.7.0-rc.3",
3511
3588
  "title": "CodeBuddy",
3512
3589
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
3513
3590
  "tier": "core",
@@ -3610,7 +3687,7 @@ const runtimes = {
3610
3687
  "codex": {
3611
3688
  "id": "codex",
3612
3689
  "role": "runtime",
3613
- "version": "1.7.0-rc.2",
3690
+ "version": "1.7.0-rc.3",
3614
3691
  "title": "OpenAI Codex CLI",
3615
3692
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
3616
3693
  "tier": "core",
@@ -3681,7 +3758,7 @@ const runtimes = {
3681
3758
  "copilot": {
3682
3759
  "id": "copilot",
3683
3760
  "role": "runtime",
3684
- "version": "1.7.0-rc.2",
3761
+ "version": "1.7.0-rc.3",
3685
3762
  "title": "GitHub Copilot",
3686
3763
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
3687
3764
  "tier": "core",
@@ -3752,7 +3829,7 @@ const runtimes = {
3752
3829
  "cursor": {
3753
3830
  "id": "cursor",
3754
3831
  "role": "runtime",
3755
- "version": "1.7.0-rc.2",
3832
+ "version": "1.7.0-rc.3",
3756
3833
  "title": "Cursor",
3757
3834
  "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
3758
3835
  "tier": "core",
@@ -3852,85 +3929,10 @@ const runtimes = {
3852
3929
  }
3853
3930
  }
3854
3931
  },
3855
- "gemini": {
3856
- "id": "gemini",
3857
- "role": "runtime",
3858
- "version": "1.7.0-rc.2",
3859
- "title": "Gemini CLI",
3860
- "description": "Google Gemini CLI — commands-only artifact layout (TOML); Gemini hook event dialect; settings-json hook surface; tier-2 support.",
3861
- "tier": "core",
3862
- "requires": [],
3863
- "engines": {
3864
- "gsd": ">=1.6.0"
3865
- },
3866
- "runtime": {
3867
- "configHome": {
3868
- "kind": "dot-home",
3869
- "name": ".gemini",
3870
- "env": [
3871
- "GEMINI_CONFIG_DIR"
3872
- ]
3873
- },
3874
- "localConfigDir": ".gemini",
3875
- "configFormat": "settings-json",
3876
- "artifactLayout": {
3877
- "global": [
3878
- {
3879
- "kind": "commands",
3880
- "destSubpath": "commands/gsd",
3881
- "prefix": "gsd-",
3882
- "nesting": "flat",
3883
- "recursive": false,
3884
- "converter": null
3885
- }
3886
- ],
3887
- "local": [
3888
- {
3889
- "kind": "commands",
3890
- "destSubpath": "commands/gsd",
3891
- "prefix": "gsd-",
3892
- "nesting": "flat",
3893
- "recursive": false,
3894
- "converter": null
3895
- }
3896
- ]
3897
- },
3898
- "commandStyle": "slash-hyphen",
3899
- "hooksSurface": "settings-json",
3900
- "hookEvents": "gemini",
3901
- "sandboxTier": "none",
3902
- "supportTier": 2,
3903
- "installSurface": "settings-json",
3904
- "writesSharedSettings": true,
3905
- "permissionWriter": null,
3906
- "extendedHookEvents": [
3907
- "BeforeAgent",
3908
- "AfterAgent",
3909
- "BeforeModel"
3910
- ],
3911
- "hostIntegration": {
3912
- "embeddingMode": "declarative",
3913
- "commandSurface": "slash-toml",
3914
- "dispatch": {
3915
- "namedDispatch": true,
3916
- "nested": false,
3917
- "maxDepth": 1,
3918
- "background": "undocumented",
3919
- "subagentToolkit": "undocumented",
3920
- "backgroundDispatch": false
3921
- },
3922
- "modelMode": "passive",
3923
- "hookBus": "host",
3924
- "stateIO": "filesystem",
3925
- "transport": "mcp",
3926
- "runtime": "node"
3927
- }
3928
- }
3929
- },
3930
3932
  "hermes": {
3931
3933
  "id": "hermes",
3932
3934
  "role": "runtime",
3933
- "version": "1.7.0-rc.2",
3935
+ "version": "1.7.0-rc.3",
3934
3936
  "title": "Hermes Agent",
3935
3937
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
3936
3938
  "tier": "core",
@@ -4001,7 +4003,7 @@ const runtimes = {
4001
4003
  "kilo": {
4002
4004
  "id": "kilo",
4003
4005
  "role": "runtime",
4004
- "version": "1.7.0-rc.2",
4006
+ "version": "1.7.0-rc.3",
4005
4007
  "title": "Kilo Code",
4006
4008
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
4007
4009
  "tier": "core",
@@ -4094,7 +4096,7 @@ const runtimes = {
4094
4096
  "kimi": {
4095
4097
  "id": "kimi",
4096
4098
  "role": "runtime",
4097
- "version": "1.7.0-rc.2",
4099
+ "version": "1.7.0-rc.3",
4098
4100
  "title": "Kimi CLI",
4099
4101
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.",
4100
4102
  "tier": "core",
@@ -4168,7 +4170,7 @@ const runtimes = {
4168
4170
  "opencode": {
4169
4171
  "id": "opencode",
4170
4172
  "role": "runtime",
4171
- "version": "1.7.0-rc.2",
4173
+ "version": "1.7.0-rc.3",
4172
4174
  "title": "OpenCode",
4173
4175
  "description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
4174
4176
  "tier": "core",
@@ -4257,7 +4259,7 @@ const runtimes = {
4257
4259
  "qwen": {
4258
4260
  "id": "qwen",
4259
4261
  "role": "runtime",
4260
- "version": "1.7.0-rc.2",
4262
+ "version": "1.7.0-rc.3",
4261
4263
  "title": "Qwen Code",
4262
4264
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
4263
4265
  "tier": "core",
@@ -4332,7 +4334,7 @@ const runtimes = {
4332
4334
  "trae": {
4333
4335
  "id": "trae",
4334
4336
  "role": "runtime",
4335
- "version": "1.7.0-rc.2",
4337
+ "version": "1.7.0-rc.3",
4336
4338
  "title": "Trae IDE",
4337
4339
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
4338
4340
  "tier": "core",
@@ -4418,7 +4420,7 @@ const runtimes = {
4418
4420
  "windsurf": {
4419
4421
  "id": "windsurf",
4420
4422
  "role": "runtime",
4421
- "version": "1.7.0-rc.2",
4423
+ "version": "1.7.0-rc.3",
4422
4424
  "title": "Windsurf",
4423
4425
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
4424
4426
  "tier": "core",
@@ -4653,8 +4655,8 @@ const _requiresGraph = {
4653
4655
  "copilot": [],
4654
4656
  "cursor": [],
4655
4657
  "drift": [],
4658
+ "external-job": [],
4656
4659
  "gap-analysis": [],
4657
- "gemini": [],
4658
4660
  "graphify": [],
4659
4661
  "hermes": [],
4660
4662
  "intel": [],