@pareto4/pp-core 1.13.0 → 1.17.1

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 (201) hide show
  1. package/.claude-plugin/plugin.json +3 -3
  2. package/README.md +26 -9
  3. package/agents/pp-code-reviewer.md +2 -1
  4. package/agents/pp-debug-session-manager.md +9 -6
  5. package/agents/pp-executor.md +10 -13
  6. package/agents/pp-plan-checker.md +4 -4
  7. package/agents/pp-planner.md +23 -9
  8. package/agents/pp-vault-reviewer.md +244 -21
  9. package/agents/pp-verifier.md +7 -3
  10. package/bin/install.js +10 -3
  11. package/commands/pp-execute-phase.md +1 -3
  12. package/commands/pp-ns-review.md +1 -1
  13. package/commands/pp-plan-phase.md +1 -2
  14. package/commands/pp-vault-review.md +5 -3
  15. package/commands/pp-verify-work.md +1 -2
  16. package/gemini-extension.json +1 -1
  17. package/hooks/dist/pp-check-update.js +0 -0
  18. package/hooks/dist/pp-cursor-session-start.js +1 -1
  19. package/hooks/dist/pp-statusline.js +1 -1
  20. package/hooks/dist/pp-update-banner.js +0 -0
  21. package/hooks/pp-check-update.js +0 -0
  22. package/hooks/pp-cursor-session-start.js +1 -1
  23. package/hooks/pp-statusline.js +1 -1
  24. package/hooks/pp-update-banner.js +0 -0
  25. package/package.json +14 -19
  26. package/pareto-skills/_shared/create-project-board.sh +0 -0
  27. package/pareto-skills/pp-project-setup/SKILL.md +1 -1
  28. package/pp-core/bin/check-latest-version.cjs +0 -0
  29. package/pp-core/bin/detect-build-commands.sh +2 -2
  30. package/pp-core/bin/lib/capability-activation.cjs +83 -9
  31. package/pp-core/bin/lib/capability-registry.cjs +396 -82
  32. package/pp-core/bin/lib/capability-state.cjs +160 -4
  33. package/pp-core/bin/lib/capability-writer.cjs +19 -5
  34. package/pp-core/bin/lib/check-command-router.cjs +3334 -946
  35. package/pp-core/bin/lib/clusters.cjs +3 -0
  36. package/pp-core/bin/lib/command-aliases.cjs +0 -35
  37. package/pp-core/bin/lib/commands.cjs +9 -4
  38. package/pp-core/bin/lib/compose-bindings.cjs +251 -88
  39. package/pp-core/bin/lib/config-loader.cjs +7 -103
  40. package/pp-core/bin/lib/config-schema.cjs +1 -1
  41. package/pp-core/bin/lib/config.cjs +154 -62
  42. package/pp-core/bin/lib/decisions.cjs +4 -4
  43. package/pp-core/bin/lib/discovery-vault-check.cjs +246 -0
  44. package/pp-core/bin/lib/frontmatter.cjs +1 -38
  45. package/pp-core/bin/lib/git-base-branch.cjs +13 -11
  46. package/pp-core/bin/lib/git-provider.cjs +4 -4
  47. package/pp-core/bin/lib/init-command-router.cjs +5 -8
  48. package/pp-core/bin/lib/init-contract.cjs +648 -738
  49. package/pp-core/bin/lib/init-interactive.cjs +76 -4
  50. package/pp-core/bin/lib/init.cjs +24 -51
  51. package/pp-core/bin/lib/install-profiles.cjs +1 -1
  52. package/pp-core/bin/lib/io.cjs +8 -0
  53. package/pp-core/bin/lib/loop-resolver.cjs +189 -129
  54. package/pp-core/bin/lib/org-profile.cjs +469 -152
  55. package/pp-core/bin/lib/package-identity.cjs +3 -3
  56. package/pp-core/bin/lib/phase-command-router.cjs +1 -29
  57. package/pp-core/bin/lib/phase-scope.cjs +1 -1
  58. package/pp-core/bin/lib/phase.cjs +11 -253
  59. package/pp-core/bin/lib/platform-bindings.cjs +40 -19
  60. package/pp-core/bin/lib/practices-review-check.cjs +15 -9
  61. package/pp-core/bin/lib/profile-output.cjs +1 -1
  62. package/pp-core/bin/lib/shell-command-projection.cjs +104 -1
  63. package/pp-core/bin/lib/state.cjs +11 -85
  64. package/pp-core/bin/lib/template.cjs +1 -1
  65. package/pp-core/bin/lib/vault-audit.cjs +650 -126
  66. package/pp-core/bin/lib/vault-command-router.cjs +2604 -367
  67. package/pp-core/bin/lib/vault-coordinates.cjs +13 -4
  68. package/pp-core/bin/lib/vault-index.cjs +699 -0
  69. package/pp-core/bin/lib/vault-mode.cjs +235 -0
  70. package/pp-core/bin/lib/vault-practices.cjs +139 -72
  71. package/pp-core/bin/lib/vault-review.cjs +194 -451
  72. package/pp-core/bin/lib/vault-seal.cjs +1936 -0
  73. package/pp-core/bin/lib/vault-standards.cjs +1505 -0
  74. package/pp-core/bin/lib/vault-trace.cjs +607 -254
  75. package/pp-core/bin/lib/vault-update.cjs +9 -33
  76. package/pp-core/bin/lib/vault-write-back.cjs +70 -42
  77. package/pp-core/bin/lib/vault.cjs +2734 -920
  78. package/pp-core/bin/lib/verify.cjs +0 -11
  79. package/pp-core/bin/portable-timeout.sh +1 -1
  80. package/pp-core/bin/pp-tools.cjs +184 -54
  81. package/pp-core/bin/shared/config-defaults.manifest.json +0 -7
  82. package/pp-core/bin/shared/config-schema.manifest.json +0 -3
  83. package/pp-core/bin/shared/model-catalog.json +2 -2
  84. package/pp-core/bin/verify-reapply-patches.cjs +0 -0
  85. package/pp-core/org-profile.json +26 -0
  86. package/pp-core/references/autonomous-best-effort.md +8 -7
  87. package/pp-core/references/loop-hook-dispatch.md +0 -25
  88. package/pp-core/references/planner-gap-closure.md +0 -1
  89. package/pp-core/references/planner-tdd.md +0 -1
  90. package/pp-core/references/planner-vault-practices.md +17 -34
  91. package/pp-core/references/planner-vault-standards.md +320 -0
  92. package/pp-core/references/planning-config.md +0 -8
  93. package/pp-core/references/practice-arithmetic-contract.md +121 -0
  94. package/pp-core/references/tdd.md +0 -1
  95. package/pp-core/references/verifier-practice-verdicts.md +263 -0
  96. package/pp-core/templates/README.md +1 -0
  97. package/pp-core/templates/VAULT-REVIEW.md +202 -0
  98. package/pp-core/templates/phase-prompt.md +2 -6
  99. package/pp-core/templates/practices/README.md +20 -23
  100. package/pp-core/workflows/_runtime-launcher.snippet.sh +0 -0
  101. package/pp-core/workflows/add-tests.md +55 -4
  102. package/pp-core/workflows/audit-fix.md +63 -2
  103. package/pp-core/workflows/audit-milestone.md +1 -1
  104. package/pp-core/workflows/autonomous.md +85 -11
  105. package/pp-core/workflows/check-todos.md +13 -2
  106. package/pp-core/workflows/code-review-fix.md +59 -3
  107. package/pp-core/workflows/code-review.md +10 -1
  108. package/pp-core/workflows/complete-milestone.md +1 -1
  109. package/pp-core/workflows/debug.md +54 -4
  110. package/pp-core/workflows/discovery-sprint/prefill.md +19 -7
  111. package/pp-core/workflows/discovery-sprint/prototype.md +46 -49
  112. package/pp-core/workflows/discovery-sprint/session-13-gates.md +2 -0
  113. package/pp-core/workflows/discovery-sprint/sessions/01-kick-off.md +1 -3
  114. package/pp-core/workflows/discovery-sprint/sessions/02-as-is.md +1 -3
  115. package/pp-core/workflows/discovery-sprint/sessions/03-to-be.md +1 -3
  116. package/pp-core/workflows/discovery-sprint/sessions/04-ux-design.md +20 -24
  117. package/pp-core/workflows/discovery-sprint/sessions/05-architecture.md +1 -3
  118. package/pp-core/workflows/discovery-sprint/sessions/06-security.md +1 -3
  119. package/pp-core/workflows/discovery-sprint/sessions/07-identity.md +1 -3
  120. package/pp-core/workflows/discovery-sprint/sessions/08-integration.md +1 -3
  121. package/pp-core/workflows/discovery-sprint/sessions/09-qa.md +1 -3
  122. package/pp-core/workflows/discovery-sprint/sessions/10-infrastructure.md +1 -6
  123. package/pp-core/workflows/discovery-sprint/sessions/11-roadmap.md +1 -3
  124. package/pp-core/workflows/discovery-sprint/sessions/12-delivery-model.md +1 -3
  125. package/pp-core/workflows/discovery-sprint/sessions/13-wrap-up.md +1 -3
  126. package/pp-core/workflows/discovery-sprint/templates/context-template.md +1 -1
  127. package/pp-core/workflows/discovery-sprint/vault-context.md +213 -0
  128. package/pp-core/workflows/discovery-sprint.md +7 -3
  129. package/pp-core/workflows/discovery-to-build/steps/architecture-deliverables.md +4 -4
  130. package/pp-core/workflows/discovery-to-build/templates/pp-handoff.md +43 -1
  131. package/pp-core/workflows/discovery-to-build.md +10 -2
  132. package/pp-core/workflows/discuss-phase.md +3 -10
  133. package/pp-core/workflows/execute-phase/steps/check-query-gate.md +329 -0
  134. package/pp-core/workflows/execute-phase/steps/client-context-gate.md +3 -2
  135. package/pp-core/workflows/execute-phase/steps/cross-ai-delegation.md +1 -1
  136. package/pp-core/workflows/execute-phase/steps/execute-pre-dispatch.md +98 -0
  137. package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  138. package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +6 -8
  139. package/pp-core/workflows/execute-phase/steps/vault-fetch.md +115 -14
  140. package/pp-core/workflows/execute-phase/steps/vault-load-gate.md +322 -20
  141. package/pp-core/workflows/execute-phase/steps/verifier-practice-payload.md +165 -0
  142. package/pp-core/workflows/execute-phase/steps/verify-post-gate.md +163 -0
  143. package/pp-core/workflows/execute-phase.md +155 -128
  144. package/pp-core/workflows/execute-plan.md +56 -6
  145. package/pp-core/workflows/fast.md +53 -4
  146. package/pp-core/workflows/help/modes/full.md +3 -3
  147. package/pp-core/workflows/init/steps/client-context-capture.md +101 -0
  148. package/pp-core/workflows/init/steps/gitlab-provisioning.md +130 -0
  149. package/pp-core/workflows/init/steps/project-md-deferral-narration.md +66 -0
  150. package/pp-core/workflows/init/steps/reachability-outcome.md +70 -0
  151. package/pp-core/workflows/init.md +232 -272
  152. package/pp-core/workflows/new-project.md +31 -23
  153. package/pp-core/workflows/plan-phase.md +98 -45
  154. package/pp-core/workflows/quick.md +117 -3
  155. package/pp-core/workflows/secure-phase.md +1 -1
  156. package/pp-core/workflows/ship.md +57 -28
  157. package/pp-core/workflows/undo.md +1 -1
  158. package/pp-core/workflows/update.md +3 -3
  159. package/pp-core/workflows/validate-phase.md +58 -3
  160. package/pp-core/workflows/vault-review.md +282 -22
  161. package/pp-core/workflows/verify-work.md +12 -14
  162. package/scripts/changeset/cli.cjs +6 -5
  163. package/scripts/changeset/lint.cjs +0 -0
  164. package/scripts/changeset/new.cjs +33 -50
  165. package/scripts/dev-env.cjs +25 -85
  166. package/scripts/gen-capability-registry.cjs +199 -11
  167. package/scripts/gen-practice-arithmetic-contract.cjs +412 -0
  168. package/scripts/lib/allowlist-ratchet.cjs +1 -103
  169. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -2
  170. package/scripts/lint-docs-required.cjs +0 -0
  171. package/scripts/lint-pr-check-project-dir.cjs +1 -3
  172. package/scripts/lint-test-file-count.allowlist.json +12 -10
  173. package/scripts/practice-arithmetic-contract.allow.json +35 -0
  174. package/scripts/prompt-injection-scan.sh +22 -17
  175. package/scripts/record-vault-mode-golden.cjs +89 -0
  176. package/scripts/release-channel.cjs +0 -0
  177. package/scripts/sync-manifest-versions.cjs +5 -4
  178. package/scripts/sync-rulesets.sh +1 -1
  179. package/scripts/update-size-baseline.cjs +30 -274
  180. package/scripts/vault-calibrate.cjs +996 -0
  181. package/scripts/verify-opengsd-sweep.cjs +3 -5
  182. package/scripts/workflow-size.cjs +9 -61
  183. package/pp-core/bin/lib/dispatch-plan.cjs +0 -483
  184. package/pp-core/bin/lib/install-run.cjs +0 -536
  185. package/pp-core/bin/lib/loop-gates.cjs +0 -213
  186. package/pp-core/bin/lib/phase-manifest.cjs +0 -527
  187. package/pp-core/bin/lib/phase-tier.cjs +0 -480
  188. package/pp-core/bin/lib/plan-graph.cjs +0 -368
  189. package/pp-core/references/executor-vault-trace.md +0 -47
  190. package/pp-core/references/planner-plan-graph.md +0 -66
  191. package/pp-core/workflows/discovery-sprint/vault-fetch.md +0 -37
  192. package/pp-core/workflows/execute-phase/steps/checkpoint-handling.md +0 -45
  193. package/pp-core/workflows/execute-phase/steps/install-run.md +0 -29
  194. package/pp-core/workflows/execute-phase/steps/phase-close-rebaseline.md +0 -23
  195. package/pp-core/workflows/execute-phase/steps/serial-group-dispatch.md +0 -73
  196. package/pp-core/workflows/execute-phase/steps/vault-door-gate.md +0 -19
  197. package/pp-core/workflows/plan-phase/steps/phase-tier.md +0 -43
  198. package/scripts/lib/size-budget.cjs +0 -311
  199. package/scripts/lint-neutrality-names.cjs +0 -694
  200. package/scripts/lint-org-coordinates.allowlist.json +0 -35
  201. package/scripts/lint-org-coordinates.cjs +0 -426
@@ -118,15 +118,88 @@ function renderComposeConfirm(prompter, info) {
118
118
  async function runInitInteractive(cwd, prompter, opts = {}) {
119
119
  const sessionOpts = { offline: opts.offline === true, _globalRoot: opts._globalRoot };
120
120
  let wroteBinding = false;
121
+ // PBI 74299: answers the session filled in itself are shown once each, as
122
+ // soon as they are decided, so the operator sees every value before the
123
+ // compose confirmation.
124
+ const shownAutoAnswers = new Set();
121
125
  for (let steps = 1; steps <= MAX_SESSION_STEPS; steps++) {
122
126
  const state = (0, init_contract_cjs_1.initSessionNext)(cwd, sessionOpts);
123
127
  if (state.error !== undefined) {
124
128
  prompter.print(`Error: ${state.message ?? state.error}`);
125
129
  return { ok: false, wroteBinding, steps, violations: [] };
126
130
  }
131
+ for (const auto of state.autoAnswered ?? []) {
132
+ if (shownAutoAnswers.has(auto.id))
133
+ continue;
134
+ shownAutoAnswers.add(auto.id);
135
+ const why = auto.source === 'derived' ? 'derived' : 'set by the org profile';
136
+ prompter.print(` ${auto.id} = ${auto.value} (${why})`);
137
+ }
127
138
  if (state.done) {
128
139
  if (wroteBinding) {
129
- prompter.print('Done — .platform-bindings.json was composed and written.');
140
+ // OD-1: the done line names the capability the session just armed and
141
+ // the step that is now live, so an operator is not left to discover
142
+ // either from the config file.
143
+ //
144
+ // 07-09 (WR-07): a READING, not a claim. The arming write happens
145
+ // only on an ABSENT key, so an operator's explicit `false` — and a
146
+ // hand-edited non-boolean — are still there when the session ends.
147
+ // Printing the armed line over either of those would make the last
148
+ // line `pp-tools init` prints contradict the config file it just
149
+ // finished writing, which is precisely the
150
+ // tool-reports-a-state-that-isn't-real failure this phase exists to
151
+ // end.
152
+ const vaultState = (0, init_contract_cjs_1.readVaultEnabledState)(cwd).state;
153
+ if (vaultState === 'off') {
154
+ prompter.print('Done — .platform-bindings.json was composed and written; vault.enabled was left at false ' +
155
+ 'as this project set it, so the vault capability stays off and /pp-init Step 2.6 stays ' +
156
+ 'inert (arm it with pp-tools config-set vault.enabled true).');
157
+ }
158
+ else if (vaultState === 'malformed') {
159
+ prompter.print('Done — .platform-bindings.json was composed and written; vault.enabled holds a non-boolean ' +
160
+ 'value and was left untouched — pp-tools query init-contract --verify reports it as ' +
161
+ 'INIT_VAULT_ENABLED_MALFORMED; store the boolean with pp-tools config-set vault.enabled true.');
162
+ }
163
+ else if (vaultState === 'armed') {
164
+ // Quick 260915-lmc: vault.practices_enabled is armed beside it under
165
+ // the same absent-only rule, so the line names it only when the
166
+ // READING says true — an explicit false is the project's choice and
167
+ // is not contradicted here.
168
+ const practicesArmed = (0, init_contract_cjs_1.readVaultPracticesEnabledState)(cwd).state === 'armed';
169
+ // Quick 260916-s5n: vault.required is named only when the READING
170
+ // says armed, by the same rule — an explicit false is the project's
171
+ // choice and the last line printed must not contradict it.
172
+ const requiredArmed = (0, init_contract_cjs_1.readVaultRequiredState)(cwd).state === 'armed';
173
+ // Built as a head plus two OPTIONAL clauses carrying no terminator
174
+ // of their own, with exactly one full stop appended at the end. The
175
+ // stop used to live inside the practices branch, which made every
176
+ // further clause a sentence continuing past its own period.
177
+ const head = 'Done — .platform-bindings.json was composed and written; vault.enabled is now true ' +
178
+ '(the vault capability is armed — /pp-init Step 2.6 probes reachability next)';
179
+ // 15-REVIEW WR-09: in standards mode no phase records practices (the
180
+ // practices planner fragment and trace gates are filtered out), so the
181
+ // clause names what IS recorded and checked there, whatever the
182
+ // practices switch reads.
183
+ const practicesClause = (0, init_contract_cjs_1.readVaultStandardsModeActive)(cwd)
184
+ ? '; vault.mode is standards, so each plan records which client standards documents governed it ' +
185
+ '(<vault_standards>), checked by the vault.trace gate'
186
+ : practicesArmed
187
+ ? '; vault.practices_enabled is true, so each phase records which client vault practices it applied'
188
+ : '';
189
+ const requiredClause = requiredArmed
190
+ ? '; vault.required is true, so a client vault miss, a failed fetch or an unwritable vault summary ' +
191
+ 'stops the build at plan:pre and execute:pre'
192
+ : '';
193
+ prompter.print(head + practicesClause + requiredClause + '.');
194
+ }
195
+ else {
196
+ // 'absent' — unreachable after an approved compose (the arming
197
+ // write fires on exactly this state), kept defensive for the case
198
+ // where that write itself failed. It says only what is certain:
199
+ // the binding was written, and it does NOT claim the capability is
200
+ // on, because the key is not there to say so.
201
+ prompter.print('Done — .platform-bindings.json was composed and written.');
202
+ }
130
203
  }
131
204
  else if (typeof state.info === 'string') {
132
205
  prompter.print(state.info);
@@ -168,9 +241,8 @@ async function runInitInteractive(cwd, prompter, opts = {}) {
168
241
  preselectedLabel: state.preselectedLabel,
169
242
  optionalAnswer: state.optionalAnswer,
170
243
  });
171
- // A detected org profile is a hint, never a default: the driver has no
172
- // default-acceptance path, and the answer goes to initSessionAnswer
173
- // verbatim, which owns the none/blank decline.
244
+ // UAT-13-F2: the driver has no default-acceptance path, on purpose — the
245
+ // answer goes to initSessionAnswer verbatim, which owns the none/blank decline.
174
246
  const result = (0, init_contract_cjs_1.initSessionAnswer)(cwd, stepId, answer, sessionOpts);
175
247
  if (result.ok) {
176
248
  if (stepId === 'compose_confirm') {
@@ -32,7 +32,6 @@ const worktreeSafety = require("./worktree-safety.cjs");
32
32
  // eslint-disable-next-line @typescript-eslint/no-require-imports -- planning-workspace.cjs is an export= CommonJS module
33
33
  const planningWorkspace = require("./planning-workspace.cjs");
34
34
  const secrets_cjs_1 = require("./secrets.cjs");
35
- const phase_tier_cjs_1 = require("./phase-tier.cjs");
36
35
  // eslint-disable-next-line @typescript-eslint/no-require-imports -- plan-scan.cjs is an export= CommonJS module
37
36
  const scanPhasePlans = require("./plan-scan.cjs");
38
37
  const state_document_cjs_1 = require("./state-document.cjs");
@@ -189,7 +188,8 @@ function getInitGitState(cwd) {
189
188
  * Quick 261007-jkl, D2 (todo "init execute-phase returns null phase_dir for an
190
189
  * archived phase") put the "is this archived match the current milestone's?"
191
190
  * compare HERE, for these four verbs only; every other consumer of the raw
192
- * locator kept the archive fall-through with no compare. The decision now lives in ONE owner, src/phase-scope.cts, which
191
+ * locator kept the archive fall-through with no compare (PBI 75323, quick
192
+ * 261009-gvf). The decision now lives in ONE owner, src/phase-scope.cts, which
193
193
  * every consumer shares: a phase archived in the CURRENT milestone keeps its
194
194
  * match, directory and artifacts; a PRIOR milestone's archived phase whose
195
195
  * number the current ROADMAP reuses is dropped (the pins in tests/init.test.cjs
@@ -222,26 +222,6 @@ function resolvePhaseForInit(cwd, phase) {
222
222
  }
223
223
  return { phaseInfo, roadmapPhase };
224
224
  }
225
- /**
226
- * The phase's resolved ceremony tier for an init payload (src/phase-tier.cts).
227
- * Init's gate booleans (`research_enabled`, `plan_checker_enabled`,
228
- * `verifier_enabled`, …) are read from this, never from raw config, so a
229
- * workflow that reads init reads the tier-resolved set.
230
- */
231
- function initPhaseTier(cwd, phase, options) {
232
- const flag = options['tier'];
233
- let cli = null;
234
- if (typeof flag === 'string') {
235
- const v = flag.trim().toLowerCase();
236
- if (!(0, phase_tier_cjs_1.isPhaseTier)(v))
237
- error(`--tier needs one of ${phase_tier_cjs_1.PHASE_TIERS.join(', ')}`);
238
- cli = v;
239
- }
240
- return (0, phase_tier_cjs_1.resolvePhaseTierForProject)(cwd, phase, cli);
241
- }
242
- function phaseTierSummary(t) {
243
- return { tier: t.tier, source: t.source, gates: t.gates, suppressed: t.suppressed };
244
- }
245
225
  function cmdInitExecutePhase(cwd, phase, raw, options = {}) {
246
226
  if (!phase) {
247
227
  error('phase required for init execute-phase');
@@ -255,7 +235,6 @@ function cmdInitExecutePhase(cwd, phase, raw, options = {}) {
255
235
  : null;
256
236
  const phase_req_ids = reqExtracted && reqExtracted !== 'TBD' ? reqExtracted : null;
257
237
  const wf = (config.workflow ?? {});
258
- const tier = initPhaseTier(cwd, phase, options);
259
238
  const result = {
260
239
  executor_model: resolveModelInternal(cwd, 'pp-executor'),
261
240
  verifier_model: resolveModelInternal(cwd, 'pp-verifier'),
@@ -267,12 +246,7 @@ function cmdInitExecutePhase(cwd, phase, raw, options = {}) {
267
246
  branching_strategy: config.branching_strategy,
268
247
  phase_branch_template: config.phase_branch_template,
269
248
  milestone_branch_template: config.milestone_branch_template,
270
- verifier_enabled: tier.gates.verifier,
271
- code_review_enabled: tier.gates.code_review,
272
- security_enforcement_enabled: tier.gates.security_enforcement,
273
- nyquist_validation_enabled: tier.gates.nyquist_validation,
274
- install_verification_enabled: tier.gates.install_verification,
275
- phase_tier: phaseTierSummary(tier),
249
+ verifier_enabled: config.verifier,
276
250
  phase_found: !!phaseInfo,
277
251
  phase_dir: phaseInfo?.['directory'] || null,
278
252
  phase_number: phaseInfo?.['phase_number'] || null,
@@ -357,22 +331,15 @@ function cmdInitPlanPhase(cwd, phase, raw, options = {}) {
357
331
  assertValidGranularityOverride(granularityOverride, error);
358
332
  const granularity = resolveGranularityInternal(cwd, 'planning', granularityOverride || undefined);
359
333
  const wf = (config.workflow ?? {});
360
- const tier = initPhaseTier(cwd, phase, options);
361
334
  const result = {
362
335
  researcher_model: resolveModelInternal(cwd, 'pp-phase-researcher'),
363
336
  planner_model: resolveModelInternal(cwd, 'pp-planner'),
364
337
  checker_model: resolveModelInternal(cwd, 'pp-plan-checker'),
365
338
  tdd_mode: options['tdd'] || Boolean(wf['tdd_mode']) || false,
366
339
  granularity,
367
- research_enabled: tier.gates.research,
368
- plan_checker_enabled: tier.gates.plan_check,
369
- plan_check_passes: tier.gates.plan_check_passes,
370
- nyquist_validation_enabled: tier.gates.nyquist_validation,
371
- pattern_mapper_enabled: tier.gates.pattern_mapper,
372
- post_planning_gaps_enabled: tier.gates.post_planning_gaps,
373
- security_enforcement_enabled: tier.gates.security_enforcement,
374
- plan_bounce_enabled: tier.gates.plan_bounce,
375
- phase_tier: phaseTierSummary(tier),
340
+ research_enabled: wf['research'],
341
+ plan_checker_enabled: config.plan_checker,
342
+ nyquist_validation_enabled: wf['nyquist_validation'],
376
343
  commit_docs: config.commit_docs,
377
344
  text_mode: config.text_mode,
378
345
  auto_advance: !!(config.auto_advance),
@@ -603,10 +570,14 @@ function cmdInitNewMilestone(cwd, raw) {
603
570
  };
604
571
  output(withProjectRoot(cwd, result), raw);
605
572
  }
606
- function cmdInitQuick(cwd, description, raw) {
607
- const config = loadConfig(cwd);
608
- const now = new Date();
609
- const slug = description ? generateSlugInternal(description)?.substring(0, 40) : null;
573
+ /**
574
+ * The quick-task id for a moment: `yymmdd` + `-` + the two-second block of the
575
+ * local day in base 36, padded to three (`261011-8yt`). A pure function of
576
+ * `now`, extracted verbatim from `cmdInitQuick` (16-05, D-29) so the plan-id
577
+ * owner (`SCAFFOLD_PLAN_ID_RE`, src/vault-standards.cts) is tested over ids the
578
+ * engine itself builds, all-digit and lettered, rather than over hand-typed ones.
579
+ */
580
+ function buildQuickId(now) {
610
581
  const yy = String(now.getFullYear()).slice(-2);
611
582
  const mm = String(now.getMonth() + 1).padStart(2, '0');
612
583
  const dd = String(now.getDate()).padStart(2, '0');
@@ -614,7 +585,13 @@ function cmdInitQuick(cwd, description, raw) {
614
585
  const secondsSinceMidnight = now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds();
615
586
  const timeBlocks = Math.floor(secondsSinceMidnight / 2);
616
587
  const timeEncoded = timeBlocks.toString(36).padStart(3, '0');
617
- const quickId = dateStr + '-' + timeEncoded;
588
+ return dateStr + '-' + timeEncoded;
589
+ }
590
+ function cmdInitQuick(cwd, description, raw) {
591
+ const config = loadConfig(cwd);
592
+ const now = new Date();
593
+ const slug = description ? generateSlugInternal(description)?.substring(0, 40) : null;
594
+ const quickId = buildQuickId(now);
618
595
  const branchSlug = slug || 'quick';
619
596
  const quickBranchName = config.quick_branch_template
620
597
  ? config.quick_branch_template
@@ -676,22 +653,16 @@ function cmdInitResume(cwd, raw) {
676
653
  };
677
654
  output(withProjectRoot(cwd, result), raw);
678
655
  }
679
- function cmdInitVerifyWork(cwd, phase, raw, options = {}) {
656
+ function cmdInitVerifyWork(cwd, phase, raw) {
680
657
  if (!phase) {
681
658
  error('phase required for init verify-work');
682
659
  }
683
660
  const config = loadConfig(cwd);
684
661
  const { phaseInfo } = resolvePhaseForInit(cwd, phase);
685
- const tier = initPhaseTier(cwd, phase, options);
686
662
  const result = {
687
663
  planner_model: resolveModelInternal(cwd, 'pp-planner'),
688
664
  checker_model: resolveModelInternal(cwd, 'pp-plan-checker'),
689
665
  commit_docs: config.commit_docs,
690
- plan_checker_enabled: tier.gates.plan_check,
691
- plan_check_passes: tier.gates.plan_check_passes,
692
- security_enforcement_enabled: tier.gates.security_enforcement,
693
- nyquist_validation_enabled: tier.gates.nyquist_validation,
694
- phase_tier: phaseTierSummary(tier),
695
666
  phase_found: !!phaseInfo,
696
667
  phase_dir: phaseInfo?.['directory'] || null,
697
668
  phase_number: phaseInfo?.['phase_number'] || null,
@@ -1882,6 +1853,8 @@ module.exports = {
1882
1853
  cmdInitNewProject,
1883
1854
  cmdInitNewMilestone,
1884
1855
  cmdInitQuick,
1856
+ // 16-05 (D-29): the pure quick-id builder, so the plan-id owner is tested over real ids.
1857
+ buildQuickId,
1885
1858
  cmdInitIngestDocs,
1886
1859
  cmdInitResume,
1887
1860
  cmdInitVerifyWork,
@@ -27,7 +27,7 @@ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs")
27
27
  */
28
28
  const PROFILES = Object.freeze({
29
29
  core: Object.freeze([
30
- // init is the front door every installer/hook/no-project message
30
+ // PBI 75232: init is the front door every installer/hook/no-project message
31
31
  // names, so it ships in every profile — a minimal install must not print a
32
32
  // start command it did not install.
33
33
  'init',
@@ -187,6 +187,12 @@ const ERROR_REASON = Object.freeze({
187
187
  VAULT_PROMOTE_TARGET_REFUSED: 'vault_promote_target_refused',
188
188
  VAULT_PROMOTE_CONCURRENT_EDIT: 'vault_promote_concurrent_edit',
189
189
  VAULT_PROMOTE_TRANSPORT_FAILED: 'vault_promote_transport_failed',
190
+ // vault.mode (Vault Assurance 13-03, D-08/D-14): an unrecognised mode value,
191
+ // and the standards-mode promote refusal
192
+ VAULT_MODE_INVALID: 'vault_mode_invalid',
193
+ // 13-REVIEW WR-01: the mode resolver failed; refused like an invalid value
194
+ VAULT_MODE_UNRESOLVED: 'vault_mode_unresolved',
195
+ VAULT_PROMOTE_NOT_APPLICABLE: 'vault_promote_not_applicable',
190
196
  // discovery rollup (discovery-v2 Phase 1: D-07/D-08 gate)
191
197
  DISCOVERY_ROLLUP_PARSE_FAILED: 'discovery_rollup_parse_failed',
192
198
  DISCOVERY_ROLLUP_MISMATCH: 'discovery_rollup_mismatch',
@@ -201,6 +207,8 @@ const ERROR_REASON = Object.freeze({
201
207
  DISCOVERY_ELEMENT_SWEEP_FAILED: 'discovery_element_sweep_failed',
202
208
  // discovery scope re-baselining (discovery-v2 Phase 5: D-72/D-73 gate)
203
209
  DISCOVERY_REBASELINE_CHECK_FAILED: 'discovery_rebaseline_check_failed',
210
+ // discovery vault context record (PBI 75336)
211
+ DISCOVERY_VAULT_CHECK_FAILED: 'discovery_vault_check_failed',
204
212
  // generic
205
213
  USAGE: 'usage',
206
214
  UNKNOWN: 'unknown',