@pareto4/pp-core 1.13.0 → 1.18.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 (204) hide show
  1. package/.claude-plugin/plugin.json +3 -3
  2. package/README.md +31 -12
  3. package/agents/pp-code-fixer.md +0 -11
  4. package/agents/pp-code-reviewer.md +1 -77
  5. package/agents/pp-debug-session-manager.md +9 -6
  6. package/agents/pp-executor.md +12 -29
  7. package/agents/pp-plan-checker.md +4 -4
  8. package/agents/pp-planner.md +34 -20
  9. package/agents/pp-vault-reviewer.md +100 -23
  10. package/agents/pp-verifier.md +1 -3
  11. package/bin/install.js +10 -3
  12. package/commands/pp-execute-phase.md +1 -3
  13. package/commands/pp-ns-manage.md +1 -1
  14. package/commands/pp-ns-review.md +1 -1
  15. package/commands/pp-plan-phase.md +1 -2
  16. package/commands/pp-vault-promote.md +7 -8
  17. package/commands/pp-vault-review.md +6 -5
  18. package/commands/pp-verify-work.md +1 -2
  19. package/gemini-extension.json +1 -1
  20. package/hooks/dist/pp-check-update.js +0 -0
  21. package/hooks/dist/pp-cursor-session-start.js +1 -1
  22. package/hooks/dist/pp-statusline.js +1 -1
  23. package/hooks/dist/pp-update-banner.js +0 -0
  24. package/hooks/pp-check-update.js +0 -0
  25. package/hooks/pp-cursor-session-start.js +1 -1
  26. package/hooks/pp-statusline.js +1 -1
  27. package/hooks/pp-update-banner.js +0 -0
  28. package/package.json +10 -18
  29. package/pareto-skills/_shared/create-project-board.sh +0 -0
  30. package/pareto-skills/pp-project-setup/SKILL.md +1 -1
  31. package/pp-core/bin/check-latest-version.cjs +0 -0
  32. package/pp-core/bin/detect-build-commands.sh +2 -2
  33. package/pp-core/bin/lib/capability-activation.cjs +83 -9
  34. package/pp-core/bin/lib/capability-registry.cjs +201 -229
  35. package/pp-core/bin/lib/capability-state.cjs +93 -1
  36. package/pp-core/bin/lib/capability-writer.cjs +3 -3
  37. package/pp-core/bin/lib/check-command-router.cjs +1906 -1514
  38. package/pp-core/bin/lib/clusters.cjs +3 -0
  39. package/pp-core/bin/lib/command-aliases.cjs +0 -35
  40. package/pp-core/bin/lib/commands.cjs +9 -4
  41. package/pp-core/bin/lib/compose-bindings.cjs +251 -88
  42. package/pp-core/bin/lib/config-loader.cjs +7 -103
  43. package/pp-core/bin/lib/config-schema.cjs +1 -1
  44. package/pp-core/bin/lib/config.cjs +151 -62
  45. package/pp-core/bin/lib/decisions.cjs +4 -4
  46. package/pp-core/bin/lib/discovery-vault-check.cjs +246 -0
  47. package/pp-core/bin/lib/frontmatter.cjs +1 -38
  48. package/pp-core/bin/lib/git-base-branch.cjs +11 -12
  49. package/pp-core/bin/lib/git-provider.cjs +9 -10
  50. package/pp-core/bin/lib/init-command-router.cjs +5 -8
  51. package/pp-core/bin/lib/init-contract.cjs +620 -738
  52. package/pp-core/bin/lib/init-interactive.cjs +62 -4
  53. package/pp-core/bin/lib/init.cjs +24 -51
  54. package/pp-core/bin/lib/install-profiles.cjs +1 -1
  55. package/pp-core/bin/lib/io.cjs +4 -2
  56. package/pp-core/bin/lib/loop-resolver.cjs +165 -129
  57. package/pp-core/bin/lib/org-profile.cjs +402 -161
  58. package/pp-core/bin/lib/package-identity.cjs +3 -3
  59. package/pp-core/bin/lib/phase-command-router.cjs +1 -29
  60. package/pp-core/bin/lib/phase-scope.cjs +1 -1
  61. package/pp-core/bin/lib/phase.cjs +11 -253
  62. package/pp-core/bin/lib/platform-bindings.cjs +40 -19
  63. package/pp-core/bin/lib/profile-output.cjs +1 -1
  64. package/pp-core/bin/lib/shell-command-projection.cjs +104 -1
  65. package/pp-core/bin/lib/state.cjs +11 -85
  66. package/pp-core/bin/lib/template.cjs +1 -1
  67. package/pp-core/bin/lib/vault-command-router.cjs +1682 -477
  68. package/pp-core/bin/lib/vault-coordinates.cjs +16 -7
  69. package/pp-core/bin/lib/vault-index.cjs +656 -0
  70. package/pp-core/bin/lib/vault-seal.cjs +1851 -0
  71. package/pp-core/bin/lib/vault-standards-promote.cjs +577 -0
  72. package/pp-core/bin/lib/vault-standards-review.cjs +293 -0
  73. package/pp-core/bin/lib/vault-standards.cjs +1504 -0
  74. package/pp-core/bin/lib/vault-trace.cjs +155 -2778
  75. package/pp-core/bin/lib/vault-update.cjs +10 -59
  76. package/pp-core/bin/lib/vault.cjs +2570 -950
  77. package/pp-core/bin/lib/verify.cjs +0 -11
  78. package/pp-core/bin/portable-timeout.sh +1 -1
  79. package/pp-core/bin/pp-tools.cjs +157 -54
  80. package/pp-core/bin/shared/config-defaults.manifest.json +0 -7
  81. package/pp-core/bin/shared/config-schema.manifest.json +0 -3
  82. package/pp-core/bin/shared/model-catalog.json +2 -2
  83. package/pp-core/bin/verify-reapply-patches.cjs +0 -0
  84. package/pp-core/org-profile.json +26 -0
  85. package/pp-core/references/autonomous-best-effort.md +8 -7
  86. package/pp-core/references/loop-hook-dispatch.md +0 -25
  87. package/pp-core/references/planner-gap-closure.md +0 -1
  88. package/pp-core/references/planner-tdd.md +0 -1
  89. package/pp-core/references/planner-vault-standards.md +311 -0
  90. package/pp-core/references/planning-config.md +0 -8
  91. package/pp-core/references/tdd.md +0 -1
  92. package/pp-core/templates/README.md +1 -0
  93. package/pp-core/templates/VAULT-REVIEW.md +56 -0
  94. package/pp-core/templates/phase-prompt.md +2 -6
  95. package/pp-core/workflows/_runtime-launcher.snippet.sh +0 -0
  96. package/pp-core/workflows/add-tests.md +55 -4
  97. package/pp-core/workflows/audit-fix.md +63 -2
  98. package/pp-core/workflows/audit-milestone.md +1 -1
  99. package/pp-core/workflows/autonomous.md +85 -11
  100. package/pp-core/workflows/check-todos.md +13 -2
  101. package/pp-core/workflows/code-review-fix.md +59 -3
  102. package/pp-core/workflows/code-review.md +10 -57
  103. package/pp-core/workflows/complete-milestone.md +1 -1
  104. package/pp-core/workflows/debug.md +54 -4
  105. package/pp-core/workflows/discovery-sprint/prefill.md +19 -7
  106. package/pp-core/workflows/discovery-sprint/prototype.md +46 -49
  107. package/pp-core/workflows/discovery-sprint/session-13-gates.md +2 -0
  108. package/pp-core/workflows/discovery-sprint/sessions/01-kick-off.md +1 -3
  109. package/pp-core/workflows/discovery-sprint/sessions/02-as-is.md +1 -3
  110. package/pp-core/workflows/discovery-sprint/sessions/03-to-be.md +1 -3
  111. package/pp-core/workflows/discovery-sprint/sessions/04-ux-design.md +20 -24
  112. package/pp-core/workflows/discovery-sprint/sessions/05-architecture.md +1 -3
  113. package/pp-core/workflows/discovery-sprint/sessions/06-security.md +1 -3
  114. package/pp-core/workflows/discovery-sprint/sessions/07-identity.md +1 -3
  115. package/pp-core/workflows/discovery-sprint/sessions/08-integration.md +1 -3
  116. package/pp-core/workflows/discovery-sprint/sessions/09-qa.md +1 -3
  117. package/pp-core/workflows/discovery-sprint/sessions/10-infrastructure.md +1 -6
  118. package/pp-core/workflows/discovery-sprint/sessions/11-roadmap.md +1 -3
  119. package/pp-core/workflows/discovery-sprint/sessions/12-delivery-model.md +1 -3
  120. package/pp-core/workflows/discovery-sprint/sessions/13-wrap-up.md +1 -3
  121. package/pp-core/workflows/discovery-sprint/templates/context-template.md +1 -1
  122. package/pp-core/workflows/discovery-sprint/vault-context.md +207 -0
  123. package/pp-core/workflows/discovery-sprint.md +7 -3
  124. package/pp-core/workflows/discovery-to-build/steps/architecture-deliverables.md +4 -4
  125. package/pp-core/workflows/discovery-to-build/templates/pp-handoff.md +43 -1
  126. package/pp-core/workflows/discovery-to-build.md +10 -2
  127. package/pp-core/workflows/discuss-phase.md +3 -10
  128. package/pp-core/workflows/execute-phase/steps/check-query-gate.md +327 -0
  129. package/pp-core/workflows/execute-phase/steps/client-context-gate.md +3 -2
  130. package/pp-core/workflows/execute-phase/steps/cross-ai-delegation.md +1 -1
  131. package/pp-core/workflows/execute-phase/steps/execute-pre-dispatch.md +78 -0
  132. package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  133. package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +6 -8
  134. package/pp-core/workflows/execute-phase/steps/vault-fetch.md +115 -14
  135. package/pp-core/workflows/execute-phase/steps/vault-load-gate.md +219 -20
  136. package/pp-core/workflows/execute-phase/steps/verify-post-gate.md +147 -0
  137. package/pp-core/workflows/execute-phase.md +152 -128
  138. package/pp-core/workflows/execute-plan.md +54 -6
  139. package/pp-core/workflows/fast.md +53 -4
  140. package/pp-core/workflows/help/modes/full.md +3 -3
  141. package/pp-core/workflows/init/steps/client-context-capture.md +101 -0
  142. package/pp-core/workflows/init/steps/gitlab-provisioning.md +130 -0
  143. package/pp-core/workflows/init/steps/project-md-deferral-narration.md +66 -0
  144. package/pp-core/workflows/init/steps/reachability-outcome.md +70 -0
  145. package/pp-core/workflows/init.md +232 -272
  146. package/pp-core/workflows/new-project.md +31 -23
  147. package/pp-core/workflows/plan-phase.md +98 -45
  148. package/pp-core/workflows/quick.md +117 -3
  149. package/pp-core/workflows/secure-phase.md +1 -1
  150. package/pp-core/workflows/ship.md +57 -28
  151. package/pp-core/workflows/undo.md +1 -1
  152. package/pp-core/workflows/update.md +3 -3
  153. package/pp-core/workflows/validate-phase.md +58 -3
  154. package/pp-core/workflows/vault-review.md +161 -23
  155. package/pp-core/workflows/vault-write-back.md +73 -110
  156. package/pp-core/workflows/verify-work.md +12 -14
  157. package/scripts/changeset/cli.cjs +6 -5
  158. package/scripts/changeset/lint.cjs +0 -0
  159. package/scripts/changeset/new.cjs +33 -50
  160. package/scripts/dev-env.cjs +25 -85
  161. package/scripts/gen-capability-registry.cjs +120 -13
  162. package/scripts/lib/allowlist-ratchet.cjs +1 -103
  163. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -2
  164. package/scripts/lint-docs-required.cjs +0 -0
  165. package/scripts/lint-pr-check-project-dir.cjs +1 -3
  166. package/scripts/lint-test-file-count.allowlist.json +3 -19
  167. package/scripts/lint-test-file-count.cjs +5 -6
  168. package/scripts/prompt-injection-scan.sh +19 -17
  169. package/scripts/release-channel.cjs +0 -0
  170. package/scripts/sync-manifest-versions.cjs +5 -4
  171. package/scripts/sync-rulesets.sh +1 -1
  172. package/scripts/update-size-baseline.cjs +30 -274
  173. package/scripts/verify-opengsd-sweep.cjs +3 -5
  174. package/scripts/workflow-size.cjs +9 -61
  175. package/pp-core/bin/lib/dispatch-plan.cjs +0 -483
  176. package/pp-core/bin/lib/install-run.cjs +0 -536
  177. package/pp-core/bin/lib/loop-gates.cjs +0 -213
  178. package/pp-core/bin/lib/phase-manifest.cjs +0 -527
  179. package/pp-core/bin/lib/phase-tier.cjs +0 -480
  180. package/pp-core/bin/lib/plan-graph.cjs +0 -368
  181. package/pp-core/bin/lib/practices-review-check.cjs +0 -938
  182. package/pp-core/bin/lib/vault-audit.cjs +0 -2070
  183. package/pp-core/bin/lib/vault-practices.cjs +0 -1990
  184. package/pp-core/bin/lib/vault-review.cjs +0 -2359
  185. package/pp-core/bin/lib/vault-write-back.cjs +0 -877
  186. package/pp-core/references/executor-vault-trace.md +0 -47
  187. package/pp-core/references/planner-plan-graph.md +0 -66
  188. package/pp-core/references/planner-vault-practices.md +0 -112
  189. package/pp-core/templates/practices/README.md +0 -251
  190. package/pp-core/templates/practices/error-handling.md +0 -18
  191. package/pp-core/templates/practices/minimal-comments.md +0 -14
  192. package/pp-core/templates/practices/naming-convention.md +0 -18
  193. package/pp-core/templates/practices/practice-template.md +0 -23
  194. package/pp-core/workflows/discovery-sprint/vault-fetch.md +0 -37
  195. package/pp-core/workflows/execute-phase/steps/checkpoint-handling.md +0 -45
  196. package/pp-core/workflows/execute-phase/steps/install-run.md +0 -29
  197. package/pp-core/workflows/execute-phase/steps/phase-close-rebaseline.md +0 -23
  198. package/pp-core/workflows/execute-phase/steps/serial-group-dispatch.md +0 -73
  199. package/pp-core/workflows/execute-phase/steps/vault-door-gate.md +0 -19
  200. package/pp-core/workflows/plan-phase/steps/phase-tier.md +0 -43
  201. package/scripts/lib/size-budget.cjs +0 -311
  202. package/scripts/lint-neutrality-names.cjs +0 -694
  203. package/scripts/lint-org-coordinates.allowlist.json +0 -35
  204. package/scripts/lint-org-coordinates.cjs +0 -426
@@ -118,15 +118,74 @@ 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 260916-s5n: vault.required is named only when the READING
165
+ // says armed, by the same rule — an explicit false is the project's
166
+ // choice and the last line printed must not contradict it.
167
+ const requiredArmed = (0, init_contract_cjs_1.readVaultRequiredState)(cwd).state === 'armed';
168
+ // Built as a head plus clauses carrying no terminator of their own,
169
+ // with exactly one full stop appended at the end.
170
+ const head = 'Done — .platform-bindings.json was composed and written; vault.enabled is now true ' +
171
+ '(the vault capability is armed — /pp-init Step 2.6 probes reachability next)';
172
+ // 15-REVIEW WR-09: the clause names what is recorded and checked.
173
+ const standardsClause = '; each plan records which client standards documents governed it ' +
174
+ '(<vault_standards>), checked by the vault.trace gate';
175
+ const requiredClause = requiredArmed
176
+ ? '; vault.required is true, so a client vault miss, a failed fetch or an unwritable vault summary ' +
177
+ 'stops the build at plan:pre and execute:pre'
178
+ : '';
179
+ prompter.print(head + standardsClause + requiredClause + '.');
180
+ }
181
+ else {
182
+ // 'absent' — unreachable after an approved compose (the arming
183
+ // write fires on exactly this state), kept defensive for the case
184
+ // where that write itself failed. It says only what is certain:
185
+ // the binding was written, and it does NOT claim the capability is
186
+ // on, because the key is not there to say so.
187
+ prompter.print('Done — .platform-bindings.json was composed and written.');
188
+ }
130
189
  }
131
190
  else if (typeof state.info === 'string') {
132
191
  prompter.print(state.info);
@@ -168,9 +227,8 @@ async function runInitInteractive(cwd, prompter, opts = {}) {
168
227
  preselectedLabel: state.preselectedLabel,
169
228
  optionalAnswer: state.optionalAnswer,
170
229
  });
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.
230
+ // UAT-13-F2: the driver has no default-acceptance path, on purpose — the
231
+ // answer goes to initSessionAnswer verbatim, which owns the none/blank decline.
174
232
  const result = (0, init_contract_cjs_1.initSessionAnswer)(cwd, stepId, answer, sessionOpts);
175
233
  if (result.ok) {
176
234
  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',
@@ -180,9 +180,9 @@ const ERROR_REASON = Object.freeze({
180
180
  PLATFORM_BINDINGS_PARSE_FAILED: 'platform_bindings_parse_failed',
181
181
  // init (Phase 34-09 gap closure: `pp-tools init` interactive command)
182
182
  INIT_NON_INTERACTIVE: 'init_non_interactive',
183
- // vault write-back promote arm (Phase 29 WRB-01/03)
183
+ // vault promote (a standards document into the client vault)
184
184
  VAULT_PROMOTE_DISABLED: 'vault_promote_disabled',
185
- VAULT_PROMOTE_INVALID_PRACTICE: 'vault_promote_invalid_practice',
185
+ VAULT_PROMOTE_INVALID_DOCUMENT: 'vault_promote_invalid_document',
186
186
  VAULT_PROMOTE_SECRET_DETECTED: 'vault_promote_secret_detected',
187
187
  VAULT_PROMOTE_TARGET_REFUSED: 'vault_promote_target_refused',
188
188
  VAULT_PROMOTE_CONCURRENT_EDIT: 'vault_promote_concurrent_edit',
@@ -201,6 +201,8 @@ const ERROR_REASON = Object.freeze({
201
201
  DISCOVERY_ELEMENT_SWEEP_FAILED: 'discovery_element_sweep_failed',
202
202
  // discovery scope re-baselining (discovery-v2 Phase 5: D-72/D-73 gate)
203
203
  DISCOVERY_REBASELINE_CHECK_FAILED: 'discovery_rebaseline_check_failed',
204
+ // discovery vault context record (PBI 75336)
205
+ DISCOVERY_VAULT_CHECK_FAILED: 'discovery_vault_check_failed',
204
206
  // generic
205
207
  USAGE: 'usage',
206
208
  UNKNOWN: 'unknown',