@skillcap/gdh 0.18.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/INSTALL-BUNDLE.json +1 -1
  2. package/README.md +4 -4
  3. package/RELEASE-SPAN-UPDATE-CONTRACTS.json +145 -8
  4. package/node_modules/@gdh/adapters/dist/authoring-hook-render.d.ts +10 -0
  5. package/node_modules/@gdh/adapters/dist/authoring-hook-render.d.ts.map +1 -0
  6. package/node_modules/@gdh/adapters/dist/authoring-hook-render.js +150 -0
  7. package/node_modules/@gdh/adapters/dist/authoring-hook-render.js.map +1 -0
  8. package/node_modules/@gdh/adapters/dist/claude-settings-patch.d.ts +2 -0
  9. package/node_modules/@gdh/adapters/dist/claude-settings-patch.d.ts.map +1 -1
  10. package/node_modules/@gdh/adapters/dist/claude-settings-patch.js +71 -6
  11. package/node_modules/@gdh/adapters/dist/claude-settings-patch.js.map +1 -1
  12. package/node_modules/@gdh/adapters/dist/index.d.ts +18 -30
  13. package/node_modules/@gdh/adapters/dist/index.d.ts.map +1 -1
  14. package/node_modules/@gdh/adapters/dist/index.js +364 -1128
  15. package/node_modules/@gdh/adapters/dist/index.js.map +1 -1
  16. package/node_modules/@gdh/adapters/dist/skill-rendering.d.ts +45 -0
  17. package/node_modules/@gdh/adapters/dist/skill-rendering.d.ts.map +1 -0
  18. package/node_modules/@gdh/adapters/dist/skill-rendering.js +419 -0
  19. package/node_modules/@gdh/adapters/dist/skill-rendering.js.map +1 -0
  20. package/node_modules/@gdh/adapters/package.json +8 -8
  21. package/node_modules/@gdh/authoring/dist/diagnostics-summary.d.ts +8 -0
  22. package/node_modules/@gdh/authoring/dist/diagnostics-summary.d.ts.map +1 -0
  23. package/node_modules/@gdh/authoring/dist/diagnostics-summary.js +22 -0
  24. package/node_modules/@gdh/authoring/dist/diagnostics-summary.js.map +1 -0
  25. package/node_modules/@gdh/authoring/dist/index.d.ts +4 -1
  26. package/node_modules/@gdh/authoring/dist/index.d.ts.map +1 -1
  27. package/node_modules/@gdh/authoring/dist/index.js +17 -2
  28. package/node_modules/@gdh/authoring/dist/index.js.map +1 -1
  29. package/node_modules/@gdh/authoring/dist/lsp.d.ts +5 -1
  30. package/node_modules/@gdh/authoring/dist/lsp.d.ts.map +1 -1
  31. package/node_modules/@gdh/authoring/dist/lsp.js +95 -1
  32. package/node_modules/@gdh/authoring/dist/lsp.js.map +1 -1
  33. package/node_modules/@gdh/authoring/dist/project.d.ts.map +1 -1
  34. package/node_modules/@gdh/authoring/dist/project.js +1 -0
  35. package/node_modules/@gdh/authoring/dist/project.js.map +1 -1
  36. package/node_modules/@gdh/authoring/dist/scene-resource.d.ts +2 -0
  37. package/node_modules/@gdh/authoring/dist/scene-resource.d.ts.map +1 -1
  38. package/node_modules/@gdh/authoring/dist/scene-resource.js +15 -1
  39. package/node_modules/@gdh/authoring/dist/scene-resource.js.map +1 -1
  40. package/node_modules/@gdh/authoring/package.json +2 -2
  41. package/node_modules/@gdh/cli/dist/index.d.ts.map +1 -1
  42. package/node_modules/@gdh/cli/dist/index.js +206 -280
  43. package/node_modules/@gdh/cli/dist/index.js.map +1 -1
  44. package/node_modules/@gdh/cli/package.json +10 -10
  45. package/node_modules/@gdh/core/dist/index.d.ts +78 -83
  46. package/node_modules/@gdh/core/dist/index.d.ts.map +1 -1
  47. package/node_modules/@gdh/core/dist/index.js +4 -4
  48. package/node_modules/@gdh/core/dist/index.js.map +1 -1
  49. package/node_modules/@gdh/core/package.json +1 -1
  50. package/node_modules/@gdh/docs/dist/agent-contract.js +1 -1
  51. package/node_modules/@gdh/docs/dist/agent-contract.js.map +1 -1
  52. package/node_modules/@gdh/docs/dist/guidance.d.ts.map +1 -1
  53. package/node_modules/@gdh/docs/dist/guidance.js +117 -18
  54. package/node_modules/@gdh/docs/dist/guidance.js.map +1 -1
  55. package/node_modules/@gdh/docs/dist/rules.js +3 -3
  56. package/node_modules/@gdh/docs/dist/rules.js.map +1 -1
  57. package/node_modules/@gdh/docs/package.json +2 -2
  58. package/node_modules/@gdh/mcp/package.json +8 -8
  59. package/node_modules/@gdh/observability/dist/guidance-audit.d.ts.map +1 -1
  60. package/node_modules/@gdh/observability/dist/guidance-audit.js +1 -50
  61. package/node_modules/@gdh/observability/dist/guidance-audit.js.map +1 -1
  62. package/node_modules/@gdh/observability/package.json +2 -2
  63. package/node_modules/@gdh/runtime/dist/bridge-broker-contract.d.ts +23 -0
  64. package/node_modules/@gdh/runtime/dist/bridge-broker-contract.d.ts.map +1 -0
  65. package/node_modules/@gdh/runtime/dist/bridge-broker-contract.js +120 -0
  66. package/node_modules/@gdh/runtime/dist/bridge-broker-contract.js.map +1 -0
  67. package/node_modules/@gdh/runtime/dist/index.d.ts +2 -1
  68. package/node_modules/@gdh/runtime/dist/index.d.ts.map +1 -1
  69. package/node_modules/@gdh/runtime/dist/index.js +28 -62
  70. package/node_modules/@gdh/runtime/dist/index.js.map +1 -1
  71. package/node_modules/@gdh/runtime/package.json +2 -2
  72. package/node_modules/@gdh/scan/package.json +3 -3
  73. package/node_modules/@gdh/verify/dist/index.d.ts +0 -1
  74. package/node_modules/@gdh/verify/dist/index.d.ts.map +1 -1
  75. package/node_modules/@gdh/verify/dist/index.js +1 -2
  76. package/node_modules/@gdh/verify/dist/index.js.map +1 -1
  77. package/node_modules/@gdh/verify/package.json +7 -7
  78. package/package.json +11 -11
@@ -4,7 +4,7 @@ import fs from "node:fs/promises";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
- import { buildGdhStatusResult, CLAUDE_CHECK_COMMAND_RELATIVE_PATH, CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH, CLAUDE_MIGRATE_COMMAND_RELATIVE_PATH, CLAUDE_ONBOARD_COMMAND_RELATIVE_PATH, CLAUDE_PREPARE_COMMAND_RELATIVE_PATH, CLAUDE_STATUS_COMMAND_RELATIVE_PATH, CLAUDE_VERIFY_COMMAND_RELATIVE_PATH, CODEX_CHECK_SKILL_RELATIVE_PATH, CODEX_MIGRATE_SKILL_RELATIVE_PATH, CODEX_ONBOARD_SKILL_RELATIVE_PATH, CODEX_PREPARE_SKILL_RELATIVE_PATH, CODEX_STATUS_SKILL_RELATIVE_PATH, CODEX_VERIFY_SKILL_RELATIVE_PATH, CURSOR_CHECK_SKILL_RELATIVE_PATH, CURSOR_MIGRATE_SKILL_RELATIVE_PATH, CURSOR_ONBOARD_SKILL_RELATIVE_PATH, CURSOR_PREPARE_SKILL_RELATIVE_PATH, CURSOR_STATUS_SKILL_RELATIVE_PATH, CURSOR_VERIFY_SKILL_RELATIVE_PATH, createGsdSnapshot, getSupportedAgentAdaptersStatus, installSupportedAgentAdapters, } from "@gdh/adapters";
7
+ import { buildGdhStatusResult, CLAUDE_CHECK_SKILL_RELATIVE_PATH, CLAUDE_CHECK_UPDATE_HOOK_RELATIVE_PATH, CLAUDE_MIGRATE_SKILL_RELATIVE_PATH, CLAUDE_ONBOARD_SKILL_RELATIVE_PATH, CLAUDE_PREPARE_SKILL_RELATIVE_PATH, CLAUDE_SCAN_SKILL_RELATIVE_PATH, CLAUDE_STATUS_SKILL_RELATIVE_PATH, CODEX_CHECK_SKILL_RELATIVE_PATH, CODEX_MIGRATE_SKILL_RELATIVE_PATH, CODEX_ONBOARD_SKILL_RELATIVE_PATH, CODEX_PREPARE_SKILL_RELATIVE_PATH, CODEX_SCAN_SKILL_RELATIVE_PATH, CODEX_STATUS_SKILL_RELATIVE_PATH, CURSOR_CHECK_SKILL_RELATIVE_PATH, CURSOR_MIGRATE_SKILL_RELATIVE_PATH, CURSOR_ONBOARD_SKILL_RELATIVE_PATH, CURSOR_PREPARE_SKILL_RELATIVE_PATH, CURSOR_SCAN_SKILL_RELATIVE_PATH, CURSOR_STATUS_SKILL_RELATIVE_PATH, createGsdSnapshot, getSupportedAgentAdaptersStatus, installSupportedAgentAdapters, } from "@gdh/adapters";
8
8
  import { checkManagedLsp, doctorManagedLsp, getManagedLspStatus, hasCompleteOnboardingSurface, inspectCacheState, pruneCacheState, pruneManagedLsp, readProjectConfig, readWorktreeState, resolveAuthoringStatus, resolvePinnedVersion, resolveProjectRoot, resolveTargetGodotDocsVersion, restartManagedLsp, runAuthoringCheck, runImportRefresh, runTargetPrepare, runWarmup, stopManagedLsp, } from "@gdh/authoring";
9
9
  import { definePackageBoundary, GDH_AUTHORING_DOGFOOD_VERSION, GDH_AUTHORING_SLICE_REPORT_VERSION, GDH_PRODUCT_NAME, resolveCurrentGdhInstall, resolveGdhProductMetadata, } from "@gdh/core";
10
10
  import { fetchOfficialGodotDoc, getGuidanceStatus, resolveGuidanceQuery, searchOfficialGodotDocs, } from "@gdh/docs";
@@ -12,7 +12,7 @@ import { createMcpManifest, invokeMcpTool, serveMcpOverStdio } from "@gdh/mcp";
12
12
  import { inspectAuthoringEffectiveness, inspectAuthoringSessions, inspectGuidanceAudit, recordAuthoringSessionEvent, } from "@gdh/observability";
13
13
  import { checkRuntimeRecipe, inspectRuntimeBridgeSurface, installRuntimeBridgeSurface, listRuntimeRecipes, removeRuntimeBridgeSurface, repairRuntimeBridgeSurface, runRuntimeRecipe, showRuntimeRecipe, } from "@gdh/runtime";
14
14
  import { applyRepairableOnboardingWrites, onboardGodotProject, persistInventoryForTarget, readInventoryCacheOrScan, scanGodotProjectInventory, } from "@gdh/scan";
15
- import { evaluateDonePolicy, exerciseRuntimeCorpusEntry, inspectRuntimeCorpusStatus, inspectRuntimeVerificationBundleState, inspectRuntimeVerificationReadiness, listRuntimeScenarios, materializeRuntimeCorpusEntry, recommendValidationForChange, recordRuntimeCorpusValidation, runRuntimeVerificationScenario, showRuntimeScenario, } from "@gdh/verify";
15
+ import { exerciseRuntimeCorpusEntry, inspectRuntimeCorpusStatus, inspectRuntimeVerificationBundleState, inspectRuntimeVerificationReadiness, listRuntimeScenarios, materializeRuntimeCorpusEntry, recordRuntimeCorpusValidation, runRuntimeVerificationScenario, showRuntimeScenario, } from "@gdh/verify";
16
16
  import { migrateProjectLifecycleSurface } from "./migrate.js";
17
17
  import { presentPublicRuntimeTerms } from "./public-terms.js";
18
18
  import { runSelfUpdateCommand } from "./self-update.js";
@@ -695,24 +695,24 @@ async function runDocsFetchCommand(args, io) {
695
695
  }
696
696
  }
697
697
  async function runAuthoringCheckCommand(args, io) {
698
+ const usage = [
699
+ "Usage: gdh authoring check [target] [--mode final|post-edit] [--changed <path>...] [--severity-policy errors|all] [--format json|compact]",
700
+ "Usage: gdh authoring check --target <path> [--mode final|post-edit] [--changed <path>...] [--severity-policy errors|all] [--format json|compact]",
701
+ "",
702
+ "Run GDH authoring validation and print structured JSON by default.",
703
+ "Use --mode post-edit with --changed for fast scoped feedback after edits.",
704
+ "Use --mode final before claiming code-validity for task completion.",
705
+ ].join("\n");
698
706
  if (args.includes("--help")) {
699
- io.stdout.write([
700
- "Usage: gdh authoring check [target]",
701
- "Usage: gdh authoring check --target <path>",
702
- "",
703
- "Run the current GDH authoring-check flow and print a structured result as JSON.",
704
- ].join("\n") + "\n");
707
+ io.stdout.write(`${usage}\n`);
705
708
  return 0;
706
709
  }
707
- const parsedTarget = parseSingleTargetPathArg(args, {
708
- usage: "Usage: gdh authoring check [target]\nUsage: gdh authoring check --target <path>\n",
709
- allowTargetOption: true,
710
- });
711
- if (parsedTarget.error !== null) {
712
- io.stderr.write(parsedTarget.error);
710
+ const parsed = parseAuthoringCheckArgs(args, usage);
711
+ if (parsed.error !== null) {
712
+ io.stderr.write(parsed.error);
713
713
  return 1;
714
714
  }
715
- const targetPath = parsedTarget.targetPath;
715
+ const { targetPath, mode, changedFiles, severityPolicy, outputFormat } = parsed;
716
716
  const commandStartedAtMs = Date.now();
717
717
  try {
718
718
  const context = await buildAuthoringContext(targetPath);
@@ -720,15 +720,18 @@ async function runAuthoringCheckCommand(args, io) {
720
720
  targetPath,
721
721
  status: context.status,
722
722
  projectConfig: context.projectConfig,
723
+ mode,
724
+ changedFiles,
725
+ severityPolicy,
723
726
  });
724
727
  await recordSessionEvent(targetPath, {
725
728
  commandStartedAtMs,
726
729
  kind: "authoring_check",
727
- command: "gdh authoring check",
730
+ command: formatAuthoringCheckCommand({ mode, changedFiles, severityPolicy, outputFormat }),
728
731
  state: result.status === "unavailable" ? "blocked" : "succeeded",
729
732
  summary: result.summary,
730
733
  validation: {
731
- changedFiles: [],
734
+ changedFiles,
732
735
  recommendedKinds: ["authoring_check"],
733
736
  performedKinds: result.status === "passed" ||
734
737
  result.status === "diagnostics" ||
@@ -737,14 +740,19 @@ async function runAuthoringCheckCommand(args, io) {
737
740
  : [],
738
741
  },
739
742
  });
740
- writeJsonResult(io, result, { presentRuntimeTerms: true });
743
+ if (outputFormat === "compact") {
744
+ io.stdout.write(formatCompactAuthoringCheckResult(result));
745
+ }
746
+ else {
747
+ writeJsonResult(io, result, { presentRuntimeTerms: true });
748
+ }
741
749
  return 0;
742
750
  }
743
751
  catch (error) {
744
752
  await recordSessionEvent(targetPath, {
745
753
  commandStartedAtMs,
746
754
  kind: "authoring_check",
747
- command: "gdh authoring check",
755
+ command: formatAuthoringCheckCommand({ mode, changedFiles, severityPolicy, outputFormat }),
748
756
  state: "failed",
749
757
  summary: "GDH authoring check failed before producing a result.",
750
758
  errorMessage: formatCliError(error),
@@ -753,6 +761,151 @@ async function runAuthoringCheckCommand(args, io) {
753
761
  return 1;
754
762
  }
755
763
  }
764
+ function parseAuthoringCheckArgs(args, usage) {
765
+ const optionNames = new Set(["--target", "--mode", "--changed", "--severity-policy", "--format"]);
766
+ const unsupportedOptionsError = findUnsupportedOptionsError(args, {
767
+ usage,
768
+ optionsWithValues: [...optionNames],
769
+ });
770
+ if (unsupportedOptionsError !== null) {
771
+ return {
772
+ targetPath: path.resolve("."),
773
+ mode: "final",
774
+ changedFiles: [],
775
+ severityPolicy: "errors",
776
+ outputFormat: "json",
777
+ error: unsupportedOptionsError,
778
+ };
779
+ }
780
+ for (const optionName of optionNames) {
781
+ if (args.includes(optionName) && hasMissingOptionValue(args, optionName)) {
782
+ return {
783
+ targetPath: path.resolve("."),
784
+ mode: "final",
785
+ changedFiles: [],
786
+ severityPolicy: "errors",
787
+ outputFormat: "json",
788
+ error: `Usage error: ${optionName} requires a value.\n${usage}`,
789
+ };
790
+ }
791
+ }
792
+ const targetOptionValue = readSingleOptionValue(args, "--target");
793
+ const positionalArgs = extractPositionalArgs(args, optionNames);
794
+ if (positionalArgs.length > 1) {
795
+ return {
796
+ targetPath: path.resolve("."),
797
+ mode: "final",
798
+ changedFiles: [],
799
+ severityPolicy: "errors",
800
+ outputFormat: "json",
801
+ error: `Usage error: command accepts at most one target path.\n${usage}`,
802
+ };
803
+ }
804
+ if (targetOptionValue !== null && positionalArgs.length > 0) {
805
+ return {
806
+ targetPath: path.resolve("."),
807
+ mode: "final",
808
+ changedFiles: [],
809
+ severityPolicy: "errors",
810
+ outputFormat: "json",
811
+ error: `Usage error: choose either a positional target path or --target <path>.\n${usage}`,
812
+ };
813
+ }
814
+ const modeValue = readSingleOptionValue(args, "--mode") ?? "final";
815
+ const mode = normalizeAuthoringCheckMode(modeValue);
816
+ if (mode === null) {
817
+ return {
818
+ targetPath: path.resolve("."),
819
+ mode: "final",
820
+ changedFiles: [],
821
+ severityPolicy: "errors",
822
+ outputFormat: "json",
823
+ error: `Usage error: --mode must be final or post-edit.\n${usage}`,
824
+ };
825
+ }
826
+ const severityPolicyValue = readSingleOptionValue(args, "--severity-policy") ?? "errors";
827
+ const severityPolicy = severityPolicyValue === "errors" || severityPolicyValue === "all" ? severityPolicyValue : null;
828
+ if (severityPolicy === null) {
829
+ return {
830
+ targetPath: path.resolve("."),
831
+ mode: "final",
832
+ changedFiles: [],
833
+ severityPolicy: "errors",
834
+ outputFormat: "json",
835
+ error: `Usage error: --severity-policy must be errors or all.\n${usage}`,
836
+ };
837
+ }
838
+ const outputFormatValue = readSingleOptionValue(args, "--format") ?? "json";
839
+ const outputFormat = outputFormatValue === "json" || outputFormatValue === "compact" ? outputFormatValue : null;
840
+ if (outputFormat === null) {
841
+ return {
842
+ targetPath: path.resolve("."),
843
+ mode: "final",
844
+ changedFiles: [],
845
+ severityPolicy: "errors",
846
+ outputFormat: "json",
847
+ error: `Usage error: --format must be json or compact.\n${usage}`,
848
+ };
849
+ }
850
+ return {
851
+ targetPath: path.resolve(targetOptionValue ?? positionalArgs[0] ?? "."),
852
+ mode,
853
+ changedFiles: collectOptionValues(args, "--changed"),
854
+ severityPolicy,
855
+ outputFormat,
856
+ error: null,
857
+ };
858
+ }
859
+ function normalizeAuthoringCheckMode(value) {
860
+ if (value === "final") {
861
+ return "final";
862
+ }
863
+ if (value === "post-edit" || value === "post_edit") {
864
+ return "post_edit";
865
+ }
866
+ return null;
867
+ }
868
+ function hasMissingOptionValue(args, optionName) {
869
+ for (let index = 0; index < args.length; index += 1) {
870
+ if (args[index] !== optionName) {
871
+ continue;
872
+ }
873
+ const value = args[index + 1];
874
+ if (!value || value.startsWith("--")) {
875
+ return true;
876
+ }
877
+ }
878
+ return false;
879
+ }
880
+ function formatAuthoringCheckCommand(input) {
881
+ const args = [
882
+ "gdh authoring check",
883
+ `--mode ${input.mode === "post_edit" ? "post-edit" : "final"}`,
884
+ ...input.changedFiles.map((changedFile) => `--changed ${changedFile}`),
885
+ `--severity-policy ${input.severityPolicy}`,
886
+ `--format ${input.outputFormat}`,
887
+ ];
888
+ return args.join(" ");
889
+ }
890
+ function formatCompactAuthoringCheckResult(result) {
891
+ const lines = result.diagnostics.map((diagnostic) => {
892
+ const pathPart = diagnostic.path === null ? "<unknown>" : `res://${diagnostic.path}`;
893
+ const line = diagnostic.line === null ? "" : `:${diagnostic.line + 1}`;
894
+ const column = diagnostic.column === null ? "" : `:${diagnostic.column + 1}`;
895
+ return `${pathPart}${line}${column} [${diagnostic.severity}] ${diagnostic.message}`;
896
+ });
897
+ const summary = result.blockingSummary;
898
+ const outcome = summary.state === "blocked"
899
+ ? "Completion blocked."
900
+ : summary.state === "unconfirmed"
901
+ ? "Completion unconfirmed."
902
+ : "Completion allowed.";
903
+ lines.push(`${summary.errorCount} errors, ${summary.warningCount} warnings, ${summary.infoCount} info. ${outcome}`);
904
+ if (summary.reasons.length > 0) {
905
+ lines.push(`Reasons: ${summary.reasons.join(", ")}`);
906
+ }
907
+ return `${lines.join("\n")}\n`;
908
+ }
756
909
  async function runLspStatusCommand(args, io) {
757
910
  if (args.includes("--help")) {
758
911
  io.stdout.write([
@@ -1103,7 +1256,7 @@ async function runAdaptersCommand(args, io) {
1103
1256
  " status [target] [--integration-root <path>] Inspect supported-agent reinforcement status as JSON.",
1104
1257
  " install [target] [--dry-run] [--agent <name>] [--user] [--dev-repo <path>] [--integration-root <path>]",
1105
1258
  " Install or repair supported-agent reinforcement surfaces.",
1106
- " gsd snapshot [target] [--files <path>] [--performed <kind>] Export a read-mostly GSD projection as JSON.",
1259
+ " gsd snapshot [target] [--files <path>] Export a read-mostly GSD projection as JSON.",
1107
1260
  "",
1108
1261
  "Supported agents: codex, claude, cursor",
1109
1262
  ].join("\n") + "\n");
@@ -1123,7 +1276,7 @@ async function runAdaptersCommand(args, io) {
1123
1276
  "",
1124
1277
  "Usage: gdh adapters status [target] [--integration-root <path>]",
1125
1278
  "Usage: gdh adapters install [target] [--dry-run] [--agent <name>] [--user] [--dev-repo <path>] [--integration-root <path>]",
1126
- "Usage: gdh adapters gsd snapshot [target] [--files <path>] [--performed <kind>]",
1279
+ "Usage: gdh adapters gsd snapshot [target] [--files <path>]",
1127
1280
  ].join("\n") + "\n");
1128
1281
  return 1;
1129
1282
  }
@@ -1134,7 +1287,7 @@ async function runGsdAdapterCommand(args, io) {
1134
1287
  "Usage: gdh adapters gsd <command> [target]",
1135
1288
  "",
1136
1289
  "Commands:",
1137
- " snapshot [target] [--files <path>] [--performed <kind>] Export a read-mostly GSD projection as JSON.",
1290
+ " snapshot [target] [--files <path>] Export a read-mostly GSD projection as JSON.",
1138
1291
  ].join("\n") + "\n");
1139
1292
  return 0;
1140
1293
  }
@@ -1144,7 +1297,7 @@ async function runGsdAdapterCommand(args, io) {
1144
1297
  io.stderr.write([
1145
1298
  `Unknown adapters gsd command: ${subcommand}`,
1146
1299
  "",
1147
- "Usage: gdh adapters gsd snapshot [target] [--files <path>] [--performed <kind>]",
1300
+ "Usage: gdh adapters gsd snapshot [target] [--files <path>]",
1148
1301
  ].join("\n") + "\n");
1149
1302
  return 1;
1150
1303
  }
@@ -1366,10 +1519,6 @@ async function runVerifyCommand(args, io) {
1366
1519
  " Inspect or record runtime corpus release-readiness evidence as JSON.",
1367
1520
  " drift [target]",
1368
1521
  " Check whether baked `@skillcap/gdh@<version>` literals (skills + commands) match .gdh/project.yaml gdh_version.",
1369
- " recommend [target] --files <path> [--files <path>...]",
1370
- " Recommend authoring-first validation requirements for the supplied change set.",
1371
- " done [target] --files <path> [--files <path>...] [--performed <kind>]",
1372
- " Evaluate whether the supplied change set is eligible to be called done.",
1373
1522
  ].join("\n") + "\n");
1374
1523
  return 0;
1375
1524
  }
@@ -1383,12 +1532,6 @@ async function runVerifyCommand(args, io) {
1383
1532
  const verifyTargetPath = rest.find((arg) => !arg.startsWith("--")) ?? ".";
1384
1533
  await emitUpdateBannerIfStale(verifyTargetPath, io);
1385
1534
  }
1386
- if (subcommand === "recommend") {
1387
- return runVerifyRecommendCommand(rest, io);
1388
- }
1389
- if (subcommand === "done") {
1390
- return runVerifyDoneCommand(rest, io);
1391
- }
1392
1535
  if (subcommand === "run") {
1393
1536
  return runVerifyRunCommand(rest, io);
1394
1537
  }
@@ -1415,8 +1558,6 @@ async function runVerifyCommand(args, io) {
1415
1558
  "Usage: gdh verify corpus exercise --entry <id> [--manifest <path>] [--workspace-root <path>] [--no-prepare]",
1416
1559
  "Usage: gdh verify corpus record --entry <id> --target <path> [--manifest <path>] [--workspace-root <path>]",
1417
1560
  "Usage: gdh verify drift [target]",
1418
- "Usage: gdh verify recommend [target] --files <path> [--files <path>...]",
1419
- "Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]",
1420
1561
  ].join("\n") + "\n");
1421
1562
  return 1;
1422
1563
  }
@@ -2186,23 +2327,23 @@ async function runAdaptersInstallCommand(args, io) {
2186
2327
  async function runGsdSnapshotCommand(args, io) {
2187
2328
  if (args.includes("--help")) {
2188
2329
  io.stdout.write([
2189
- "Usage: gdh adapters gsd snapshot [target] [--files <path>] [--performed <kind>]",
2330
+ "Usage: gdh adapters gsd snapshot [target] [--files <path>]",
2190
2331
  "",
2191
2332
  "Export a read-mostly GSD projection over current GDH status, guidance, and validation surfaces as JSON.",
2192
2333
  ].join("\n") + "\n");
2193
2334
  return 0;
2194
2335
  }
2195
2336
  const unsupportedOptionsError = findUnsupportedOptionsError(args, {
2196
- usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>] [--performed <kind>]\n",
2197
- optionsWithValues: ["--files", "--performed"],
2337
+ usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>]\n",
2338
+ optionsWithValues: ["--files"],
2198
2339
  });
2199
2340
  if (unsupportedOptionsError !== null) {
2200
2341
  io.stderr.write(unsupportedOptionsError);
2201
2342
  return 1;
2202
2343
  }
2203
2344
  const { targetPath, error: targetPathError } = parseOptionalPositionalTargetPath(args, {
2204
- usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>] [--performed <kind>]\n",
2205
- additionalOptionsWithValues: new Set(["--files", "--performed"]),
2345
+ usage: "Usage: gdh adapters gsd snapshot [target] [--files <path>]\n",
2346
+ additionalOptionsWithValues: new Set(["--files"]),
2206
2347
  });
2207
2348
  if (targetPathError !== null) {
2208
2349
  io.stderr.write(targetPathError);
@@ -2211,7 +2352,6 @@ async function runGsdSnapshotCommand(args, io) {
2211
2352
  try {
2212
2353
  const result = await createGsdSnapshot(targetPath, {
2213
2354
  files: collectOptionValues(args, "--files"),
2214
- performed: collectPerformedValidationKinds(args),
2215
2355
  });
2216
2356
  io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
2217
2357
  return 0;
@@ -2376,149 +2516,6 @@ async function buildAuthoringContext(targetPath, io) {
2376
2516
  status,
2377
2517
  };
2378
2518
  }
2379
- async function runVerifyRecommendCommand(args, io) {
2380
- if (args.includes("--help")) {
2381
- io.stdout.write([
2382
- "Usage: gdh verify recommend [target] --files <path> [--files <path>...]",
2383
- "",
2384
- "Recommend authoring-first validation requirements for the supplied change set as JSON.",
2385
- ].join("\n") + "\n");
2386
- return 0;
2387
- }
2388
- const unsupportedOptionsError = findUnsupportedOptionsError(args, {
2389
- usage: "Usage: gdh verify recommend [target] --files <path> [--files <path>...]\n",
2390
- optionsWithValues: ["--files"],
2391
- });
2392
- if (unsupportedOptionsError !== null) {
2393
- io.stderr.write(unsupportedOptionsError);
2394
- return 1;
2395
- }
2396
- const { targetPath, error: targetPathError } = parseOptionalPositionalTargetPath(args, {
2397
- usage: "Usage: gdh verify recommend [target] --files <path> [--files <path>...]\n",
2398
- additionalOptionsWithValues: new Set(["--files"]),
2399
- });
2400
- if (targetPathError !== null) {
2401
- io.stderr.write(targetPathError);
2402
- return 1;
2403
- }
2404
- const files = collectOptionValues(args, "--files");
2405
- if (files.length === 0) {
2406
- io.stderr.write("Usage error: gdh verify recommend requires at least one --files <path> argument.\n");
2407
- return 1;
2408
- }
2409
- const commandStartedAtMs = Date.now();
2410
- try {
2411
- const context = await buildAuthoringContext(targetPath);
2412
- const result = await recommendValidationForChange({
2413
- targetPath,
2414
- inventory: context.inventory,
2415
- status: context.status,
2416
- projectConfig: context.projectConfig,
2417
- files,
2418
- });
2419
- await recordSessionEvent(targetPath, {
2420
- commandStartedAtMs,
2421
- kind: "verify_recommend",
2422
- command: "gdh verify recommend",
2423
- state: result.recommendations.length === 0 ? "blocked" : "succeeded",
2424
- summary: result.summary,
2425
- changedFiles: files,
2426
- guidance: buildGuidanceSnapshot(result.guidance),
2427
- validation: {
2428
- changedFiles: files,
2429
- recommendedKinds: result.recommendations.map((item) => item.kind),
2430
- performedKinds: [],
2431
- },
2432
- });
2433
- io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
2434
- return 0;
2435
- }
2436
- catch (error) {
2437
- await recordSessionEvent(targetPath, {
2438
- commandStartedAtMs,
2439
- kind: "verify_recommend",
2440
- command: "gdh verify recommend",
2441
- state: "failed",
2442
- summary: "Validation recommendation failed before producing a result.",
2443
- changedFiles: files,
2444
- errorMessage: formatCliError(error),
2445
- });
2446
- io.stderr.write(`Failed to recommend validation for "${targetPath}": ${formatCliError(error)}\n`);
2447
- return 1;
2448
- }
2449
- }
2450
- async function runVerifyDoneCommand(args, io) {
2451
- if (args.includes("--help")) {
2452
- io.stdout.write([
2453
- "Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]",
2454
- "",
2455
- "Evaluate whether the supplied change set is eligible to be called done as JSON.",
2456
- ].join("\n") + "\n");
2457
- return 0;
2458
- }
2459
- const unsupportedOptionsError = findUnsupportedOptionsError(args, {
2460
- usage: "Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]\n",
2461
- optionsWithValues: ["--files", "--performed"],
2462
- });
2463
- if (unsupportedOptionsError !== null) {
2464
- io.stderr.write(unsupportedOptionsError);
2465
- return 1;
2466
- }
2467
- const { targetPath, error: targetPathError } = parseOptionalPositionalTargetPath(args, {
2468
- usage: "Usage: gdh verify done [target] --files <path> [--files <path>...] [--performed <kind>]\n",
2469
- additionalOptionsWithValues: new Set(["--files", "--performed"]),
2470
- });
2471
- if (targetPathError !== null) {
2472
- io.stderr.write(targetPathError);
2473
- return 1;
2474
- }
2475
- const files = collectOptionValues(args, "--files");
2476
- if (files.length === 0) {
2477
- io.stderr.write("Usage error: gdh verify done requires at least one --files <path> argument.\n");
2478
- return 1;
2479
- }
2480
- const commandStartedAtMs = Date.now();
2481
- try {
2482
- const context = await buildAuthoringContext(targetPath);
2483
- const result = await evaluateDonePolicy({
2484
- targetPath,
2485
- inventory: context.inventory,
2486
- status: context.status,
2487
- projectConfig: context.projectConfig,
2488
- files,
2489
- performed: collectPerformedValidationKinds(args),
2490
- });
2491
- await recordSessionEvent(targetPath, {
2492
- commandStartedAtMs,
2493
- kind: "verify_done",
2494
- command: "gdh verify done",
2495
- state: result.status === "done" ? "succeeded" : "blocked",
2496
- summary: result.summary,
2497
- changedFiles: files,
2498
- guidance: buildGuidanceSnapshot(result.recommendation.guidance),
2499
- validation: {
2500
- changedFiles: files,
2501
- recommendedKinds: result.recommendation.recommendations.map((item) => item.kind),
2502
- performedKinds: result.performedValidations.map((item) => item.kind),
2503
- },
2504
- });
2505
- io.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
2506
- return 0;
2507
- }
2508
- catch (error) {
2509
- await recordSessionEvent(targetPath, {
2510
- commandStartedAtMs,
2511
- kind: "verify_done",
2512
- command: "gdh verify done",
2513
- state: "failed",
2514
- summary: "Done-policy evaluation failed before producing a result.",
2515
- changedFiles: files,
2516
- errorMessage: formatCliError(error),
2517
- });
2518
- io.stderr.write(`Failed to evaluate done policy for "${targetPath}": ${formatCliError(error)}\n`);
2519
- return 1;
2520
- }
2521
- }
2522
2519
  async function runVerifyRunCommand(args, io) {
2523
2520
  if (args.includes("--help")) {
2524
2521
  io.stdout.write([
@@ -2731,19 +2728,19 @@ const VERIFY_DRIFT_SCANNED_FILES = [
2731
2728
  { relativePath: CODEX_MIGRATE_SKILL_RELATIVE_PATH, description: "Codex gdh-migrate skill" },
2732
2729
  { relativePath: CODEX_CHECK_SKILL_RELATIVE_PATH, description: "Codex gdh-check skill" },
2733
2730
  { relativePath: CODEX_PREPARE_SKILL_RELATIVE_PATH, description: "Codex gdh-prepare skill" },
2734
- { relativePath: CODEX_VERIFY_SKILL_RELATIVE_PATH, description: "Codex gdh-verify skill" },
2731
+ { relativePath: CODEX_SCAN_SKILL_RELATIVE_PATH, description: "Codex gdh-scan skill" },
2735
2732
  { relativePath: CURSOR_ONBOARD_SKILL_RELATIVE_PATH, description: "Cursor gdh-onboard skill" },
2736
2733
  { relativePath: CURSOR_STATUS_SKILL_RELATIVE_PATH, description: "Cursor gdh-status skill" },
2737
2734
  { relativePath: CURSOR_MIGRATE_SKILL_RELATIVE_PATH, description: "Cursor gdh-migrate skill" },
2738
2735
  { relativePath: CURSOR_CHECK_SKILL_RELATIVE_PATH, description: "Cursor gdh-check skill" },
2739
2736
  { relativePath: CURSOR_PREPARE_SKILL_RELATIVE_PATH, description: "Cursor gdh-prepare skill" },
2740
- { relativePath: CURSOR_VERIFY_SKILL_RELATIVE_PATH, description: "Cursor gdh-verify skill" },
2741
- { relativePath: CLAUDE_ONBOARD_COMMAND_RELATIVE_PATH, description: "Claude gdh/onboard command" },
2742
- { relativePath: CLAUDE_STATUS_COMMAND_RELATIVE_PATH, description: "Claude gdh/status command" },
2743
- { relativePath: CLAUDE_MIGRATE_COMMAND_RELATIVE_PATH, description: "Claude gdh/migrate command" },
2744
- { relativePath: CLAUDE_CHECK_COMMAND_RELATIVE_PATH, description: "Claude gdh/check command" },
2745
- { relativePath: CLAUDE_PREPARE_COMMAND_RELATIVE_PATH, description: "Claude gdh/prepare command" },
2746
- { relativePath: CLAUDE_VERIFY_COMMAND_RELATIVE_PATH, description: "Claude gdh/verify command" },
2737
+ { relativePath: CURSOR_SCAN_SKILL_RELATIVE_PATH, description: "Cursor gdh-scan skill" },
2738
+ { relativePath: CLAUDE_ONBOARD_SKILL_RELATIVE_PATH, description: "Claude gdh-onboard skill" },
2739
+ { relativePath: CLAUDE_STATUS_SKILL_RELATIVE_PATH, description: "Claude gdh-status skill" },
2740
+ { relativePath: CLAUDE_MIGRATE_SKILL_RELATIVE_PATH, description: "Claude gdh-migrate skill" },
2741
+ { relativePath: CLAUDE_CHECK_SKILL_RELATIVE_PATH, description: "Claude gdh-check skill" },
2742
+ { relativePath: CLAUDE_PREPARE_SKILL_RELATIVE_PATH, description: "Claude gdh-prepare skill" },
2743
+ { relativePath: CLAUDE_SCAN_SKILL_RELATIVE_PATH, description: "Claude gdh-scan skill" },
2747
2744
  // Phase 12 extension — close the Phase 11 coverage gap (research §Baked Version Surface Inventory rows 26-28).
2748
2745
  // These files are re-baked at pin time and must be audited by MIG-02's post-condition invariant.
2749
2746
  //
@@ -2771,7 +2768,7 @@ const VERIFY_DRIFT_SCANNED_FILES = [
2771
2768
  // statusline IS re-baked on every `gdh adapters install` via the renderer pipeline, which ensures
2772
2769
  // it stays current with the hook version; pin-literal drift detection is not applicable here.
2773
2770
  //
2774
- // Intentionally excluded: the Claude /gdh-update command (.claude/commands/gdh/update.md) —
2771
+ // Intentionally excluded: the Claude /gdh-update skill (.claude/skills/gdh-update/SKILL.md) —
2775
2772
  // the rendered command shells out to `npx -y @skillcap/gdh@latest self-update` (LITERAL @latest,
2776
2773
  // not @<pinnedVersion>). The shellout MUST bake @latest so the NEW CLI performs the update,
2777
2774
  // not the OLD (potentially buggy) pinned one. Because @latest is not a semver literal, the
@@ -2794,7 +2791,7 @@ async function runVerifyDriftCommand(args, io) {
2794
2791
  "Usage: gdh verify drift [target]",
2795
2792
  "",
2796
2793
  "Compares every baked `@skillcap/gdh@<version>` literal across the managed",
2797
- "surfaces (regenerated Codex/Cursor/Claude skill + command files) against",
2794
+ "surfaces (regenerated Codex/Cursor/Claude skill files and hooks) against",
2798
2795
  ".gdh/project.yaml gdh_version. Exits 1 and",
2799
2796
  "emits a structured JSON result when ANY file's baked version diverges from",
2800
2797
  "the pinned value. Covers ROADMAP Success Criterion #3 (one source of truth).",
@@ -3463,13 +3460,12 @@ async function runAuthoringSliceDoctor(targetPath) {
3463
3460
  adapters: null,
3464
3461
  dogfood,
3465
3462
  authoringCheck: null,
3466
- donePolicy: null,
3467
3463
  };
3468
3464
  }
3469
3465
  if (dogfood.state === "blocked" ||
3470
3466
  dogfood.onboarding === null ||
3471
3467
  dogfood.status === null ||
3472
- dogfood.validationRecommendation === null) {
3468
+ dogfood.guidanceResolve === null) {
3473
3469
  const classification = classifyBlockedDogfoodResult(dogfood);
3474
3470
  return {
3475
3471
  version: GDH_AUTHORING_SLICE_REPORT_VERSION,
@@ -3482,7 +3478,6 @@ async function runAuthoringSliceDoctor(targetPath) {
3482
3478
  adapters: null,
3483
3479
  dogfood,
3484
3480
  authoringCheck: null,
3485
- donePolicy: null,
3486
3481
  };
3487
3482
  }
3488
3483
  const validation = await evaluateAuthoringSliceValidation(targetPath);
@@ -3490,7 +3485,6 @@ async function runAuthoringSliceDoctor(targetPath) {
3490
3485
  dogfood,
3491
3486
  adapters: validation.adapters,
3492
3487
  authoringCheck: validation.authoringCheck,
3493
- donePolicy: validation.donePolicy,
3494
3488
  });
3495
3489
  return {
3496
3490
  version: GDH_AUTHORING_SLICE_REPORT_VERSION,
@@ -3503,7 +3497,6 @@ async function runAuthoringSliceDoctor(targetPath) {
3503
3497
  adapters: validation.adapters,
3504
3498
  dogfood,
3505
3499
  authoringCheck: validation.authoringCheck,
3506
- donePolicy: validation.donePolicy,
3507
3500
  };
3508
3501
  }
3509
3502
  async function executeAuthoringDogfoodTarget(input) {
@@ -3527,7 +3520,6 @@ async function executeAuthoringDogfoodTarget(input) {
3527
3520
  status: null,
3528
3521
  guidanceStatus: null,
3529
3522
  guidanceResolve: null,
3530
- validationRecommendation: null,
3531
3523
  sessionInspection: null,
3532
3524
  blockedReason: input.kind === "pilot" ? "pilot_target_missing" : "fixture_target_missing",
3533
3525
  errorMessage: null,
@@ -3577,7 +3569,6 @@ async function executeAuthoringDogfoodTarget(input) {
3577
3569
  status: null,
3578
3570
  guidanceStatus: null,
3579
3571
  guidanceResolve: null,
3580
- validationRecommendation: null,
3581
3572
  sessionInspection,
3582
3573
  blockedReason: onboarding.status === "ready" ? "selected_project_missing" : "onboarding_unresolved",
3583
3574
  errorMessage: null,
@@ -3614,52 +3605,35 @@ async function executeAuthoringDogfoodTarget(input) {
3614
3605
  status: context.status,
3615
3606
  guidanceStatus,
3616
3607
  guidanceResolve: null,
3617
- validationRecommendation: null,
3618
3608
  sessionInspection,
3619
3609
  blockedReason: "no_representative_changed_files",
3620
3610
  errorMessage: null,
3621
3611
  };
3622
3612
  }
3623
- const validationRecommendation = await recommendValidationForChange({
3624
- targetPath: workingCopy.targetPath,
3625
- inventory: context.inventory,
3626
- status: context.status,
3627
- projectConfig: context.projectConfig,
3628
- files: changedFiles,
3613
+ const guidanceResolve = await resolveGuidanceQuery(workingCopy.targetPath, {
3614
+ taskTypes: ["authoring"],
3615
+ capabilities: context.status.effectiveCapabilities,
3616
+ repoState: deriveGuidanceRepoState(context),
3617
+ keywords: [],
3629
3618
  });
3630
3619
  await recordAuthoringSessionEvent(workingCopy.targetPath, {
3631
3620
  sessionId,
3632
3621
  kind: "guidance_resolve",
3633
3622
  command: "gdh guidance resolve",
3634
- state: validationRecommendation.guidance.requiredUnits.length > 0 ||
3635
- validationRecommendation.guidance.recommendedUnits.length > 0
3623
+ state: guidanceResolve.requiredUnits.length > 0 || guidanceResolve.recommendedUnits.length > 0
3636
3624
  ? "succeeded"
3637
3625
  : "blocked",
3638
- summary: validationRecommendation.guidance.status.summary,
3639
- guidance: buildGuidanceSnapshot(validationRecommendation.guidance),
3626
+ summary: guidanceResolve.status.summary,
3627
+ guidance: buildGuidanceSnapshot(guidanceResolve),
3640
3628
  changedFiles,
3641
3629
  });
3642
- await recordAuthoringSessionEvent(workingCopy.targetPath, {
3643
- sessionId,
3644
- kind: "verify_recommend",
3645
- command: "gdh verify recommend",
3646
- state: validationRecommendation.recommendations.length > 0 ? "succeeded" : "blocked",
3647
- summary: validationRecommendation.summary,
3648
- changedFiles,
3649
- guidance: buildGuidanceSnapshot(validationRecommendation.guidance),
3650
- validation: {
3651
- changedFiles,
3652
- recommendedKinds: validationRecommendation.recommendations.map((item) => item.kind),
3653
- performedKinds: [],
3654
- },
3655
- });
3656
3630
  const sessionInspection = await inspectAuthoringSessions(workingCopy.targetPath, {
3657
3631
  sessionId,
3658
3632
  });
3659
3633
  const state = isHealthyDogfoodTarget({
3660
3634
  readiness: context.status.readiness,
3661
3635
  guidanceState: guidanceStatus.state,
3662
- recommendationCount: validationRecommendation.recommendations.length,
3636
+ guidanceUnitCount: guidanceResolve.requiredUnits.length + guidanceResolve.recommendedUnits.length,
3663
3637
  sessionState: sessionInspection.state,
3664
3638
  })
3665
3639
  ? "passed"
@@ -3668,15 +3642,14 @@ async function executeAuthoringDogfoodTarget(input) {
3668
3642
  target,
3669
3643
  state,
3670
3644
  summary: state === "passed"
3671
- ? "Dogfood exercised onboarding, readiness, guidance, validation recommendation, and session evidence successfully."
3645
+ ? "Dogfood exercised onboarding, readiness, guidance resolution, and session evidence successfully."
3672
3646
  : "Dogfood exercised the target, but one or more authoring-slice surfaces stayed blocked or incomplete.",
3673
3647
  changedFiles,
3674
3648
  inventory: onboarding.inventory,
3675
3649
  onboarding,
3676
3650
  status: context.status,
3677
3651
  guidanceStatus,
3678
- guidanceResolve: validationRecommendation.guidance,
3679
- validationRecommendation,
3652
+ guidanceResolve,
3680
3653
  sessionInspection,
3681
3654
  blockedReason: state === "passed" ? null : "authoring_slice_incomplete",
3682
3655
  errorMessage: null,
@@ -3693,7 +3666,6 @@ async function executeAuthoringDogfoodTarget(input) {
3693
3666
  status: null,
3694
3667
  guidanceStatus: null,
3695
3668
  guidanceResolve: null,
3696
- validationRecommendation: null,
3697
3669
  sessionInspection: null,
3698
3670
  blockedReason: null,
3699
3671
  errorMessage: formatCliError(error),
@@ -3752,10 +3724,6 @@ async function evaluateAuthoringSliceValidation(targetPath) {
3752
3724
  throw new Error("Authoring-slice validation requires an onboarded target with a selected primary project.");
3753
3725
  }
3754
3726
  const context = await buildAuthoringContext(workingCopy.targetPath);
3755
- const changedFiles = deriveDogfoodChangedFiles(onboarding.selectedProject);
3756
- if (changedFiles.length === 0) {
3757
- throw new Error("Authoring-slice validation could not derive a representative authoring change set.");
3758
- }
3759
3727
  const adapters = await getSupportedAgentAdaptersStatus(workingCopy.targetPath, {
3760
3728
  includeUserLocal: false,
3761
3729
  });
@@ -3764,18 +3732,9 @@ async function evaluateAuthoringSliceValidation(targetPath) {
3764
3732
  status: context.status,
3765
3733
  projectConfig: context.projectConfig,
3766
3734
  });
3767
- const donePolicy = await evaluateDonePolicy({
3768
- targetPath: workingCopy.targetPath,
3769
- inventory: context.inventory,
3770
- status: context.status,
3771
- projectConfig: context.projectConfig,
3772
- files: changedFiles,
3773
- performed: [],
3774
- });
3775
3735
  return {
3776
3736
  adapters,
3777
3737
  authoringCheck,
3778
- donePolicy,
3779
3738
  };
3780
3739
  }
3781
3740
  finally {
@@ -3831,7 +3790,7 @@ function classifyAuthoringSliceValidation(input) {
3831
3790
  ].filter((reason) => reason !== null),
3832
3791
  };
3833
3792
  }
3834
- if (input.authoringCheck.status === "passed" && input.donePolicy.status === "done") {
3793
+ if (input.authoringCheck.status === "passed") {
3835
3794
  return {
3836
3795
  state: "ready",
3837
3796
  summary: "The current authoring-first slice is healthy enough for internal use on this target.",
@@ -3857,22 +3816,6 @@ function classifyAuthoringSliceValidation(input) {
3857
3816
  reasons: input.authoringCheck.diagnostics.map((diagnostic) => diagnostic.message),
3858
3817
  };
3859
3818
  }
3860
- if (input.donePolicy.status === "not_done") {
3861
- return {
3862
- state: "degraded",
3863
- summary: "The authoring-first slice ran, but the work would still not be eligible to be called done with the current validation evidence.",
3864
- failureClass: "agent_judgment_issue",
3865
- reasons: input.donePolicy.reasons,
3866
- };
3867
- }
3868
- if (input.donePolicy.status === "blocked") {
3869
- return {
3870
- state: "blocked",
3871
- summary: "The authoring-first slice remains blocked because a required validation surface is still unavailable.",
3872
- failureClass: "environment_issue",
3873
- reasons: input.donePolicy.reasons,
3874
- };
3875
- }
3876
3819
  if (input.authoringCheck.status === "degraded") {
3877
3820
  return {
3878
3821
  state: "degraded",
@@ -3897,7 +3840,7 @@ function normalizeRelativePath(value) {
3897
3840
  function isHealthyDogfoodTarget(input) {
3898
3841
  return (input.readiness === "authorable" &&
3899
3842
  input.guidanceState === "ready" &&
3900
- input.recommendationCount > 0 &&
3843
+ input.guidanceUnitCount > 0 &&
3901
3844
  input.sessionState === "available");
3902
3845
  }
3903
3846
  function summarizeAuthoringDogfoodState(results) {
@@ -3952,7 +3895,7 @@ function renderHelp() {
3952
3895
  " docs fetch <ref-or-url> [target] [--project <relative-path>] Fetch one official version-aware Godot docs page or section.",
3953
3896
  " adapters status [target] [--integration-root <path>] Inspect supported-agent reinforcement status.",
3954
3897
  " adapters install [target] [--dry-run] [--agent <name>] [--user] [--dev-repo <path>] [--integration-root <path>] Install or repair supported-agent reinforcement.",
3955
- " adapters gsd snapshot [target] [--files <path>] [--performed <kind>] Export a read-only GSD projection.",
3898
+ " adapters gsd snapshot [target] [--files <path>] Export a read-only GSD projection.",
3956
3899
  " authoring check [target] Run the current authoring-check entrypoint.",
3957
3900
  " lsp <status|check|stop|restart|prune|doctor> [target] Manage authoring.lsp lifecycle state.",
3958
3901
  " warmup [target] [--dry-run] Inspect or apply authoring worktree warmup.",
@@ -3985,8 +3928,6 @@ function renderHelp() {
3985
3928
  " verify corpus materialize --entry <id> Materialize one runtime corpus entry into GDH-managed source state.",
3986
3929
  " verify corpus exercise --entry <id> Exercise one runtime corpus entry through onboarding and runtime verification.",
3987
3930
  " verify corpus record --entry <id> --target <path> Record runtime corpus evidence for one target.",
3988
- " verify recommend [target] --files <path> Recommend validation requirements.",
3989
- " verify done [target] --files <path> Evaluate whether a change is done.",
3990
3931
  " cache inspect [target] Inspect namespaced authoring cache state.",
3991
3932
  " cache prune [target] [--scope <scope>] Remove namespaced authoring cache state.",
3992
3933
  " migrate [target] [--apply] Plan or apply current GDH project-surface migrations.",
@@ -4201,21 +4142,6 @@ function deriveGuidanceRepoState(context) {
4201
4142
  }
4202
4143
  return [...repoState];
4203
4144
  }
4204
- function collectPerformedValidationKinds(args) {
4205
- return collectOptionValues(args, "--performed").flatMap((value) => {
4206
- switch (value) {
4207
- case "authoring_check":
4208
- case "unit_tests":
4209
- case "integration_tests":
4210
- case "editor_validation":
4211
- case "runtime_scenario":
4212
- case "manual_review":
4213
- return [value];
4214
- default:
4215
- return [];
4216
- }
4217
- });
4218
- }
4219
4145
  function extractRecipePositionalArgs(args) {
4220
4146
  return extractPositionalArgs(args, new Set(["--provider", "--param", "--feature", "--no-feature", "--env"]));
4221
4147
  }