ultimate-pi 0.17.0 → 0.18.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 (137) hide show
  1. package/.agents/skills/harness-context/SKILL.md +13 -6
  2. package/.agents/skills/harness-debate-plan/SKILL.md +37 -20
  3. package/.agents/skills/harness-decisions/SKILL.md +1 -1
  4. package/.agents/skills/harness-eval/SKILL.md +6 -21
  5. package/.agents/skills/harness-governor/SKILL.md +4 -3
  6. package/.agents/skills/harness-orchestration/SKILL.md +41 -53
  7. package/.agents/skills/harness-plan/SKILL.md +23 -12
  8. package/.agents/skills/harness-review/SKILL.md +52 -0
  9. package/.agents/skills/harness-sentrux-setup/SKILL.md +16 -3
  10. package/.agents/skills/harness-steer/SKILL.md +14 -0
  11. package/.agents/skills/sentrux/SKILL.md +9 -9
  12. package/.pi/agents/harness/planning/decompose.md +7 -4
  13. package/.pi/agents/harness/planning/hypothesis-validator.md +2 -0
  14. package/.pi/agents/harness/planning/hypothesis.md +3 -1
  15. package/.pi/agents/harness/planning/plan-adversary.md +2 -0
  16. package/.pi/agents/harness/planning/plan-evaluator.md +2 -0
  17. package/.pi/agents/harness/planning/plan-synthesizer.md +25 -0
  18. package/.pi/agents/harness/planning/planning-context.md +48 -0
  19. package/.pi/agents/harness/planning/review-integrator.md +2 -0
  20. package/.pi/agents/harness/planning/sprint-contract-auditor.md +2 -0
  21. package/.pi/agents/harness/{adversary.md → reviewing/adversary.md} +3 -10
  22. package/.pi/agents/harness/{evaluator.md → reviewing/evaluator.md} +3 -12
  23. package/.pi/agents/harness/running/executor.md +45 -0
  24. package/.pi/agents/harness/sentrux-steward.md +51 -0
  25. package/.pi/extensions/00-harness-project-control.ts +133 -0
  26. package/.pi/extensions/00-posthog-network-bootstrap.ts +11 -0
  27. package/.pi/extensions/budget-guard.ts +2 -0
  28. package/.pi/extensions/debate-orchestrator.ts +2 -0
  29. package/.pi/extensions/harness-ask-user.ts +2 -2
  30. package/.pi/extensions/harness-debate-tools.ts +2 -2
  31. package/.pi/extensions/harness-live-widget.ts +60 -3
  32. package/.pi/extensions/harness-plan-approval.ts +64 -58
  33. package/.pi/extensions/harness-run-context.ts +715 -90
  34. package/.pi/extensions/harness-subagent-submit.ts +46 -12
  35. package/.pi/extensions/harness-subagents.ts +2 -2
  36. package/.pi/extensions/harness-telemetry.ts +2 -0
  37. package/.pi/extensions/harness-web-tools.ts +2 -2
  38. package/.pi/extensions/lib/extension-load-guard.ts +10 -0
  39. package/.pi/extensions/lib/harness-artifact-gate.ts +172 -0
  40. package/.pi/extensions/lib/harness-posthog.ts +9 -5
  41. package/.pi/extensions/lib/harness-spawn-topology.ts +165 -0
  42. package/.pi/extensions/lib/harness-subagent-auth.ts +1 -2
  43. package/.pi/extensions/lib/harness-subagent-policy.ts +28 -24
  44. package/.pi/extensions/lib/harness-subagent-precheck.ts +36 -10
  45. package/.pi/extensions/lib/harness-subagent-submit-pipeline.ts +66 -2
  46. package/.pi/extensions/lib/harness-subagent-submit-registry.ts +22 -22
  47. package/.pi/extensions/lib/harness-subagents-bridge.ts +7 -29
  48. package/.pi/extensions/lib/harness-subprocess-bootstrap.ts +73 -0
  49. package/.pi/extensions/lib/plan-approval/create-plan.ts +2 -3
  50. package/.pi/extensions/lib/plan-approval/resolve-disk.ts +102 -0
  51. package/.pi/extensions/lib/plan-approval/schema.ts +22 -8
  52. package/.pi/extensions/lib/plan-approval/types.ts +1 -1
  53. package/.pi/extensions/lib/plan-approval/validate.ts +2 -2
  54. package/.pi/extensions/lib/plan-approval-readiness.ts +192 -0
  55. package/.pi/extensions/lib/plan-debate-eligibility.ts +12 -5
  56. package/.pi/extensions/lib/plan-debate-gate.ts +22 -1
  57. package/.pi/extensions/lib/plan-debate-lanes.ts +32 -2
  58. package/.pi/extensions/lib/plan-review-gate.ts +8 -0
  59. package/.pi/extensions/lib/posthog-client.ts +76 -0
  60. package/.pi/extensions/lib/spawn-policy.ts +3 -3
  61. package/.pi/extensions/observation-bus.ts +2 -0
  62. package/.pi/extensions/policy-gate.ts +26 -19
  63. package/.pi/extensions/review-integrity.ts +91 -10
  64. package/.pi/extensions/sentrux-rules-sync.ts +2 -0
  65. package/.pi/extensions/test-diff-integrity.ts +1 -0
  66. package/.pi/extensions/trace-recorder.ts +2 -0
  67. package/.pi/harness/agents.manifest.json +37 -37
  68. package/.pi/harness/corpus/cron.example +8 -0
  69. package/.pi/harness/corpus/graphify-kb-updater.config.json +214 -0
  70. package/.pi/harness/corpus/systemd/graphify-kb-updater.env.template +4 -0
  71. package/.pi/harness/corpus/systemd/graphify-kb-updater.service +17 -0
  72. package/.pi/harness/corpus/systemd/graphify-kb-updater.timer +11 -0
  73. package/.pi/harness/docs/adrs/0001-harness-constitution.md +2 -1
  74. package/.pi/harness/docs/adrs/0006-sentrux-dual-layer.md +8 -6
  75. package/.pi/harness/docs/adrs/0009-sentrux-rules-lifecycle.md +6 -1
  76. package/.pi/harness/docs/adrs/0031-harness-run-context.md +1 -1
  77. package/.pi/harness/docs/adrs/0032-harness-command-orchestration.md +7 -0
  78. package/.pi/harness/docs/adrs/0034-darwin-plan-research-pipeline.md +3 -3
  79. package/.pi/harness/docs/adrs/0036-implementation-research-and-selective-debate.md +8 -5
  80. package/.pi/harness/docs/adrs/0039-harness-post-run-review-gate.md +47 -0
  81. package/.pi/harness/docs/adrs/0040-practice-grounded-orchestration.md +40 -0
  82. package/.pi/harness/docs/adrs/0041-intelligent-planning-reconnaissance.md +39 -0
  83. package/.pi/harness/docs/adrs/0042-agent-native-orchestration.md +35 -0
  84. package/.pi/harness/docs/adrs/0043-path-first-harness-tools.md +38 -0
  85. package/.pi/harness/docs/adrs/0044-harness-steer-loop.md +37 -0
  86. package/.pi/harness/docs/adrs/0045-phase-scoped-agent-directories.md +33 -0
  87. package/.pi/harness/docs/adrs/README.md +11 -0
  88. package/.pi/harness/docs/graphify-kb-updater-runbook.md +163 -0
  89. package/.pi/harness/docs/practice-map.md +110 -0
  90. package/.pi/harness/env.harness.template +5 -3
  91. package/.pi/harness/evals/smoke/sentrux-stub.json +1 -1
  92. package/.pi/harness/evals/smoke/smoke-harness-plan.mjs +5 -2
  93. package/.pi/harness/specs/README.md +1 -1
  94. package/.pi/harness/specs/harness-run-context.schema.json +11 -0
  95. package/.pi/harness/specs/harness-spawn-context.schema.json +15 -1
  96. package/.pi/harness/specs/plan-execution-plan.schema.json +39 -1
  97. package/.pi/harness/specs/plan-packet.schema.json +4 -0
  98. package/.pi/harness/specs/plan-phase-status.schema.json +17 -0
  99. package/.pi/harness/specs/plan-phase-waiver.schema.json +25 -0
  100. package/.pi/harness/specs/plan-planning-context.schema.json +50 -0
  101. package/.pi/harness/specs/repair-brief.schema.json +45 -0
  102. package/.pi/harness/specs/review-outcome.schema.json +46 -0
  103. package/.pi/harness/specs/sentrux-manifest-proposal.schema.json +80 -0
  104. package/.pi/harness/specs/sentrux-signal.schema.json +43 -0
  105. package/.pi/harness/specs/steer-state.schema.json +20 -0
  106. package/.pi/lib/harness-context-mode-policy.ts +256 -0
  107. package/.pi/lib/harness-project-config.ts +91 -0
  108. package/.pi/lib/harness-repair-brief.ts +145 -0
  109. package/.pi/lib/harness-run-context.ts +591 -32
  110. package/.pi/lib/harness-ui-state.ts +114 -21
  111. package/.pi/prompts/harness-auto.md +10 -10
  112. package/.pi/prompts/harness-critic.md +3 -30
  113. package/.pi/prompts/harness-eval.md +4 -37
  114. package/.pi/prompts/harness-plan.md +116 -54
  115. package/.pi/prompts/harness-review.md +150 -15
  116. package/.pi/prompts/harness-run.md +62 -10
  117. package/.pi/prompts/harness-sentrux-steward.md +55 -0
  118. package/.pi/prompts/harness-setup.md +5 -4
  119. package/.pi/prompts/harness-steer.md +30 -0
  120. package/.pi/scripts/README.md +1 -0
  121. package/.pi/scripts/graphify-kb-updater.mjs +398 -0
  122. package/.pi/scripts/harness-agents-manifest.mjs +1 -1
  123. package/.pi/scripts/harness-project-toggle.mjs +129 -0
  124. package/.pi/scripts/harness-sentrux-cli.mjs +142 -0
  125. package/.pi/scripts/harness-verify.mjs +22 -6
  126. package/.pi/scripts/harness-web-policy-guard.mjs +68 -0
  127. package/.pi/scripts/validate-plan-dag.mjs +3 -3
  128. package/AGENTS.md +1 -0
  129. package/CHANGELOG.md +23 -0
  130. package/README.md +94 -58
  131. package/package.json +5 -4
  132. package/.pi/agents/harness/executor.md +0 -47
  133. package/.pi/agents/harness/planning/scout-graphify.md +0 -37
  134. package/.pi/agents/harness/planning/scout-semantic.md +0 -39
  135. package/.pi/agents/harness/planning/scout-structure.md +0 -35
  136. package/.pi/prompts/git-sync.md +0 -124
  137. /package/.pi/agents/harness/{tie-breaker.md → reviewing/tie-breaker.md} +0 -0
@@ -2,12 +2,8 @@
2
2
  * harness-plan-approval — PlanPacket approval UI and transcript renderer for parent sessions.
3
3
  */
4
4
 
5
- import { constants } from "node:fs";
6
- import { access } from "node:fs/promises";
7
- import { join } from "node:path";
8
5
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
9
6
  import { Text } from "@earendil-works/pi-tui";
10
- import { Type } from "@sinclair/typebox";
11
7
  import type { PlanPacketLike } from "../lib/harness-run-context.js";
12
8
  import {
13
9
  appendPlanApprovalIfNew,
@@ -16,7 +12,7 @@ import {
16
12
  parsePlanApprovalFromMessage,
17
13
  planPacketSummary,
18
14
  } from "../lib/harness-run-context.js";
19
- import { claimExtensionLoad } from "./lib/extension-load-guard.js";
15
+ import { claimHarnessGovernanceLoad } from "./lib/extension-load-guard.js";
20
16
  import {
21
17
  CREATE_PLAN_GUIDELINES,
22
18
  CREATE_PLAN_SNIPPET,
@@ -33,8 +29,10 @@ import {
33
29
  renderApprovePlanResult,
34
30
  renderHarnessPlanDraft,
35
31
  } from "./lib/plan-approval/render.js";
32
+ import { resolveApprovePlanParamsFromDisk } from "./lib/plan-approval/resolve-disk.js";
36
33
  import {
37
34
  ApprovePlanParamsSchema,
35
+ CreatePlanParamsSchema,
38
36
  PROMPT_GUIDELINES,
39
37
  PROMPT_SNIPPET,
40
38
  } from "./lib/plan-approval/schema.js";
@@ -47,23 +45,14 @@ import {
47
45
  toApprovePlanToolDetails,
48
46
  validateApprovePlanParams,
49
47
  } from "./lib/plan-approval/validate.js";
48
+ import { validatePlanApprovalReadiness } from "./lib/plan-approval-readiness.js";
50
49
  import { validatePlanDebateGate } from "./lib/plan-debate-gate.js";
51
50
 
52
51
  // @ts-expect-error pi extensions run as ESM
53
52
  const MODULE_URL = import.meta.url;
54
53
 
55
- const CreatePlanParamsSchema = Type.Object({
56
- plan_packet: Type.Object(
57
- {},
58
- {
59
- description:
60
- "Approved PlanPacket to persist (same object as approve_plan).",
61
- },
62
- ),
63
- });
64
-
65
54
  export default function harnessPlanApproval(pi: ExtensionAPI) {
66
- if (!claimExtensionLoad("harness-plan-approval", MODULE_URL)) return;
55
+ if (!claimHarnessGovernanceLoad("harness-plan-approval", MODULE_URL)) return;
67
56
  pi.registerMessageRenderer(
68
57
  "harness-plan-draft",
69
58
  (message, _options, theme) => {
@@ -103,12 +92,37 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
103
92
  parameters: ApprovePlanParamsSchema,
104
93
 
105
94
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
106
- const validated = validateApprovePlanParams(params as ApprovePlanParams);
95
+ const entries = ctx.sessionManager.getEntries();
96
+ const projectRoot = process.cwd();
97
+ const resolved = await resolveApprovePlanParamsFromDisk(
98
+ params as ApprovePlanParams,
99
+ entries,
100
+ projectRoot,
101
+ );
102
+ if (!resolved.ok) {
103
+ return {
104
+ content: [{ type: "text", text: resolved.error }],
105
+ details: {
106
+ plan_packet: (params as ApprovePlanParams).plan_packet ?? {},
107
+ options: [],
108
+ response: null,
109
+ cancelled: true,
110
+ },
111
+ isError: true,
112
+ };
113
+ }
114
+ const validated = validateApprovePlanParams({
115
+ ...(params as ApprovePlanParams),
116
+ plan_packet: resolved.plan_packet,
117
+ research_brief:
118
+ resolved.research_brief ??
119
+ (params as ApprovePlanParams).research_brief,
120
+ });
107
121
  if (typeof validated === "string") {
108
122
  return {
109
123
  content: [{ type: "text", text: validated }],
110
124
  details: {
111
- plan_packet: (params as ApprovePlanParams).plan_packet ?? {},
125
+ plan_packet: resolved.plan_packet,
112
126
  options: [],
113
127
  response: null,
114
128
  cancelled: true,
@@ -116,7 +130,6 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
116
130
  };
117
131
  }
118
132
 
119
- const entries = ctx.sessionManager.getEntries();
120
133
  if (
121
134
  hasPlanUserApproval(entries, {
122
135
  sincePlanCommand: true,
@@ -148,43 +161,33 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
148
161
  validated.human_summary?.trim() ||
149
162
  `Plan ${planId} — pending your approval`;
150
163
  const runCtx = getLatestRunContext(entries);
151
- const projectRoot = process.cwd();
152
164
  const implWarnings: string[] = [];
165
+ const risk = String(
166
+ validated.plan_packet.risk_level ?? "med",
167
+ ).toLowerCase();
153
168
  if (runCtx?.run_id) {
154
- const implPath = join(
169
+ const readiness = await validatePlanApprovalReadiness(
155
170
  projectRoot,
156
- ".pi",
157
- "harness",
158
- "runs",
159
171
  runCtx.run_id,
160
- "artifacts",
161
- "implementation-research.yaml",
172
+ { risk_level: risk },
162
173
  );
163
- let implExists = false;
164
- try {
165
- await access(implPath, constants.R_OK);
166
- implExists = true;
167
- } catch {
168
- implExists = false;
169
- }
170
- const risk = String(
171
- validated.plan_packet.risk_level ?? "med",
172
- ).toLowerCase();
173
- if (!implExists) {
174
- const msg =
175
- "approve_plan: missing artifacts/implementation-research.yaml (Phase 3.5 required)";
176
- if (risk === "high") {
177
- return {
178
- content: [{ type: "text", text: msg }],
179
- details: {
180
- plan_packet: validated.plan_packet,
181
- cancelled: true,
174
+ if (!readiness.ok) {
175
+ return {
176
+ content: [
177
+ {
178
+ type: "text",
179
+ text: `approve_plan blocked — plan phase not ready:\n- ${readiness.errors.join("\n- ")}`,
182
180
  },
183
- isError: true,
184
- };
185
- }
186
- implWarnings.push(msg);
181
+ ],
182
+ details: {
183
+ plan_packet: validated.plan_packet,
184
+ readiness,
185
+ cancelled: true,
186
+ },
187
+ isError: true,
188
+ };
187
189
  }
190
+ implWarnings.push(...readiness.warnings);
188
191
  }
189
192
  if (runCtx?.run_id) {
190
193
  const gate = await validatePlanDebateGate(projectRoot, runCtx.run_id);
@@ -308,19 +311,22 @@ export default function harnessPlanApproval(pi: ExtensionAPI) {
308
311
  parameters: CreatePlanParamsSchema,
309
312
 
310
313
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
311
- const validated = validateApprovePlanParams(params as ApprovePlanParams);
312
- if (typeof validated === "string") {
314
+ const entries = ctx.sessionManager.getEntries();
315
+ const runCtx = getLatestRunContext(entries);
316
+ const projectRoot = process.cwd();
317
+ const resolved = await resolveApprovePlanParamsFromDisk(
318
+ params as ApprovePlanParams,
319
+ entries,
320
+ projectRoot,
321
+ );
322
+ if (!resolved.ok) {
313
323
  return {
314
- content: [{ type: "text", text: validated }],
315
- details: { error: validated },
324
+ content: [{ type: "text", text: resolved.error }],
325
+ details: { error: resolved.error },
316
326
  isError: true,
317
327
  };
318
328
  }
319
-
320
- const entries = ctx.sessionManager.getEntries();
321
- const runCtx = getLatestRunContext(entries);
322
- const projectRoot = process.cwd();
323
- const result = await executeCreatePlan(validated.plan_packet, {
329
+ const result = await executeCreatePlan(resolved.plan_packet, {
324
330
  projectRoot,
325
331
  getParentEntries: () => entries,
326
332
  getSubagentEntries: () => entries,