@deftai/directive-runtime 0.129.3 → 0.129.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/Taskfile.yml +1 -1
  2. package/dist/hook-dispatch.js +8 -3
  3. package/dist/pre-pr-run.d.ts +7 -1
  4. package/dist/pre-pr-run.js +25 -1
  5. package/dist/verify-ac.d.ts +7 -2
  6. package/dist/verify-ac.js +13 -5
  7. package/docs/scope-provenance.md +4 -0
  8. package/package.json +1 -1
  9. package/packs/skills/skills-pack-0.1.json +3 -3
  10. package/skills/deft-directive-pre-pr/SKILL.md +27 -33
  11. package/skills/deft-directive-release/SKILL.md +23 -0
  12. package/tasks/materialize.cjs +106 -5
  13. package/tasks/materialize.test.cjs +108 -0
  14. package/tasks/materialize.yml +14 -2
  15. package/templates/agents-entry.md +1 -1
  16. package/vendor/directive-content/Taskfile.yml +1 -1
  17. package/vendor/directive-content/docs/scope-provenance.md +4 -0
  18. package/vendor/directive-content/packs/skills/skills-pack-0.1.json +3 -3
  19. package/vendor/directive-content/skills/deft-directive-pre-pr/SKILL.md +27 -33
  20. package/vendor/directive-content/skills/deft-directive-release/SKILL.md +23 -0
  21. package/vendor/directive-content/tasks/materialize.cjs +106 -5
  22. package/vendor/directive-content/tasks/materialize.test.cjs +108 -0
  23. package/vendor/directive-content/tasks/materialize.yml +14 -2
  24. package/vendor/directive-content/templates/agents-entry.md +1 -1
  25. package/vendor/directive-core/dist/.tsbuildinfo +1 -1
  26. package/vendor/directive-core/dist/authz/classify.d.ts +6 -0
  27. package/vendor/directive-core/dist/authz/classify.d.ts.map +1 -1
  28. package/vendor/directive-core/dist/authz/classify.js +156 -2
  29. package/vendor/directive-core/dist/authz/classify.js.map +1 -1
  30. package/vendor/directive-core/dist/authz/evaluate.d.ts +5 -0
  31. package/vendor/directive-core/dist/authz/evaluate.d.ts.map +1 -1
  32. package/vendor/directive-core/dist/authz/evaluate.js +15 -5
  33. package/vendor/directive-core/dist/authz/evaluate.js.map +1 -1
  34. package/vendor/directive-core/dist/check/cached-orchestrator.d.ts.map +1 -1
  35. package/vendor/directive-core/dist/check/cached-orchestrator.js +101 -2
  36. package/vendor/directive-core/dist/check/cached-orchestrator.js.map +1 -1
  37. package/vendor/directive-core/dist/check/context.d.ts +199 -0
  38. package/vendor/directive-core/dist/check/context.d.ts.map +1 -1
  39. package/vendor/directive-core/dist/check/context.js +417 -2
  40. package/vendor/directive-core/dist/check/context.js.map +1 -1
  41. package/vendor/directive-core/dist/check/gate-lists.d.ts +42 -0
  42. package/vendor/directive-core/dist/check/gate-lists.d.ts.map +1 -1
  43. package/vendor/directive-core/dist/check/gate-lists.js +226 -0
  44. package/vendor/directive-core/dist/check/gate-lists.js.map +1 -1
  45. package/vendor/directive-core/dist/check/index.d.ts +1 -0
  46. package/vendor/directive-core/dist/check/index.d.ts.map +1 -1
  47. package/vendor/directive-core/dist/check/index.js +1 -0
  48. package/vendor/directive-core/dist/check/index.js.map +1 -1
  49. package/vendor/directive-core/dist/check/named-cause.d.ts.map +1 -1
  50. package/vendor/directive-core/dist/check/named-cause.js +1 -0
  51. package/vendor/directive-core/dist/check/named-cause.js.map +1 -1
  52. package/vendor/directive-core/dist/check/orchestrator.d.ts +1 -0
  53. package/vendor/directive-core/dist/check/orchestrator.d.ts.map +1 -1
  54. package/vendor/directive-core/dist/check/orchestrator.js +69 -4
  55. package/vendor/directive-core/dist/check/orchestrator.js.map +1 -1
  56. package/vendor/directive-core/dist/eval/health.d.ts.map +1 -1
  57. package/vendor/directive-core/dist/eval/health.js +75 -6
  58. package/vendor/directive-core/dist/eval/health.js.map +1 -1
  59. package/vendor/directive-core/dist/finish-loop/pr-finish-loop.d.ts +7 -0
  60. package/vendor/directive-core/dist/finish-loop/pr-finish-loop.d.ts.map +1 -1
  61. package/vendor/directive-core/dist/finish-loop/pr-finish-loop.js +42 -0
  62. package/vendor/directive-core/dist/finish-loop/pr-finish-loop.js.map +1 -1
  63. package/vendor/directive-core/dist/forward-coverage/diff-coverage.d.ts +2 -1
  64. package/vendor/directive-core/dist/forward-coverage/diff-coverage.d.ts.map +1 -1
  65. package/vendor/directive-core/dist/forward-coverage/diff-coverage.js +2 -1
  66. package/vendor/directive-core/dist/forward-coverage/diff-coverage.js.map +1 -1
  67. package/vendor/directive-core/dist/forward-coverage/evaluate.d.ts +4 -2
  68. package/vendor/directive-core/dist/forward-coverage/evaluate.d.ts.map +1 -1
  69. package/vendor/directive-core/dist/forward-coverage/evaluate.js +11 -4
  70. package/vendor/directive-core/dist/forward-coverage/evaluate.js.map +1 -1
  71. package/vendor/directive-core/dist/hooks/classify/host-session-identity.d.ts +15 -2
  72. package/vendor/directive-core/dist/hooks/classify/host-session-identity.d.ts.map +1 -1
  73. package/vendor/directive-core/dist/hooks/classify/host-session-identity.js +46 -5
  74. package/vendor/directive-core/dist/hooks/classify/host-session-identity.js.map +1 -1
  75. package/vendor/directive-core/dist/hooks/dispatcher.d.ts.map +1 -1
  76. package/vendor/directive-core/dist/hooks/dispatcher.js +61 -10
  77. package/vendor/directive-core/dist/hooks/dispatcher.js.map +1 -1
  78. package/vendor/directive-core/dist/hooks/scope.d.ts +38 -9
  79. package/vendor/directive-core/dist/hooks/scope.d.ts.map +1 -1
  80. package/vendor/directive-core/dist/hooks/scope.js +102 -16
  81. package/vendor/directive-core/dist/hooks/scope.js.map +1 -1
  82. package/vendor/directive-core/dist/install-health/cheap.d.ts +11 -0
  83. package/vendor/directive-core/dist/install-health/cheap.d.ts.map +1 -1
  84. package/vendor/directive-core/dist/install-health/cheap.js +36 -2
  85. package/vendor/directive-core/dist/install-health/cheap.js.map +1 -1
  86. package/vendor/directive-core/dist/install-health/index.d.ts +1 -1
  87. package/vendor/directive-core/dist/install-health/index.d.ts.map +1 -1
  88. package/vendor/directive-core/dist/install-health/index.js +1 -1
  89. package/vendor/directive-core/dist/install-health/index.js.map +1 -1
  90. package/vendor/directive-core/dist/policy/write-fence.d.ts +7 -0
  91. package/vendor/directive-core/dist/policy/write-fence.d.ts.map +1 -1
  92. package/vendor/directive-core/dist/policy/write-fence.js +81 -14
  93. package/vendor/directive-core/dist/policy/write-fence.js.map +1 -1
  94. package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts +19 -0
  95. package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts.map +1 -1
  96. package/vendor/directive-core/dist/pr-closing-keywords/main.js +31 -16
  97. package/vendor/directive-core/dist/pr-closing-keywords/main.js.map +1 -1
  98. package/vendor/directive-core/dist/pr-merge-readiness/compute.d.ts +8 -0
  99. package/vendor/directive-core/dist/pr-merge-readiness/compute.d.ts.map +1 -1
  100. package/vendor/directive-core/dist/pr-merge-readiness/compute.js +54 -2
  101. package/vendor/directive-core/dist/pr-merge-readiness/compute.js.map +1 -1
  102. package/vendor/directive-core/dist/pr-merge-readiness/gh.d.ts +7 -0
  103. package/vendor/directive-core/dist/pr-merge-readiness/gh.d.ts.map +1 -1
  104. package/vendor/directive-core/dist/pr-merge-readiness/gh.js +180 -49
  105. package/vendor/directive-core/dist/pr-merge-readiness/gh.js.map +1 -1
  106. package/vendor/directive-core/dist/pr-merge-readiness/main.d.ts +2 -0
  107. package/vendor/directive-core/dist/pr-merge-readiness/main.d.ts.map +1 -1
  108. package/vendor/directive-core/dist/pr-merge-readiness/main.js +1 -0
  109. package/vendor/directive-core/dist/pr-merge-readiness/main.js.map +1 -1
  110. package/vendor/directive-core/dist/pr-monitor/monitor.d.ts.map +1 -1
  111. package/vendor/directive-core/dist/pr-monitor/monitor.js +1 -0
  112. package/vendor/directive-core/dist/pr-monitor/monitor.js.map +1 -1
  113. package/vendor/directive-core/dist/pr-monitor/readiness.d.ts.map +1 -1
  114. package/vendor/directive-core/dist/pr-monitor/readiness.js +1 -0
  115. package/vendor/directive-core/dist/pr-monitor/readiness.js.map +1 -1
  116. package/vendor/directive-core/dist/pr-monitor/types.d.ts +2 -0
  117. package/vendor/directive-core/dist/pr-monitor/types.d.ts.map +1 -1
  118. package/vendor/directive-core/dist/pr-wait-mergeable/cascade.d.ts +6 -0
  119. package/vendor/directive-core/dist/pr-wait-mergeable/cascade.d.ts.map +1 -1
  120. package/vendor/directive-core/dist/pr-wait-mergeable/cascade.js +27 -0
  121. package/vendor/directive-core/dist/pr-wait-mergeable/cascade.js.map +1 -1
  122. package/vendor/directive-core/dist/pr-wait-mergeable/constants.d.ts +15 -0
  123. package/vendor/directive-core/dist/pr-wait-mergeable/constants.d.ts.map +1 -1
  124. package/vendor/directive-core/dist/pr-wait-mergeable/constants.js +18 -0
  125. package/vendor/directive-core/dist/pr-wait-mergeable/constants.js.map +1 -1
  126. package/vendor/directive-core/dist/pr-wait-mergeable/index.d.ts +2 -1
  127. package/vendor/directive-core/dist/pr-wait-mergeable/index.d.ts.map +1 -1
  128. package/vendor/directive-core/dist/pr-wait-mergeable/index.js +2 -1
  129. package/vendor/directive-core/dist/pr-wait-mergeable/index.js.map +1 -1
  130. package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.d.ts +81 -0
  131. package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.d.ts.map +1 -1
  132. package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.js +687 -3
  133. package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.js.map +1 -1
  134. package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts +59 -1
  135. package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts.map +1 -1
  136. package/vendor/directive-core/dist/pre-pr-controller/controller.js +168 -5
  137. package/vendor/directive-core/dist/pre-pr-controller/controller.js.map +1 -1
  138. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts +1 -1
  139. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts.map +1 -1
  140. package/vendor/directive-core/dist/pre-pr-controller/index.js +1 -1
  141. package/vendor/directive-core/dist/pre-pr-controller/index.js.map +1 -1
  142. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts +7 -0
  143. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts.map +1 -1
  144. package/vendor/directive-core/dist/pre-pr-controller/phases.js +14 -3
  145. package/vendor/directive-core/dist/pre-pr-controller/phases.js.map +1 -1
  146. package/vendor/directive-core/dist/pre-pr-controller/types.d.ts +1 -1
  147. package/vendor/directive-core/dist/pre-pr-controller/types.d.ts.map +1 -1
  148. package/vendor/directive-core/dist/pre-pr-controller/types.js.map +1 -1
  149. package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts.map +1 -1
  150. package/vendor/directive-core/dist/preflight-gh/pre-push.js +58 -2
  151. package/vendor/directive-core/dist/preflight-gh/pre-push.js.map +1 -1
  152. package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.d.ts +1 -1
  153. package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.d.ts.map +1 -1
  154. package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.js +1 -1
  155. package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.js.map +1 -1
  156. package/vendor/directive-core/dist/product-first-done-gate/index.d.ts +1 -1
  157. package/vendor/directive-core/dist/product-first-done-gate/index.d.ts.map +1 -1
  158. package/vendor/directive-core/dist/product-first-done-gate/index.js +1 -1
  159. package/vendor/directive-core/dist/product-first-done-gate/index.js.map +1 -1
  160. package/vendor/directive-core/dist/release/pipeline.d.ts.map +1 -1
  161. package/vendor/directive-core/dist/release/pipeline.js +22 -23
  162. package/vendor/directive-core/dist/release/pipeline.js.map +1 -1
  163. package/vendor/directive-core/dist/release/preflight.d.ts +11 -0
  164. package/vendor/directive-core/dist/release/preflight.d.ts.map +1 -1
  165. package/vendor/directive-core/dist/release/preflight.js +68 -11
  166. package/vendor/directive-core/dist/release/preflight.js.map +1 -1
  167. package/vendor/directive-core/dist/release/suite-stamp.d.ts +5 -2
  168. package/vendor/directive-core/dist/release/suite-stamp.d.ts.map +1 -1
  169. package/vendor/directive-core/dist/release/suite-stamp.js +12 -1
  170. package/vendor/directive-core/dist/release/suite-stamp.js.map +1 -1
  171. package/vendor/directive-core/dist/release/types.d.ts +10 -6
  172. package/vendor/directive-core/dist/release/types.d.ts.map +1 -1
  173. package/vendor/directive-core/dist/scope/delivery-evidence.d.ts +37 -0
  174. package/vendor/directive-core/dist/scope/delivery-evidence.d.ts.map +1 -1
  175. package/vendor/directive-core/dist/scope/delivery-evidence.js +106 -6
  176. package/vendor/directive-core/dist/scope/delivery-evidence.js.map +1 -1
  177. package/vendor/directive-core/dist/scope/transition.d.ts +3 -1
  178. package/vendor/directive-core/dist/scope/transition.d.ts.map +1 -1
  179. package/vendor/directive-core/dist/scope/transition.js +4 -0
  180. package/vendor/directive-core/dist/scope/transition.js.map +1 -1
  181. package/vendor/directive-core/dist/ts-check-lane/run-lane.d.ts +6 -4
  182. package/vendor/directive-core/dist/ts-check-lane/run-lane.d.ts.map +1 -1
  183. package/vendor/directive-core/dist/ts-check-lane/run-lane.js +10 -6
  184. package/vendor/directive-core/dist/ts-check-lane/run-lane.js.map +1 -1
  185. package/vendor/directive-core/dist/verify-ac/evaluate.d.ts +52 -0
  186. package/vendor/directive-core/dist/verify-ac/evaluate.d.ts.map +1 -1
  187. package/vendor/directive-core/dist/verify-ac/evaluate.js +361 -1
  188. package/vendor/directive-core/dist/verify-ac/evaluate.js.map +1 -1
  189. package/vendor/directive-core/dist/verify-ac/index.d.ts +1 -1
  190. package/vendor/directive-core/dist/verify-ac/index.d.ts.map +1 -1
  191. package/vendor/directive-core/dist/verify-ac/index.js +1 -1
  192. package/vendor/directive-core/dist/verify-ac/index.js.map +1 -1
package/Taskfile.yml CHANGED
@@ -419,7 +419,7 @@ tasks:
419
419
  ENGINE_CMD: 'check --framework-root "{{.TASKFILE_DIR}}" --project-root "{{.USER_WORKING_DIR}}"'
420
420
 
421
421
  test:coverage:
422
- desc: "Run tests with coverage (alias for ts:test; canonical coverage path used by task check, #2528)"
422
+ desc: "On-demand tests with coverage (alias for ts:test). Merge path is coverage-free (#6041); release Step 5 and this task are the host coverage runs."
423
423
  cmds:
424
424
  - task: ts:test
425
425
 
@@ -226,12 +226,17 @@ export function run(argv, seams = {}) {
226
226
  return 0;
227
227
  }
228
228
  // Wave 2k / AC9.4+AC14.8: pin≠installed → fail closed before policy.
229
+ // #5910: overlay-present also fail-closes (even when versions match); recovery
230
+ // names frozen-lockfile restore then overlay retirement.
229
231
  const cheap = (seams.cheapInSync ?? checkCheapInSync)(projectRoot);
230
232
  if (cheap.failClosed) {
231
233
  const guidance = cheap.recoveryGuidance ?? INSTALLATION_RECOVERY_GUIDANCE;
232
- const decision = installationIdentityDeny(args.host, args.event, projectRoot, `Directive hook refuse: pinned runtime does not match the installed runtime ` +
233
- `(pin=${cheap.pinVersion ?? "?"} installed=${cheap.installedVersion ?? "?"}). ` +
234
- `Recovery: ${guidance}`);
234
+ const identityLine = cheap.identityMatch
235
+ ? `Directive hook refuse: materialize-runtime overlay is present; identity cannot pass until the overlay is retired after exact restore ` +
236
+ `(pin=${cheap.pinVersion ?? "?"} installed=${cheap.installedVersion ?? "?"}). `
237
+ : `Directive hook refuse: pinned runtime does not match the installed runtime ` +
238
+ `(pin=${cheap.pinVersion ?? "?"} installed=${cheap.installedVersion ?? "?"}). `;
239
+ const decision = installationIdentityDeny(args.host, args.event, projectRoot, `${identityLine}Recovery: ${guidance}`);
235
240
  const rendered = renderHostDecision(args.host, decision);
236
241
  if (rendered.length > 0)
237
242
  writeOut(`${rendered}\n`);
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import type { VerifyAcDispositionKind } from "@deftai/directive-core/product-first-done-gate";
2
3
  interface ParsedArgs {
3
4
  repo: string;
4
5
  baseSha: string;
@@ -31,11 +32,16 @@ interface ParsedArgs {
31
32
  evaluate: boolean;
32
33
  pushAdmit: boolean;
33
34
  projectRoot: string | null;
35
+ verifyAcDisposition: VerifyAcDispositionKind | null;
34
36
  json: boolean;
35
37
  help: boolean;
36
38
  error?: string;
37
39
  }
38
40
  export declare function parseArgs(argv: string[]): ParsedArgs;
39
- export declare function run(argv: string[]): number;
41
+ export interface PrePrRunOptions {
42
+ /** Hermetic tests inject this; production CLI never sets it (#6071 Greptile). */
43
+ readonly skipNamedMergeGate?: boolean;
44
+ }
45
+ export declare function run(argv: string[], options?: PrePrRunOptions): number;
40
46
  export {};
41
47
  //# sourceMappingURL=pre-pr-run.d.ts.map
@@ -41,6 +41,8 @@ Options:
41
41
  --criteria-digest <hex>
42
42
  --reviewed-file <path> (repeatable)
43
43
  --reviewer-report-ref <ref>
44
+ --verify-ac-disposition <executed-ac|no-obligation>
45
+ direct verify:ac disposition for ordinary pre-PR (#5855)
44
46
  --mark-complete always refuses; cannot mint a pass
45
47
  --skill-open always refuses; opening the skill is not completion
46
48
  --evaluate evaluate live binding against the private store
@@ -82,6 +84,7 @@ export function parseArgs(argv) {
82
84
  evaluate: false,
83
85
  pushAdmit: false,
84
86
  projectRoot: null,
87
+ verifyAcDisposition: null,
85
88
  json: false,
86
89
  help: false,
87
90
  };
@@ -338,6 +341,23 @@ export function parseArgs(argv) {
338
341
  if (arg === "--run-id")
339
342
  i += 1;
340
343
  }
344
+ else if (arg === "--verify-ac-disposition" || arg?.startsWith("--verify-ac-disposition=")) {
345
+ const value = arg === "--verify-ac-disposition"
346
+ ? argv[i + 1]
347
+ : arg.slice("--verify-ac-disposition=".length);
348
+ if (value === undefined) {
349
+ return { ...parsed, error: "argument --verify-ac-disposition: expected one argument" };
350
+ }
351
+ if (value !== "executed-ac" && value !== "no-obligation") {
352
+ return {
353
+ ...parsed,
354
+ error: "argument --verify-ac-disposition: expected executed-ac|no-obligation",
355
+ };
356
+ }
357
+ parsed.verifyAcDisposition = value;
358
+ if (arg === "--verify-ac-disposition")
359
+ i += 1;
360
+ }
341
361
  else {
342
362
  return { ...parsed, error: `unrecognized argument: ${arg}` };
343
363
  }
@@ -354,7 +374,7 @@ function emit(json, payload, text, err) {
354
374
  function asPhaseId(value) {
355
375
  return PRE_PR_PHASE_IDS.includes(value) ? value : null;
356
376
  }
357
- export function run(argv) {
377
+ export function run(argv, options = {}) {
358
378
  const args = parseArgs(argv);
359
379
  if (args.help) {
360
380
  process.stdout.write(USAGE);
@@ -515,6 +535,10 @@ export function run(argv) {
515
535
  const projectRoot = args.projectRoot?.trim() || process.cwd();
516
536
  const d = completeRun(store, controllerPublisher(), args.runId, undefined, {
517
537
  projectRoot,
538
+ ...(options.skipNamedMergeGate === true ? { skipNamedMergeGate: true } : {}),
539
+ ...(args.verifyAcDisposition !== null
540
+ ? { verifyAcDisposition: args.verifyAcDisposition }
541
+ : {}),
518
542
  });
519
543
  emit(args.json, d, d.message, !d.ok);
520
544
  return d.ok ? 0 : 1;
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
+ import { VERIFY_AC_NO_OBLIGATION_EXIT } from "@deftai/directive-core/product-first-done-gate";
3
+ export { VERIFY_AC_NO_OBLIGATION_EXIT };
2
4
  interface ParsedArgs {
3
5
  projectRoot: string;
4
6
  xbriefPath: string | null;
@@ -20,9 +22,12 @@ export type FindActiveXbriefResult = {
20
22
  readonly paths: readonly string[];
21
23
  readonly dir: string;
22
24
  };
23
- /** Three-state exit: pass=0, fail=1, config=2. A printed pass must not leak 201. */
25
+ /**
26
+ * Three-state exit: pass=0, fail=1, config=2, plus deliberate no-obligation=6.
27
+ * A printed pass must not leak 201. No-obligation is a named clamp exception so
28
+ * both check dispatch paths keep the distinct exit (#5855 Recut-8).
29
+ */
24
30
  export declare function clampVerifyAcExit(ok: boolean, code: number): number;
25
31
  /** Run the gate and return the process exit code. */
26
32
  export declare function run(argv: string[]): number;
27
- export {};
28
33
  //# sourceMappingURL=verify-ac.d.ts.map
package/dist/verify-ac.js CHANGED
@@ -12,7 +12,8 @@ import { join, resolve } from "node:path";
12
12
  import { fileURLToPath } from "node:url";
13
13
  import { resolveSessionCompletedVerifyAcTarget } from "../vendor/directive-core/dist/check/index.js";
14
14
  import { formatRejectedLedger, resolveLiteralAcceptanceDetailed, } from "../vendor/directive-core/dist/literal-acceptance/index.js";
15
- import { emitVerifyAcTerminalOutcome, evaluateVerifyAcFromPath, readAdmittedSourceDigest, readAdmittedSourceSentences, readBranchBindContext, readPlanAcceptance, resolveAcceptanceGateProfile, resolveSoftMissingAcTargets, } from "../vendor/directive-core/dist/product-first-done-gate/index.js";
15
+ import { emitVerifyAcTerminalOutcome, evaluateVerifyAcFromPath, readAdmittedSourceDigest, readAdmittedSourceSentences, readBranchBindContext, readPlanAcceptance, resolveAcceptanceGateProfile, resolveSoftMissingAcTargets, VERIFY_AC_NO_OBLIGATION_EXIT, } from "../vendor/directive-core/dist/product-first-done-gate/index.js";
16
+ export { VERIFY_AC_NO_OBLIGATION_EXIT };
16
17
  /** Parse verify:ac CLI args. */
17
18
  export function parseArgs(argv) {
18
19
  const parsed = {
@@ -104,10 +105,16 @@ function listActiveXbriefs(projectRoot) {
104
105
  dir: dirs.join(" + "),
105
106
  };
106
107
  }
107
- /** Three-state exit: pass=0, fail=1, config=2. A printed pass must not leak 201. */
108
+ /**
109
+ * Three-state exit: pass=0, fail=1, config=2, plus deliberate no-obligation=6.
110
+ * A printed pass must not leak 201. No-obligation is a named clamp exception so
111
+ * both check dispatch paths keep the distinct exit (#5855 Recut-8).
112
+ */
108
113
  export function clampVerifyAcExit(ok, code) {
109
114
  if (ok)
110
115
  return 0;
116
+ if (code === VERIFY_AC_NO_OBLIGATION_EXIT)
117
+ return VERIFY_AC_NO_OBLIGATION_EXIT;
111
118
  if (code === 2)
112
119
  return 2;
113
120
  return 1;
@@ -291,10 +298,10 @@ export function run(argv) {
291
298
  const selected = resolveSoftMissingAcTargets(projectRoot, {
292
299
  env: process.env,
293
300
  scannedPaths: found.paths,
294
- branchBind: { ...bindContext, env: process.env },
301
+ branchBind: { ...bindContext, env: process.env, projectRoot },
295
302
  });
296
303
  if (selected.kind === "untied") {
297
- // #5855 P3: completed-target precedence, then soft-missing (no AC claimed).
304
+ // #5855 P3: completed-target precedence, then soft-missing no-obligation.
298
305
  const completed = resolveSessionCompletedVerifyAcTarget({
299
306
  projectRoot,
300
307
  env: process.env,
@@ -315,7 +322,8 @@ export function run(argv) {
315
322
  process.stdout.write(`${selected.message}\n`);
316
323
  }
317
324
  emitVerifyAcTerminalOutcome({ projectRoot, env: process.env, outcome: "soft-missing" });
318
- return 0;
325
+ // Distinct non-zero: exit 0 keeps meaning executed AC only (#5855 Recut-8).
326
+ return VERIFY_AC_NO_OBLIGATION_EXIT;
319
327
  }
320
328
  }
321
329
  else if (selected.kind === "one") {
@@ -73,6 +73,10 @@ When an active implementation brief is **outside** the change set, membership is
73
73
 
74
74
  Membership-land (Path B activation) PRs that only touch nonterminal `xbrief|vbrief` under `proposed|pending|active` plus optional root `CHANGELOG.md` leave `metadata.productPullRequest` **unset**. Closing-keywords admits that brief-land shape when body has `deft-story: N` covering each changed nonterminal (`isBriefLandShapedDiff` + early return in `evaluateFullStoryMarkAdmission`). Optional `metadata.activationPullRequest` is provenance only — delivery readers ignore it. The stacked product PR stamps virgin `productPullRequest` on the existing null path; leftover keeps the original product stamp. ⊗ Write the activation PR number into `productPullRequest`. Legacy stamped activations unstamp once, then product stamps. Depth: `packages/core/src/pr-closing-keywords/main.ts`.
75
75
 
76
+ ### Path B activation vs product `verify:ac` (#5792)
77
+
78
+ Scope-only Path B activation must be able to clear `deft check` before merge-base write authority exists. Check inventories the complete local change set (merge-base..HEAD ∪ dirty ∪ cached ∪ untracked, with rename origins) into `PrDiffPath`, then reuses the Path B witness (`evaluatePathBActivationAdmit`). Inventory base prefers typed `plan.policy.deliveryBranch` / remote default before `master`|`main`, and git-toplevel paths are remapped to `projectRoot` so nested consumers keep brief-land shape. When the inventory is brief-land shaped and the witness admits, check records one named disposition `path_b_activation_deferred` and **defers** product acceptance commands and artifact-clause execution — it does not selectively forgive opaque npm failures and does not bank as a later product verified-pass. Local check without a PR body uses inventory brief issue-ref identity instead of `deft-story` marks; when a PR body is present, mark coverage still applies. Any product path in the inventory, or `productPullRequest` set, restores full `verify:ac`. Write authority stays merge-base-only (`loadStoryWriteFenceFromMergeBase` unchanged). Depth: `packages/core/src/verify-ac/evaluate.ts`, `packages/core/src/check/cached-orchestrator.ts`.
79
+
76
80
 
77
81
  ## Historical ship-closeout for stale merged actives (#5403)
78
82
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deftai/directive-runtime",
3
- "version": "0.129.3",
3
+ "version": "0.129.5",
4
4
  "description": "Directive runtime — pinned product commands, hooks, content, and engine.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://deftai.github.io/directive/",