@opengsd/gsd-core 1.7.0-rc.1 → 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.
- package/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +711 -0
- package/GEMINI.md +25 -23
- package/README.md +3 -3
- package/agents/gsd-advisor-researcher.md +3 -1
- package/agents/gsd-ai-researcher.md +2 -2
- package/agents/gsd-assumptions-analyzer.md +2 -0
- package/agents/gsd-code-fixer.md +3 -1
- package/agents/gsd-code-reviewer.md +2 -0
- package/agents/gsd-codebase-mapper.md +2 -0
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +3 -1
- package/agents/gsd-doc-writer.md +2 -0
- package/agents/gsd-domain-researcher.md +1 -1
- package/agents/gsd-eval-auditor.md +3 -1
- package/agents/gsd-executor.md +12 -9
- package/agents/gsd-integration-checker.md +2 -0
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +1 -1
- package/agents/gsd-nyquist-auditor.md +2 -0
- package/agents/gsd-phase-researcher.md +4 -2
- package/agents/gsd-plan-checker.md +3 -1
- package/agents/gsd-planner.md +4 -2
- package/agents/gsd-project-researcher.md +4 -2
- package/agents/gsd-research-synthesizer.md +3 -1
- package/agents/gsd-roadmapper.md +2 -0
- package/agents/gsd-security-auditor.md +2 -0
- package/agents/gsd-ui-auditor.md +2 -0
- package/agents/gsd-ui-checker.md +2 -0
- package/agents/gsd-ui-researcher.md +4 -2
- package/agents/gsd-verifier.md +6 -4
- package/bin/install.js +226 -459
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/mempalace-recall.md +9 -5
- package/commands/gsd/next.md +29 -0
- package/commands/gsd/ns-workflow.md +5 -2
- package/gsd-core/bin/ensure-runtime-build.cjs +246 -0
- package/gsd-core/bin/gsd-tools.cjs +43 -8
- package/gsd-core/bin/lib/capability-loader.cjs +27 -9
- package/gsd-core/bin/lib/capability-registry.cjs +209 -205
- package/gsd-core/bin/lib/capability-source.cjs +22 -7
- package/gsd-core/bin/lib/capability-validator.cjs +24 -2
- package/gsd-core/bin/lib/check-command-router.cjs +111 -1
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/commands.cjs +2 -1
- package/gsd-core/bin/lib/config.cjs +19 -1
- package/gsd-core/bin/lib/core-utils.cjs +41 -0
- package/gsd-core/bin/lib/external-job.cjs +287 -0
- package/gsd-core/bin/lib/frontmatter.cjs +53 -6
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +151 -0
- package/gsd-core/bin/lib/graphify.cjs +41 -9
- package/gsd-core/bin/lib/handshake-serialized.cjs +70 -0
- package/gsd-core/bin/lib/host-integration-sdk.cjs +53 -0
- package/gsd-core/bin/lib/host-integration.cjs +61 -0
- package/gsd-core/bin/lib/init.cjs +34 -6
- package/gsd-core/bin/lib/milestone.cjs +56 -11
- package/gsd-core/bin/lib/phase-id.cjs +18 -0
- package/gsd-core/bin/lib/phase.cjs +51 -29
- package/gsd-core/bin/lib/phases-command-router.cjs +4 -3
- package/gsd-core/bin/lib/plan-scan.cjs +9 -1
- package/gsd-core/bin/lib/probe-core.cjs +44 -4
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +21 -19
- package/gsd-core/bin/lib/roadmap-command-router.cjs +3 -2
- package/gsd-core/bin/lib/roadmap-parser.cjs +21 -11
- package/gsd-core/bin/lib/roadmap.cjs +45 -22
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +18 -13
- package/gsd-core/bin/lib/runtime-name-policy.cjs +8 -10
- package/gsd-core/bin/lib/shell-command-projection.cjs +12 -8
- package/gsd-core/bin/lib/smart-entry.cjs +521 -0
- package/gsd-core/bin/lib/state-transition.cjs +15 -0
- package/gsd-core/bin/lib/state.cjs +27 -8
- package/gsd-core/bin/lib/surface.cjs +18 -9
- package/gsd-core/bin/lib/update-context.cjs +0 -5
- package/gsd-core/bin/lib/validate.cjs +2 -1
- package/gsd-core/bin/lib/verify.cjs +6 -4
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +12 -2
- package/gsd-core/bin/lib/workstream-inventory.cjs +28 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -13
- package/gsd-core/bin/shared/runtime-aliases.manifest.json +0 -5
- package/gsd-core/references/agent-skills-bootstrap.md +60 -0
- package/gsd-core/references/gates.md +1 -1
- package/gsd-core/references/model-profiles.md +27 -0
- package/gsd-core/references/planning-config.md +1 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +1 -1
- package/gsd-core/workflows/add-tests.md +1 -1
- package/gsd-core/workflows/add-todo.md +1 -1
- package/gsd-core/workflows/ai-integration-phase.md +1 -1
- package/gsd-core/workflows/audit-fix.md +1 -1
- package/gsd-core/workflows/audit-milestone.md +1 -1
- package/gsd-core/workflows/audit-uat.md +1 -1
- package/gsd-core/workflows/autonomous.md +23 -25
- package/gsd-core/workflows/check-todos.md +1 -1
- package/gsd-core/workflows/cleanup.md +1 -1
- package/gsd-core/workflows/code-review-fix.md +1 -1
- package/gsd-core/workflows/code-review.md +1 -1
- package/gsd-core/workflows/complete-milestone.md +7 -11
- package/gsd-core/workflows/debug.md +1 -1
- package/gsd-core/workflows/diagnose-issues.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/auto.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
- package/gsd-core/workflows/discuss-phase.md +2 -2
- package/gsd-core/workflows/do.md +1 -1
- package/gsd-core/workflows/docs-update.md +1 -1
- package/gsd-core/workflows/edit-phase.md +1 -1
- package/gsd-core/workflows/eval-review.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +1 -1
- package/gsd-core/workflows/execute-phase.md +5 -6
- package/gsd-core/workflows/execute-plan.md +1 -1
- package/gsd-core/workflows/explore.md +1 -1
- package/gsd-core/workflows/extract-learnings.md +1 -1
- package/gsd-core/workflows/forensics.md +4 -4
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +1 -1
- package/gsd-core/workflows/help/modes/full.md +15 -1
- package/gsd-core/workflows/help/modes/topic.md +1 -0
- package/gsd-core/workflows/import.md +1 -1
- package/gsd-core/workflows/ingest-docs.md +1 -1
- package/gsd-core/workflows/insert-phase.md +1 -1
- package/gsd-core/workflows/list-seeds.md +1 -1
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +1 -1
- package/gsd-core/workflows/map-codebase.md +1 -1
- package/gsd-core/workflows/milestone-summary.md +4 -4
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +7 -1
- package/gsd-core/workflows/new-project.md +1 -1
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +1 -1
- package/gsd-core/workflows/pause-work.md +1 -1
- package/gsd-core/workflows/plan-milestone-gaps.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +42 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +102 -0
- package/gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md +23 -0
- package/gsd-core/workflows/plan-phase.md +12 -160
- package/gsd-core/workflows/plan-review-convergence.md +1 -1
- package/gsd-core/workflows/plant-seed.md +1 -1
- package/gsd-core/workflows/pr-branch.md +1 -1
- package/gsd-core/workflows/profile-user.md +1 -1
- package/gsd-core/workflows/progress.md +1 -1
- package/gsd-core/workflows/quick.md +1 -1
- package/gsd-core/workflows/reapply-patches.md +1 -1
- package/gsd-core/workflows/remove-phase.md +1 -1
- package/gsd-core/workflows/remove-workspace.md +1 -1
- package/gsd-core/workflows/resume-project.md +1 -1
- package/gsd-core/workflows/review.md +50 -9
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/settings-advanced.md +13 -11
- package/gsd-core/workflows/settings-integrations.md +1 -1
- package/gsd-core/workflows/settings.md +1 -1
- package/gsd-core/workflows/ship.md +1 -1
- package/gsd-core/workflows/sketch-wrap-up.md +1 -1
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +120 -0
- package/gsd-core/workflows/spec-phase.md +8 -6
- package/gsd-core/workflows/spike-wrap-up.md +1 -1
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +1 -1
- package/gsd-core/workflows/thread.md +1 -1
- package/gsd-core/workflows/transition.md +1 -1
- package/gsd-core/workflows/ui-phase.md +1 -1
- package/gsd-core/workflows/ui-review.md +1 -1
- package/gsd-core/workflows/ultraplan-phase.md +1 -1
- package/gsd-core/workflows/update.md +3 -6
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-phase.md +1 -1
- package/gsd-core/workflows/verify-work.md +63 -6
- package/package.json +5 -5
- package/scripts/ci-test-scope.cjs +19 -1
- package/scripts/generate-package-identity.cjs +27 -2
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -148
- package/scripts/lint-regression-test-names.allowlist.json +1 -273
- package/scripts/lint-test-file-count.allowlist.json +7 -91
- package/scripts/research-profiles.cjs +6 -6
- package/scripts/run-tests.cjs +67 -4
- package/scripts/slurm-adapter.cjs +269 -0
- package/scripts/sync-manifest-versions.cjs +67 -14
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-mempalace-recall/SKILL.md +9 -5
- package/skills/gsd-next/SKILL.md +30 -0
- package/skills/gsd-ns-workflow/SKILL.md +4 -1
- package/skills/gsd-review/SKILL.md +6 -0
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.1",
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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",
|
|
@@ -1690,6 +1698,7 @@ const capabilities = {
|
|
|
1690
1698
|
},
|
|
1691
1699
|
"commandStyle": "slash-hyphen",
|
|
1692
1700
|
"hooksSurface": "none",
|
|
1701
|
+
"extensionEvents": "opencode",
|
|
1693
1702
|
"sandboxTier": "none",
|
|
1694
1703
|
"supportTier": 2,
|
|
1695
1704
|
"installSurface": "settings-json",
|
|
@@ -1718,7 +1727,7 @@ const capabilities = {
|
|
|
1718
1727
|
"pattern-mapper": {
|
|
1719
1728
|
"id": "pattern-mapper",
|
|
1720
1729
|
"role": "feature",
|
|
1721
|
-
"version": "1.7.0-rc.
|
|
1730
|
+
"version": "1.7.0-rc.3",
|
|
1722
1731
|
"title": "Pattern mapping",
|
|
1723
1732
|
"description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
|
|
1724
1733
|
"tier": "full",
|
|
@@ -1772,7 +1781,7 @@ const capabilities = {
|
|
|
1772
1781
|
"profile-pipeline": {
|
|
1773
1782
|
"id": "profile-pipeline",
|
|
1774
1783
|
"role": "feature",
|
|
1775
|
-
"version": "1.7.0-rc.
|
|
1784
|
+
"version": "1.7.0-rc.3",
|
|
1776
1785
|
"title": "Developer profiling pipeline",
|
|
1777
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.",
|
|
1778
1787
|
"tier": "full",
|
|
@@ -1849,7 +1858,7 @@ const capabilities = {
|
|
|
1849
1858
|
"qwen": {
|
|
1850
1859
|
"id": "qwen",
|
|
1851
1860
|
"role": "runtime",
|
|
1852
|
-
"version": "1.7.0-rc.
|
|
1861
|
+
"version": "1.7.0-rc.3",
|
|
1853
1862
|
"title": "Qwen Code",
|
|
1854
1863
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
1855
1864
|
"tier": "core",
|
|
@@ -1924,7 +1933,7 @@ const capabilities = {
|
|
|
1924
1933
|
"research": {
|
|
1925
1934
|
"id": "research",
|
|
1926
1935
|
"role": "feature",
|
|
1927
|
-
"version": "1.7.0-rc.
|
|
1936
|
+
"version": "1.7.0-rc.3",
|
|
1928
1937
|
"title": "Phase research",
|
|
1929
1938
|
"description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
|
|
1930
1939
|
"tier": "standard",
|
|
@@ -1976,7 +1985,7 @@ const capabilities = {
|
|
|
1976
1985
|
"schema-gate": {
|
|
1977
1986
|
"id": "schema-gate",
|
|
1978
1987
|
"role": "feature",
|
|
1979
|
-
"version": "1.7.0-rc.
|
|
1988
|
+
"version": "1.7.0-rc.3",
|
|
1980
1989
|
"title": "Schema push detection gate",
|
|
1981
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.",
|
|
1982
1991
|
"tier": "full",
|
|
@@ -2022,7 +2031,7 @@ const capabilities = {
|
|
|
2022
2031
|
"security": {
|
|
2023
2032
|
"id": "security",
|
|
2024
2033
|
"role": "feature",
|
|
2025
|
-
"version": "1.7.0-rc.
|
|
2034
|
+
"version": "1.7.0-rc.3",
|
|
2026
2035
|
"title": "Security enforcement",
|
|
2027
2036
|
"description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
|
|
2028
2037
|
"tier": "full",
|
|
@@ -2121,7 +2130,7 @@ const capabilities = {
|
|
|
2121
2130
|
"tdd": {
|
|
2122
2131
|
"id": "tdd",
|
|
2123
2132
|
"role": "feature",
|
|
2124
|
-
"version": "1.7.0-rc.
|
|
2133
|
+
"version": "1.7.0-rc.3",
|
|
2125
2134
|
"title": "Test-driven development",
|
|
2126
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.",
|
|
2127
2136
|
"tier": "full",
|
|
@@ -2174,7 +2183,7 @@ const capabilities = {
|
|
|
2174
2183
|
"trae": {
|
|
2175
2184
|
"id": "trae",
|
|
2176
2185
|
"role": "runtime",
|
|
2177
|
-
"version": "1.7.0-rc.
|
|
2186
|
+
"version": "1.7.0-rc.3",
|
|
2178
2187
|
"title": "Trae IDE",
|
|
2179
2188
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
2180
2189
|
"tier": "core",
|
|
@@ -2260,7 +2269,7 @@ const capabilities = {
|
|
|
2260
2269
|
"ui": {
|
|
2261
2270
|
"id": "ui",
|
|
2262
2271
|
"role": "feature",
|
|
2263
|
-
"version": "1.7.0-rc.
|
|
2272
|
+
"version": "1.7.0-rc.3",
|
|
2264
2273
|
"title": "UI design contracts",
|
|
2265
2274
|
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
|
|
2266
2275
|
"tier": "full",
|
|
@@ -2355,7 +2364,7 @@ const capabilities = {
|
|
|
2355
2364
|
"windsurf": {
|
|
2356
2365
|
"id": "windsurf",
|
|
2357
2366
|
"role": "runtime",
|
|
2358
|
-
"version": "1.7.0-rc.
|
|
2367
|
+
"version": "1.7.0-rc.3",
|
|
2359
2368
|
"title": "Windsurf",
|
|
2360
2369
|
"description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
|
|
2361
2370
|
"tier": "core",
|
|
@@ -2473,7 +2482,7 @@ const byLoopPoint = {
|
|
|
2473
2482
|
"into": "orchestrator",
|
|
2474
2483
|
"fragment": {
|
|
2475
2484
|
"path": "fragments/recall-discuss.md",
|
|
2476
|
-
"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
|
|
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"
|
|
2477
2486
|
},
|
|
2478
2487
|
"produces": [],
|
|
2479
2488
|
"consumes": [],
|
|
@@ -2701,7 +2710,21 @@ const byLoopPoint = {
|
|
|
2701
2710
|
"onError": "skip"
|
|
2702
2711
|
}
|
|
2703
2712
|
],
|
|
2704
|
-
"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
|
+
],
|
|
2705
2728
|
"gates": [
|
|
2706
2729
|
{
|
|
2707
2730
|
"capId": "gap-analysis",
|
|
@@ -2728,13 +2751,30 @@ const byLoopPoint = {
|
|
|
2728
2751
|
"execute:wave:post": {
|
|
2729
2752
|
"steps": [],
|
|
2730
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
|
+
},
|
|
2731
2771
|
{
|
|
2732
2772
|
"capId": "mempalace",
|
|
2733
2773
|
"point": "execute:wave:post",
|
|
2734
2774
|
"into": "verifier",
|
|
2735
2775
|
"fragment": {
|
|
2736
2776
|
"path": "fragments/capture-problems.md",
|
|
2737
|
-
"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
|
|
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"
|
|
2738
2778
|
},
|
|
2739
2779
|
"produces": [],
|
|
2740
2780
|
"consumes": [],
|
|
@@ -2927,6 +2967,11 @@ const configKeys = {
|
|
|
2927
2967
|
"workflow.drift_action": "drift",
|
|
2928
2968
|
"workflow.schema_drift_gate": "drift",
|
|
2929
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",
|
|
2930
2975
|
"workflow.post_planning_gaps": "gap-analysis",
|
|
2931
2976
|
"graphify.enabled": "graphify",
|
|
2932
2977
|
"intel.enabled": "intel",
|
|
@@ -3012,6 +3057,39 @@ const configSchema = {
|
|
|
3012
3057
|
"default": true,
|
|
3013
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."
|
|
3014
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
|
+
},
|
|
3015
3093
|
"workflow.post_planning_gaps": {
|
|
3016
3094
|
"owner": "gap-analysis",
|
|
3017
3095
|
"type": "boolean",
|
|
@@ -3040,7 +3118,7 @@ const configSchema = {
|
|
|
3040
3118
|
"owner": "mempalace",
|
|
3041
3119
|
"type": "enum",
|
|
3042
3120
|
"default": "augment",
|
|
3043
|
-
"description": "How MemPalace relates to GSD native memory.
|
|
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.",
|
|
3044
3122
|
"values": [
|
|
3045
3123
|
"augment",
|
|
3046
3124
|
"kg_backend",
|
|
@@ -3180,7 +3258,7 @@ const runtimes = {
|
|
|
3180
3258
|
"antigravity": {
|
|
3181
3259
|
"id": "antigravity",
|
|
3182
3260
|
"role": "runtime",
|
|
3183
|
-
"version": "1.7.0-rc.
|
|
3261
|
+
"version": "1.7.0-rc.3",
|
|
3184
3262
|
"title": "Antigravity",
|
|
3185
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.",
|
|
3186
3264
|
"tier": "core",
|
|
@@ -3258,7 +3336,7 @@ const runtimes = {
|
|
|
3258
3336
|
"augment": {
|
|
3259
3337
|
"id": "augment",
|
|
3260
3338
|
"role": "runtime",
|
|
3261
|
-
"version": "1.7.0-rc.
|
|
3339
|
+
"version": "1.7.0-rc.3",
|
|
3262
3340
|
"title": "Augment Code",
|
|
3263
3341
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
3264
3342
|
"tier": "core",
|
|
@@ -3361,7 +3439,7 @@ const runtimes = {
|
|
|
3361
3439
|
"claude": {
|
|
3362
3440
|
"id": "claude",
|
|
3363
3441
|
"role": "runtime",
|
|
3364
|
-
"version": "1.7.0-rc.
|
|
3442
|
+
"version": "1.7.0-rc.3",
|
|
3365
3443
|
"title": "Claude Code",
|
|
3366
3444
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
3367
3445
|
"tier": "core",
|
|
@@ -3445,7 +3523,7 @@ const runtimes = {
|
|
|
3445
3523
|
"cline": {
|
|
3446
3524
|
"id": "cline",
|
|
3447
3525
|
"role": "runtime",
|
|
3448
|
-
"version": "1.7.0-rc.
|
|
3526
|
+
"version": "1.7.0-rc.3",
|
|
3449
3527
|
"title": "Cline",
|
|
3450
3528
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
3451
3529
|
"tier": "core",
|
|
@@ -3506,7 +3584,7 @@ const runtimes = {
|
|
|
3506
3584
|
"codebuddy": {
|
|
3507
3585
|
"id": "codebuddy",
|
|
3508
3586
|
"role": "runtime",
|
|
3509
|
-
"version": "1.7.0-rc.
|
|
3587
|
+
"version": "1.7.0-rc.3",
|
|
3510
3588
|
"title": "CodeBuddy",
|
|
3511
3589
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
3512
3590
|
"tier": "core",
|
|
@@ -3609,7 +3687,7 @@ const runtimes = {
|
|
|
3609
3687
|
"codex": {
|
|
3610
3688
|
"id": "codex",
|
|
3611
3689
|
"role": "runtime",
|
|
3612
|
-
"version": "1.7.0-rc.
|
|
3690
|
+
"version": "1.7.0-rc.3",
|
|
3613
3691
|
"title": "OpenAI Codex CLI",
|
|
3614
3692
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
3615
3693
|
"tier": "core",
|
|
@@ -3680,7 +3758,7 @@ const runtimes = {
|
|
|
3680
3758
|
"copilot": {
|
|
3681
3759
|
"id": "copilot",
|
|
3682
3760
|
"role": "runtime",
|
|
3683
|
-
"version": "1.7.0-rc.
|
|
3761
|
+
"version": "1.7.0-rc.3",
|
|
3684
3762
|
"title": "GitHub Copilot",
|
|
3685
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.",
|
|
3686
3764
|
"tier": "core",
|
|
@@ -3751,7 +3829,7 @@ const runtimes = {
|
|
|
3751
3829
|
"cursor": {
|
|
3752
3830
|
"id": "cursor",
|
|
3753
3831
|
"role": "runtime",
|
|
3754
|
-
"version": "1.7.0-rc.
|
|
3832
|
+
"version": "1.7.0-rc.3",
|
|
3755
3833
|
"title": "Cursor",
|
|
3756
3834
|
"description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
3757
3835
|
"tier": "core",
|
|
@@ -3851,85 +3929,10 @@ const runtimes = {
|
|
|
3851
3929
|
}
|
|
3852
3930
|
}
|
|
3853
3931
|
},
|
|
3854
|
-
"gemini": {
|
|
3855
|
-
"id": "gemini",
|
|
3856
|
-
"role": "runtime",
|
|
3857
|
-
"version": "1.7.0-rc.1",
|
|
3858
|
-
"title": "Gemini CLI",
|
|
3859
|
-
"description": "Google Gemini CLI — commands-only artifact layout (TOML); Gemini hook event dialect; settings-json hook surface; tier-2 support.",
|
|
3860
|
-
"tier": "core",
|
|
3861
|
-
"requires": [],
|
|
3862
|
-
"engines": {
|
|
3863
|
-
"gsd": ">=1.6.0"
|
|
3864
|
-
},
|
|
3865
|
-
"runtime": {
|
|
3866
|
-
"configHome": {
|
|
3867
|
-
"kind": "dot-home",
|
|
3868
|
-
"name": ".gemini",
|
|
3869
|
-
"env": [
|
|
3870
|
-
"GEMINI_CONFIG_DIR"
|
|
3871
|
-
]
|
|
3872
|
-
},
|
|
3873
|
-
"localConfigDir": ".gemini",
|
|
3874
|
-
"configFormat": "settings-json",
|
|
3875
|
-
"artifactLayout": {
|
|
3876
|
-
"global": [
|
|
3877
|
-
{
|
|
3878
|
-
"kind": "commands",
|
|
3879
|
-
"destSubpath": "commands/gsd",
|
|
3880
|
-
"prefix": "gsd-",
|
|
3881
|
-
"nesting": "flat",
|
|
3882
|
-
"recursive": false,
|
|
3883
|
-
"converter": null
|
|
3884
|
-
}
|
|
3885
|
-
],
|
|
3886
|
-
"local": [
|
|
3887
|
-
{
|
|
3888
|
-
"kind": "commands",
|
|
3889
|
-
"destSubpath": "commands/gsd",
|
|
3890
|
-
"prefix": "gsd-",
|
|
3891
|
-
"nesting": "flat",
|
|
3892
|
-
"recursive": false,
|
|
3893
|
-
"converter": null
|
|
3894
|
-
}
|
|
3895
|
-
]
|
|
3896
|
-
},
|
|
3897
|
-
"commandStyle": "slash-hyphen",
|
|
3898
|
-
"hooksSurface": "settings-json",
|
|
3899
|
-
"hookEvents": "gemini",
|
|
3900
|
-
"sandboxTier": "none",
|
|
3901
|
-
"supportTier": 2,
|
|
3902
|
-
"installSurface": "settings-json",
|
|
3903
|
-
"writesSharedSettings": true,
|
|
3904
|
-
"permissionWriter": null,
|
|
3905
|
-
"extendedHookEvents": [
|
|
3906
|
-
"BeforeAgent",
|
|
3907
|
-
"AfterAgent",
|
|
3908
|
-
"BeforeModel"
|
|
3909
|
-
],
|
|
3910
|
-
"hostIntegration": {
|
|
3911
|
-
"embeddingMode": "declarative",
|
|
3912
|
-
"commandSurface": "slash-toml",
|
|
3913
|
-
"dispatch": {
|
|
3914
|
-
"namedDispatch": true,
|
|
3915
|
-
"nested": false,
|
|
3916
|
-
"maxDepth": 1,
|
|
3917
|
-
"background": "undocumented",
|
|
3918
|
-
"subagentToolkit": "undocumented",
|
|
3919
|
-
"backgroundDispatch": false
|
|
3920
|
-
},
|
|
3921
|
-
"modelMode": "passive",
|
|
3922
|
-
"hookBus": "host",
|
|
3923
|
-
"stateIO": "filesystem",
|
|
3924
|
-
"transport": "mcp",
|
|
3925
|
-
"runtime": "node"
|
|
3926
|
-
}
|
|
3927
|
-
}
|
|
3928
|
-
},
|
|
3929
3932
|
"hermes": {
|
|
3930
3933
|
"id": "hermes",
|
|
3931
3934
|
"role": "runtime",
|
|
3932
|
-
"version": "1.7.0-rc.
|
|
3935
|
+
"version": "1.7.0-rc.3",
|
|
3933
3936
|
"title": "Hermes Agent",
|
|
3934
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.",
|
|
3935
3938
|
"tier": "core",
|
|
@@ -4000,7 +4003,7 @@ const runtimes = {
|
|
|
4000
4003
|
"kilo": {
|
|
4001
4004
|
"id": "kilo",
|
|
4002
4005
|
"role": "runtime",
|
|
4003
|
-
"version": "1.7.0-rc.
|
|
4006
|
+
"version": "1.7.0-rc.3",
|
|
4004
4007
|
"title": "Kilo Code",
|
|
4005
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.",
|
|
4006
4009
|
"tier": "core",
|
|
@@ -4093,7 +4096,7 @@ const runtimes = {
|
|
|
4093
4096
|
"kimi": {
|
|
4094
4097
|
"id": "kimi",
|
|
4095
4098
|
"role": "runtime",
|
|
4096
|
-
"version": "1.7.0-rc.
|
|
4099
|
+
"version": "1.7.0-rc.3",
|
|
4097
4100
|
"title": "Kimi CLI",
|
|
4098
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.",
|
|
4099
4102
|
"tier": "core",
|
|
@@ -4167,7 +4170,7 @@ const runtimes = {
|
|
|
4167
4170
|
"opencode": {
|
|
4168
4171
|
"id": "opencode",
|
|
4169
4172
|
"role": "runtime",
|
|
4170
|
-
"version": "1.7.0-rc.
|
|
4173
|
+
"version": "1.7.0-rc.3",
|
|
4171
4174
|
"title": "OpenCode",
|
|
4172
4175
|
"description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
4173
4176
|
"tier": "core",
|
|
@@ -4227,6 +4230,7 @@ const runtimes = {
|
|
|
4227
4230
|
},
|
|
4228
4231
|
"commandStyle": "slash-hyphen",
|
|
4229
4232
|
"hooksSurface": "none",
|
|
4233
|
+
"extensionEvents": "opencode",
|
|
4230
4234
|
"sandboxTier": "none",
|
|
4231
4235
|
"supportTier": 2,
|
|
4232
4236
|
"installSurface": "settings-json",
|
|
@@ -4255,7 +4259,7 @@ const runtimes = {
|
|
|
4255
4259
|
"qwen": {
|
|
4256
4260
|
"id": "qwen",
|
|
4257
4261
|
"role": "runtime",
|
|
4258
|
-
"version": "1.7.0-rc.
|
|
4262
|
+
"version": "1.7.0-rc.3",
|
|
4259
4263
|
"title": "Qwen Code",
|
|
4260
4264
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
4261
4265
|
"tier": "core",
|
|
@@ -4330,7 +4334,7 @@ const runtimes = {
|
|
|
4330
4334
|
"trae": {
|
|
4331
4335
|
"id": "trae",
|
|
4332
4336
|
"role": "runtime",
|
|
4333
|
-
"version": "1.7.0-rc.
|
|
4337
|
+
"version": "1.7.0-rc.3",
|
|
4334
4338
|
"title": "Trae IDE",
|
|
4335
4339
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
4336
4340
|
"tier": "core",
|
|
@@ -4416,7 +4420,7 @@ const runtimes = {
|
|
|
4416
4420
|
"windsurf": {
|
|
4417
4421
|
"id": "windsurf",
|
|
4418
4422
|
"role": "runtime",
|
|
4419
|
-
"version": "1.7.0-rc.
|
|
4423
|
+
"version": "1.7.0-rc.3",
|
|
4420
4424
|
"title": "Windsurf",
|
|
4421
4425
|
"description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
|
|
4422
4426
|
"tier": "core",
|
|
@@ -4651,8 +4655,8 @@ const _requiresGraph = {
|
|
|
4651
4655
|
"copilot": [],
|
|
4652
4656
|
"cursor": [],
|
|
4653
4657
|
"drift": [],
|
|
4658
|
+
"external-job": [],
|
|
4654
4659
|
"gap-analysis": [],
|
|
4655
|
-
"gemini": [],
|
|
4656
4660
|
"graphify": [],
|
|
4657
4661
|
"hermes": [],
|
|
4658
4662
|
"intel": [],
|