@spences10/pi-harness 0.0.3 → 0.0.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.
package/README.md CHANGED
@@ -10,7 +10,9 @@
10
10
  Build and run ephemeral task harnesses with my-pi primitives. A
11
11
  harness is a `/tmp` runtime containing a machine-readable contract,
12
12
  executor prompt, task brief, validation script, review script, logs,
13
- status, and runtime enforcement.
13
+ status, and runtime enforcement. Inspired by Ornith's self-scaffolding
14
+ design, the runtime separates an immutable outer policy from a
15
+ versioned, amendable inner scaffold.
14
16
 
15
17
  ## Installation
16
18
 
@@ -33,6 +35,8 @@ pi -e ./packages/pi-harness
33
35
 
34
36
  - `/harness` command for create, run, review, status, use, and clear
35
37
  - `harness_create` tool to create `/tmp/my-pi-harness-*` runtimes
38
+ - `harness_amend` tool for audited, versioned changes to the inner
39
+ scaffold
36
40
  - `harness_update` tool for phase/status/evidence logging
37
41
  - generated `OUTCOME.md` and `outcome.json` review artifacts
38
42
  - dirty-baseline tracking so pre-existing repo changes are reported
@@ -41,7 +45,7 @@ pi -e ./packages/pi-harness
41
45
  - `harness_read` tool for summaries
42
46
  - `before_agent_start` context injection for the active harness
43
47
  - `tool_call` enforcement for edit/write paths and forbidden commands
44
- - TUI status/widget for the active harness
48
+ - compact TUI status for the active harness
45
49
  - bundled `create-harness`, `execute-harness`, and `review-harness`
46
50
  skills
47
51
 
@@ -49,7 +53,7 @@ pi -e ./packages/pi-harness
49
53
 
50
54
  ```text
51
55
  /tmp/my-pi-harness-<id>/
52
- harness.json # execution contract
56
+ harness.json # outer policy, versioned inner scaffold, amendment history
53
57
  SYSTEM.md # executor system prompt
54
58
  TASK.md # task brief and required loop
55
59
  status.json # phase/status/evidence log
@@ -75,6 +79,24 @@ pi -e ./packages/pi-harness
75
79
  The create/run/review commands prompt the model to use the bundled
76
80
  skills. The tools provide the actual runtime and enforcement layer.
77
81
 
82
+ `harness.json` contains two deliberately different layers:
83
+
84
+ - `policy`: runtime-owned workspace and verifier protections such as
85
+ cwd, forbidden paths/commands, available tools, and the dirty
86
+ baseline. Executors cannot weaken these through amendments.
87
+ - `scaffold`: the model's task interpretation and execution strategy,
88
+ including allowed paths, validation, test policy, and model roles.
89
+ It is subordinate to system, developer, and current user
90
+ instructions and can be revised with `harness_amend`.
91
+
92
+ Every scaffold amendment increments its version, records its reason
93
+ and requester, regenerates runtime prompts/scripts, and appends an
94
+ audit event. A harness enforcement block reports a contract mismatch;
95
+ it is not a platform-policy refusal. When a harness is active, the TUI
96
+ shows a compact footer/status indicator; use `/harness status [dir]`
97
+ or `harness_read` for the full contract, task, validation, and outcome
98
+ details.
99
+
78
100
  Harnesses snapshot dirty files at creation time. Review and outcome
79
101
  artifacts focus on changes after that baseline, while still recording
80
102
  baseline files in `outcome.json`. If a team-mode executor runs in a
@@ -36,7 +36,7 @@ function is_test_path(absolute_path) {
36
36
  /\.(test|spec)\.[cm]?[jt]sx?$/.test(path));
37
37
  }
38
38
  export function check_path_allowed(contract, input_path) {
39
- const cwd = resolve(contract.cwd);
39
+ const cwd = resolve(contract.policy.cwd);
40
40
  const absolute_path = resolve_project_path(cwd, input_path);
41
41
  const inside_cwd = absolute_path === cwd || absolute_path.startsWith(`${cwd}/`);
42
42
  if (!inside_cwd) {
@@ -45,19 +45,20 @@ export function check_path_allowed(contract, input_path) {
45
45
  reason: `Harness ${contract.id}: path is outside cwd: ${input_path}`,
46
46
  };
47
47
  }
48
- if (contract.forbidden_paths.some((pattern) => pattern_matches(cwd, pattern, absolute_path))) {
48
+ if (contract.policy.forbidden_paths.some((pattern) => pattern_matches(cwd, pattern, absolute_path))) {
49
49
  return {
50
50
  ok: false,
51
51
  reason: `Harness ${contract.id}: path is forbidden: ${input_path}`,
52
52
  };
53
53
  }
54
- if (!contract.allow_test_changes && is_test_path(absolute_path)) {
54
+ if (!contract.scaffold.allow_test_changes &&
55
+ is_test_path(absolute_path)) {
55
56
  return {
56
57
  ok: false,
57
58
  reason: `Harness ${contract.id}: test changes are not allowed by harness.json`,
58
59
  };
59
60
  }
60
- if (!contract.allowed_paths.some((pattern) => pattern_matches(cwd, pattern, absolute_path))) {
61
+ if (!contract.scaffold.allowed_paths.some((pattern) => pattern_matches(cwd, pattern, absolute_path))) {
61
62
  return {
62
63
  ok: false,
63
64
  reason: `Harness ${contract.id}: path is outside allowed_paths: ${input_path}`,
@@ -66,14 +67,14 @@ export function check_path_allowed(contract, input_path) {
66
67
  return { ok: true };
67
68
  }
68
69
  export function check_command_allowed(contract, command) {
69
- const blocked = contract.forbidden_commands.find((needle) => command.includes(needle));
70
+ const blocked = contract.policy.forbidden_commands.find((needle) => command.includes(needle));
70
71
  if (blocked) {
71
72
  return {
72
73
  ok: false,
73
74
  reason: `Harness ${contract.id}: command contains forbidden pattern: ${blocked}`,
74
75
  };
75
76
  }
76
- if (!contract.allow_test_changes &&
77
+ if (!contract.scaffold.allow_test_changes &&
77
78
  /\brm\b.*((^|\/)(__tests__|tests?)\/|\.(test|spec)\.)/.test(command)) {
78
79
  return {
79
80
  ok: false,
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/enforcement/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1D,SAAS,oBAAoB,CAC5B,GAAW,EACX,UAAkB;IAElB,OAAO,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,OAAe;IACxD,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACpD,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CACvB,GAAW,EACX,OAAe,EACf,aAAqB;IAErB,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,UAAU,CAC5D,IAAI,EACJ,GAAG,CACH,CAAC;IACF,IAAI,kBAAkB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CACN,aAAa,KAAK,MAAM;YACxB,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CACtC,CAAC;IACH,CAAC;IACD,IAAI,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,MAAM,CACvB,IAAI,kBAAkB;aACpB,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;aACrC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;aACtB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAC7B,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,CACN,aAAa,KAAK,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAClE,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,aAAqB;IAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,CACN,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;QACvC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,QAAyB,EACzB,UAAkB;IAElB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,UAAU,GACf,aAAa,KAAK,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW,QAAQ,CAAC,EAAE,0BAA0B,UAAU,EAAE;SACpE,CAAC;IACH,CAAC;IACD,IACC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACzC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAC5C,EACA,CAAC;QACF,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW,QAAQ,CAAC,EAAE,wBAAwB,UAAU,EAAE;SAClE,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,kBAAkB,IAAI,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;QACjE,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW,QAAQ,CAAC,EAAE,gDAAgD;SAC9E,CAAC;IACH,CAAC;IACD,IACC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACxC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAC5C,EACA,CAAC;QACF,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW,QAAQ,CAAC,EAAE,oCAAoC,UAAU,EAAE;SAC9E,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,QAAyB,EACzB,OAAe;IAEf,MAAM,OAAO,GAAG,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CACxB,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACb,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW,QAAQ,CAAC,EAAE,yCAAyC,OAAO,EAAE;SAChF,CAAC;IACH,CAAC;IACD,IACC,CAAC,QAAQ,CAAC,kBAAkB;QAC5B,sDAAsD,CAAC,IAAI,CAC1D,OAAO,CACP,EACA,CAAC;QACF,OAAO;YACN,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW,QAAQ,CAAC,EAAE,iCAAiC;SAC/D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/enforcement/policy.ts"],"names":[],"mappings":"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"}
package/dist/extension.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { check_command_allowed, check_path_allowed, } from './enforcement/policy.js';
3
- import { harness_paths, read_contract } from './runtime/files.js';
4
3
  import { HARNESS_SYSTEM_PROMPT } from './prompt.js';
5
- import { active_harness_context, create_harness_runtime, format_harness_summary, update_harness_runtime, } from './runtime/index.js';
6
- import { HARNESS_CUSTOM_TYPE, harness_create_params_schema, harness_read_params_schema, harness_update_params_schema, } from './schema.js';
4
+ import { harness_paths, read_contract } from './runtime/files.js';
5
+ import { active_harness_context, amend_harness_runtime, create_harness_runtime, format_harness_status_line, format_harness_summary, update_harness_runtime, } from './runtime/index.js';
6
+ import { HARNESS_CUSTOM_TYPE, harness_amend_params_schema, harness_create_params_schema, harness_read_params_schema, harness_update_params_schema, } from './schema.js';
7
7
  function persist_active_harness(pi, harness_dir) {
8
8
  pi.appendEntry(HARNESS_CUSTOM_TYPE, {
9
9
  active_harness_dir: harness_dir,
@@ -23,9 +23,8 @@ function update_harness_ui(ctx, harness_dir) {
23
23
  ctx.ui.setWidget('harness', undefined);
24
24
  return;
25
25
  }
26
- const summary = format_harness_summary(harness_dir).split('\n');
27
- ctx.ui.setStatus('harness', `🧪 ${summary[2]?.replace('Status: ', '')}`);
28
- ctx.ui.setWidget('harness', summary.slice(0, 4));
26
+ ctx.ui.setStatus('harness', format_harness_status_line(harness_dir));
27
+ ctx.ui.setWidget('harness', undefined);
29
28
  }
30
29
  function parse_command(args) {
31
30
  const [command = 'status', ...rest] = args.trim().split(/\s+/);
@@ -83,7 +82,7 @@ export default async function harness(pi) {
83
82
  return;
84
83
  }
85
84
  set_active_harness(harness_dir, ctx);
86
- pi.sendUserMessage(`Use the execute-harness skill to run this harness until validation completes: ${harness_dir}. If the team tool is available, create or reuse a team, create a task for this harness, spawn one worktree mutating teammate with member_spawn, and have that teammate execute the harness. Then inspect team status/results before reporting.`);
85
+ pi.sendUserMessage(`Use the execute-harness skill to run this harness until validation completes: ${harness_dir}. If the team tool is available, create or reuse a team and create a task for this harness. Use one mutating teammate only when useful; use a worktree only when isolation and merge ownership are explicit. Then inspect team status/results before reporting.`);
87
86
  return;
88
87
  }
89
88
  if (command === 'review') {
@@ -115,6 +114,22 @@ export default async function harness(pi) {
115
114
  return tool_text(`Created harness ${contract.id}\n${format_harness_summary(harness_dir)}`);
116
115
  },
117
116
  });
117
+ pi.registerTool({
118
+ name: 'harness_amend',
119
+ label: 'Amend Harness Scaffold',
120
+ description: 'Amend the active execution scaffold with an audited version change. Cannot weaken the outer runtime policy.',
121
+ promptSnippet: 'Amend task scope, validation, test policy, or model strategy when user direction or evidence changes',
122
+ promptGuidelines: [
123
+ 'Use harness_amend for legitimate changes to the inner scaffold instead of treating the active harness as immutable.',
124
+ 'Outer policy fields such as cwd, forbidden paths, forbidden commands, and tool availability cannot be amended.',
125
+ ],
126
+ parameters: harness_amend_params_schema,
127
+ async execute(_tool_call_id, params, _signal, _on_update, ctx) {
128
+ const contract = amend_harness_runtime(params);
129
+ set_active_harness(params.harness_dir, ctx);
130
+ return tool_text(`Amended harness ${contract.id} scaffold to v${contract.scaffold.version}`);
131
+ },
132
+ });
118
133
  pi.registerTool({
119
134
  name: 'harness_update',
120
135
  label: 'Update Harness',
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,27 @@
1
- export { default } from './extension.js';
2
- export { should_inject_harness_prompt } from './extension.js';
3
1
  export { check_command_allowed, check_path_allowed, } from './enforcement/policy.js';
2
+ export { default, should_inject_harness_prompt, } from './extension.js';
4
3
  export { HARNESS_SYSTEM_PROMPT } from './prompt.js';
5
- export { active_harness_context, create_harness_runtime, format_harness_summary, update_harness_runtime, } from './runtime/index.js';
4
+ export { active_harness_context, amend_harness_runtime, create_harness_runtime, format_harness_status_line, format_harness_summary, update_harness_runtime, } from './runtime/index.js';
6
5
  export { collect_harness_outcome, render_outcome_markdown, write_outcome_artifacts, } from './runtime/outcome.js';
7
- export type { HarnessContract, HarnessCreateParams, HarnessLogEntry, HarnessOutcome, HarnessReadParams, HarnessStatus, HarnessStatusFile, HarnessThinking, HarnessUpdateParams, } from './schema.js';
8
- export { DEFAULT_FORBIDDEN_COMMANDS, HARNESS_CUSTOM_TYPE, HARNESS_VERSION, harness_create_params_schema, harness_read_params_schema, harness_update_params_schema, thinking_levels_schema, } from './schema.js';
6
+ export { DEFAULT_FORBIDDEN_COMMANDS, harness_amend_params_schema, harness_create_params_schema, HARNESS_CUSTOM_TYPE, harness_read_params_schema, harness_update_params_schema, HARNESS_VERSION, thinking_levels_schema, } from './schema.js';
7
+ export type { HarnessAmendment, HarnessAmendParams, HarnessContract, HarnessCreateParams, HarnessLogEntry, HarnessOutcome, HarnessPolicy, HarnessReadParams, HarnessScaffold, HarnessStatus, HarnessStatusFile, HarnessThinking, HarnessUpdateParams, } from './schema.js';
9
8
  export declare const testing: {
9
+ harness_amend_params_schema: import("typebox").TObject<{
10
+ harness_dir: import("typebox").TString;
11
+ reason: import("typebox").TString;
12
+ requested_by: import("typebox").TOptional<import("typebox").TUnion<[import("typebox").TLiteral<"user">, import("typebox").TLiteral<"planner">]>>;
13
+ task: import("typebox").TOptional<import("typebox").TString>;
14
+ allowed_paths: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
15
+ validation_commands: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
16
+ allow_test_changes: import("typebox").TOptional<import("typebox").TBoolean>;
17
+ escalation_rules: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
18
+ planner_model: import("typebox").TOptional<import("typebox").TString>;
19
+ planner_thinking: import("typebox").TOptional<import("typebox").TUnion<[import("typebox").TLiteral<"off">, import("typebox").TLiteral<"minimal">, import("typebox").TLiteral<"low">, import("typebox").TLiteral<"medium">, import("typebox").TLiteral<"high">, import("typebox").TLiteral<"xhigh">]>>;
20
+ executor_model: import("typebox").TOptional<import("typebox").TString>;
21
+ executor_thinking: import("typebox").TOptional<import("typebox").TUnion<[import("typebox").TLiteral<"off">, import("typebox").TLiteral<"minimal">, import("typebox").TLiteral<"low">, import("typebox").TLiteral<"medium">, import("typebox").TLiteral<"high">, import("typebox").TLiteral<"xhigh">]>>;
22
+ reviewer_model: import("typebox").TOptional<import("typebox").TString>;
23
+ reviewer_thinking: import("typebox").TOptional<import("typebox").TUnion<[import("typebox").TLiteral<"off">, import("typebox").TLiteral<"minimal">, import("typebox").TLiteral<"low">, import("typebox").TLiteral<"medium">, import("typebox").TLiteral<"high">, import("typebox").TLiteral<"xhigh">]>>;
24
+ }>;
10
25
  harness_create_params_schema: import("typebox").TObject<{
11
26
  task: import("typebox").TString;
12
27
  slug: import("typebox").TOptional<import("typebox").TString>;
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { harness_create_params_schema, harness_read_params_schema, harness_update_params_schema, } from './schema.js';
2
- export { default } from './extension.js';
3
- export { should_inject_harness_prompt } from './extension.js';
1
+ import { harness_amend_params_schema, harness_create_params_schema, harness_read_params_schema, harness_update_params_schema, } from './schema.js';
4
2
  export { check_command_allowed, check_path_allowed, } from './enforcement/policy.js';
3
+ export { default, should_inject_harness_prompt, } from './extension.js';
5
4
  export { HARNESS_SYSTEM_PROMPT } from './prompt.js';
6
- export { active_harness_context, create_harness_runtime, format_harness_summary, update_harness_runtime, } from './runtime/index.js';
5
+ export { active_harness_context, amend_harness_runtime, create_harness_runtime, format_harness_status_line, format_harness_summary, update_harness_runtime, } from './runtime/index.js';
7
6
  export { collect_harness_outcome, render_outcome_markdown, write_outcome_artifacts, } from './runtime/outcome.js';
8
- export { DEFAULT_FORBIDDEN_COMMANDS, HARNESS_CUSTOM_TYPE, HARNESS_VERSION, harness_create_params_schema, harness_read_params_schema, harness_update_params_schema, thinking_levels_schema, } from './schema.js';
7
+ export { DEFAULT_FORBIDDEN_COMMANDS, harness_amend_params_schema, harness_create_params_schema, HARNESS_CUSTOM_TYPE, harness_read_params_schema, harness_update_params_schema, HARNESS_VERSION, thinking_levels_schema, } from './schema.js';
9
8
  export const testing = {
9
+ harness_amend_params_schema,
10
10
  harness_create_params_schema,
11
11
  harness_read_params_schema,
12
12
  harness_update_params_schema,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACN,qBAAqB,EACrB,kBAAkB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACN,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,sBAAsB,CAAC;AAY9B,OAAO,EACN,0BAA0B,EAC1B,mBAAmB,EACnB,eAAe,EACf,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,sBAAsB,GACtB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,4BAA4B;IAC5B,0BAA0B;IAC1B,4BAA4B;CAC5B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,qBAAqB,EACrB,kBAAkB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,OAAO,EACP,4BAA4B,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,eAAe,EACf,sBAAsB,GACtB,MAAM,aAAa,CAAC;AAiBrB,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,2BAA2B;IAC3B,4BAA4B;IAC5B,0BAA0B;IAC1B,4BAA4B;CAC5B,CAAC"}
package/dist/prompt.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const HARNESS_SYSTEM_PROMPT = "## my-pi harness workflow\n\nFor ambiguous, risky, or multi-step coding tasks, prefer a real harness instead of a prose-only plan. A harness is an ephemeral /tmp runtime with harness.json, SYSTEM.md, TASK.md, status.json, validation scripts, logs, and enforcement rules. Use the bundled create-harness skill plus the harness_create tool to build it, then execute inside the active harness until validation and review are complete.";
1
+ export declare const HARNESS_SYSTEM_PROMPT = "## my-pi harness workflow\n\nFor ambiguous, risky, or multi-step coding tasks, prefer a real harness instead of a prose-only plan. A harness is an ephemeral /tmp runtime with harness.json, SYSTEM.md, TASK.md, status.json, validation scripts, logs, and enforcement rules. Its outer policy is runtime-owned; its versioned inner scaffold is an amendable execution plan subordinate to system, developer, and current user instructions. Use the bundled create-harness skill plus harness_create to build it, harness_amend when legitimate scope or strategy changes, then execute until validation and review are complete.";
package/dist/prompt.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export const HARNESS_SYSTEM_PROMPT = `## my-pi harness workflow
2
2
 
3
- For ambiguous, risky, or multi-step coding tasks, prefer a real harness instead of a prose-only plan. A harness is an ephemeral /tmp runtime with harness.json, SYSTEM.md, TASK.md, status.json, validation scripts, logs, and enforcement rules. Use the bundled create-harness skill plus the harness_create tool to build it, then execute inside the active harness until validation and review are complete.`;
3
+ For ambiguous, risky, or multi-step coding tasks, prefer a real harness instead of a prose-only plan. A harness is an ephemeral /tmp runtime with harness.json, SYSTEM.md, TASK.md, status.json, validation scripts, logs, and enforcement rules. Its outer policy is runtime-owned; its versioned inner scaffold is an amendable execution plan subordinate to system, developer, and current user instructions. Use the bundled create-harness skill plus harness_create to build it, harness_amend when legitimate scope or strategy changes, then execute until validation and review are complete.`;
4
4
  //# sourceMappingURL=prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;;kZAE6W,CAAC"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;;wkBAEmiB,CAAC"}
@@ -1,8 +1,10 @@
1
- import { type HarnessContract, type HarnessCreateParams, type HarnessStatusFile, type HarnessUpdateParams } from '../schema.js';
1
+ import { type HarnessAmendParams, type HarnessContract, type HarnessCreateParams, type HarnessStatusFile, type HarnessUpdateParams } from '../schema.js';
2
2
  export declare function create_harness_runtime(params: HarnessCreateParams, default_cwd: string): {
3
3
  harness_dir: string;
4
4
  contract: HarnessContract;
5
5
  };
6
+ export declare function amend_harness_runtime(params: HarnessAmendParams): HarnessContract;
6
7
  export declare function update_harness_runtime(params: HarnessUpdateParams): HarnessStatusFile;
8
+ export declare function format_harness_status_line(harness_dir: string): string;
7
9
  export declare function format_harness_summary(harness_dir: string): string;
8
10
  export declare function active_harness_context(harness_dir: string): string;
@@ -1,107 +1,181 @@
1
1
  import { chmodSync, mkdirSync, writeFileSync } from 'node:fs';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { join, resolve } from 'node:path';
4
+ import { DEFAULT_FORBIDDEN_COMMANDS, HARNESS_VERSION, } from '../schema.js';
4
5
  import { append_event, harness_paths, read_contract, read_status, write_contract, write_status, } from './files.js';
5
6
  import { collect_git_changed_files, write_outcome_artifacts, } from './outcome.js';
6
7
  import { build_guard_script, build_outcome_script, build_review_script, build_system_markdown, build_task_markdown, build_validate_script, } from './renderers.js';
7
- import { DEFAULT_FORBIDDEN_COMMANDS, HARNESS_VERSION, } from '../schema.js';
8
8
  function now_iso() {
9
9
  return new Date().toISOString();
10
10
  }
11
11
  function slugify(input) {
12
- const slug = input
12
+ return (input
13
13
  .toLowerCase()
14
14
  .replace(/[^a-z0-9]+/g, '-')
15
15
  .replace(/^-+|-+$/g, '')
16
- .slice(0, 48);
17
- return slug || 'task';
16
+ .slice(0, 48) || 'task');
17
+ }
18
+ function write_generated_runtime(harness_dir, contract) {
19
+ const paths = harness_paths(harness_dir);
20
+ writeFileSync(paths.system, build_system_markdown(contract));
21
+ writeFileSync(paths.task, build_task_markdown(contract));
22
+ writeFileSync(paths.validate, build_validate_script(contract));
23
+ writeFileSync(paths.guard, build_guard_script());
24
+ writeFileSync(paths.outcome_script, build_outcome_script());
25
+ writeFileSync(paths.review, build_review_script(contract, paths.guard, paths.outcome_script));
26
+ chmodSync(paths.validate, 0o755);
27
+ chmodSync(paths.review, 0o755);
18
28
  }
19
29
  export function create_harness_runtime(params, default_cwd) {
20
30
  const cwd = resolve(params.cwd ?? default_cwd);
21
- const slug = slugify(params.slug ?? params.task);
22
- const id = `${slug}-${Date.now().toString(36)}`;
31
+ const id = `${slugify(params.slug ?? params.task)}-${Date.now().toString(36)}`;
23
32
  const harness_dir = join(tmpdir(), `my-pi-harness-${id}`);
24
33
  const paths = harness_paths(harness_dir);
25
34
  mkdirSync(paths.logs, { recursive: true });
35
+ const created_at = now_iso();
26
36
  const contract = {
27
37
  version: HARNESS_VERSION,
28
38
  id,
29
- task: params.task,
30
- cwd,
31
- created_at: now_iso(),
39
+ created_at,
32
40
  status: 'created',
33
- planner: {
34
- model: params.planner_model,
35
- thinking: params.planner_thinking,
36
- },
37
- executor: {
38
- model: params.executor_model,
39
- thinking: params.executor_thinking ?? 'low',
41
+ policy: {
42
+ cwd,
43
+ forbidden_paths: params.forbidden_paths ?? [
44
+ '.git/**',
45
+ 'node_modules/**',
46
+ 'dist/**',
47
+ '.env',
48
+ '.env.*',
49
+ ],
50
+ allowed_tools: [
51
+ 'read',
52
+ 'bash',
53
+ 'edit',
54
+ 'write',
55
+ 'lsp_diagnostics',
56
+ ],
57
+ forbidden_commands: [
58
+ ...DEFAULT_FORBIDDEN_COMMANDS,
59
+ ...(params.forbidden_commands ?? []),
60
+ ],
61
+ baseline_changed_files: collect_git_changed_files(cwd),
40
62
  },
41
- reviewer: {
42
- model: params.reviewer_model,
43
- thinking: params.reviewer_thinking ?? 'high',
63
+ scaffold: {
64
+ version: 1,
65
+ task: params.task,
66
+ planner: {
67
+ model: params.planner_model,
68
+ thinking: params.planner_thinking,
69
+ },
70
+ executor: {
71
+ model: params.executor_model,
72
+ thinking: params.executor_thinking ?? 'low',
73
+ },
74
+ reviewer: {
75
+ model: params.reviewer_model,
76
+ thinking: params.reviewer_thinking ?? 'high',
77
+ },
78
+ allowed_paths: params.allowed_paths ?? ['.'],
79
+ validation_commands: params.validation_commands ?? [],
80
+ allow_test_changes: params.allow_test_changes ?? false,
81
+ escalation_rules: [
82
+ 'Required context contradicts the active scaffold or TASK.md.',
83
+ 'Implementation needs edits outside scaffold.allowed_paths.',
84
+ 'Validation requires weakening tests or changing public behavior outside the scaffold.',
85
+ 'Validation still fails after one focused fix attempt.',
86
+ ],
44
87
  },
45
- allowed_paths: params.allowed_paths ?? ['.'],
46
- forbidden_paths: params.forbidden_paths ?? [
47
- '.git/**',
48
- 'node_modules/**',
49
- 'dist/**',
50
- '.env',
51
- '.env.*',
52
- ],
53
- allowed_tools: [
54
- 'read',
55
- 'bash',
56
- 'edit',
57
- 'write',
58
- 'lsp_diagnostics',
59
- ],
60
- validation_commands: params.validation_commands ?? [],
61
- forbidden_commands: [
62
- ...DEFAULT_FORBIDDEN_COMMANDS,
63
- ...(params.forbidden_commands ?? []),
64
- ],
65
- allow_test_changes: params.allow_test_changes ?? false,
66
- baseline_changed_files: collect_git_changed_files(cwd),
67
- escalation_rules: [
68
- 'Required context contradicts harness.json or TASK.md.',
69
- 'Implementation needs edits outside allowed_paths.',
70
- 'Validation requires weakening tests or changing public behavior outside the contract.',
71
- 'Validation still fails after one focused fix attempt.',
72
- ],
88
+ amendments: [],
73
89
  };
74
90
  write_contract(harness_dir, contract);
75
- writeFileSync(paths.system, build_system_markdown(contract));
76
- writeFileSync(paths.task, build_task_markdown(contract));
77
91
  write_status(harness_dir, {
78
92
  id,
79
93
  status: 'created',
80
94
  log: [
81
95
  {
82
- timestamp: contract.created_at,
96
+ timestamp: created_at,
83
97
  status: 'created',
84
98
  note: 'Harness created',
85
99
  },
86
100
  ],
87
101
  });
88
- writeFileSync(paths.validate, build_validate_script(contract));
89
- writeFileSync(paths.guard, build_guard_script());
90
- writeFileSync(paths.outcome_script, build_outcome_script());
102
+ write_generated_runtime(harness_dir, contract);
91
103
  write_outcome_artifacts(harness_dir);
92
- writeFileSync(paths.review, build_review_script(contract, paths.guard, paths.outcome_script));
93
- chmodSync(paths.validate, 0o755);
94
- chmodSync(paths.review, 0o755);
95
104
  append_event(harness_dir, {
96
- timestamp: contract.created_at,
105
+ timestamp: created_at,
97
106
  status: 'created',
98
107
  note: 'Harness runtime initialized',
99
108
  });
100
109
  return { harness_dir, contract };
101
110
  }
111
+ export function amend_harness_runtime(params) {
112
+ const contract = read_contract(params.harness_dir);
113
+ const scaffold = contract.scaffold;
114
+ const changes = [];
115
+ const assign = (key, value) => {
116
+ if (value !== undefined) {
117
+ scaffold[key] = value;
118
+ changes.push(String(key));
119
+ }
120
+ };
121
+ assign('task', params.task);
122
+ assign('allowed_paths', params.allowed_paths);
123
+ assign('validation_commands', params.validation_commands);
124
+ assign('allow_test_changes', params.allow_test_changes);
125
+ assign('escalation_rules', params.escalation_rules);
126
+ if (params.planner_model !== undefined ||
127
+ params.planner_thinking !== undefined) {
128
+ scaffold.planner = {
129
+ model: params.planner_model ?? scaffold.planner.model,
130
+ thinking: params.planner_thinking ?? scaffold.planner.thinking,
131
+ };
132
+ changes.push('planner');
133
+ }
134
+ if (params.executor_model !== undefined ||
135
+ params.executor_thinking !== undefined) {
136
+ scaffold.executor = {
137
+ model: params.executor_model ?? scaffold.executor.model,
138
+ thinking: params.executor_thinking ?? scaffold.executor.thinking,
139
+ };
140
+ changes.push('executor');
141
+ }
142
+ if (params.reviewer_model !== undefined ||
143
+ params.reviewer_thinking !== undefined) {
144
+ scaffold.reviewer = {
145
+ model: params.reviewer_model ?? scaffold.reviewer.model,
146
+ thinking: params.reviewer_thinking ?? scaffold.reviewer.thinking,
147
+ };
148
+ changes.push('reviewer');
149
+ }
150
+ if (!changes.length)
151
+ throw new Error('Harness amendment contains no scaffold changes');
152
+ const from_version = scaffold.version;
153
+ scaffold.version += 1;
154
+ const timestamp = now_iso();
155
+ contract.amendments.push({
156
+ timestamp,
157
+ requested_by: params.requested_by ?? 'user',
158
+ reason: params.reason,
159
+ from_version,
160
+ to_version: scaffold.version,
161
+ changes,
162
+ });
163
+ write_contract(params.harness_dir, contract);
164
+ write_generated_runtime(params.harness_dir, contract);
165
+ const entry = {
166
+ timestamp,
167
+ note: `Scaffold amended v${from_version} → v${scaffold.version}: ${params.reason}`,
168
+ };
169
+ const status = read_status(params.harness_dir);
170
+ status.log.push(entry);
171
+ write_status(params.harness_dir, status);
172
+ append_event(params.harness_dir, entry);
173
+ write_outcome_artifacts(params.harness_dir);
174
+ return contract;
175
+ }
102
176
  export function update_harness_runtime(params) {
103
177
  const contract = read_contract(params.harness_dir);
104
- const status_file = read_status(params.harness_dir);
178
+ const status = read_status(params.harness_dir);
105
179
  const entry = {
106
180
  timestamp: now_iso(),
107
181
  status: params.status,
@@ -113,42 +187,40 @@ export function update_harness_runtime(params) {
113
187
  changed_files: params.changed_files,
114
188
  };
115
189
  if (params.status) {
116
- status_file.status = params.status;
190
+ status.status = params.status;
117
191
  contract.status = params.status;
118
192
  }
119
193
  if (params.phase)
120
- status_file.phase = params.phase;
121
- status_file.log.push(entry);
122
- write_status(params.harness_dir, status_file);
194
+ status.phase = params.phase;
195
+ status.log.push(entry);
196
+ write_status(params.harness_dir, status);
123
197
  write_contract(params.harness_dir, contract);
124
198
  append_event(params.harness_dir, entry);
125
199
  write_outcome_artifacts(params.harness_dir);
126
- return status_file;
200
+ return status;
201
+ }
202
+ export function format_harness_status_line(harness_dir) {
203
+ const status = read_status(harness_dir);
204
+ return `🧪 ${status.status}${status.phase ? ` (${status.phase})` : ''}`;
127
205
  }
128
206
  export function format_harness_summary(harness_dir) {
129
207
  const contract = read_contract(harness_dir);
130
- const status_file = read_status(harness_dir);
208
+ const status = read_status(harness_dir);
131
209
  return [
132
210
  `Harness: ${contract.id}`,
133
211
  `Directory: ${harness_dir}`,
134
- `Status: ${status_file.status}${status_file.phase ? ` (${status_file.phase})` : ''}`,
135
- `Task: ${contract.task}`,
136
- `Allowed paths: ${contract.allowed_paths.join(', ') || '(none)'}`,
137
- `Validation: ${contract.validation_commands.join(' && ') || '(none)'}`,
212
+ `Status: ${status.status}${status.phase ? ` (${status.phase})` : ''}`,
213
+ `Scaffold: v${contract.scaffold.version} (${contract.amendments.length} amendments)`,
214
+ `Task: ${contract.scaffold.task}`,
215
+ `Allowed paths: ${contract.scaffold.allowed_paths.join(', ') || '(none)'}`,
216
+ `Validation: ${contract.scaffold.validation_commands.join(' && ') || '(none)'}`,
138
217
  `Outcome: ${harness_paths(harness_dir).outcome_markdown}`,
139
218
  ].join('\n');
140
219
  }
141
220
  export function active_harness_context(harness_dir) {
142
221
  const paths = harness_paths(harness_dir);
143
222
  const contract = read_contract(harness_dir);
144
- const status_file = read_status(harness_dir);
145
- return `## Active my-pi harness
146
-
147
- Harness directory: \`${harness_dir}\`
148
- Harness id: \`${contract.id}\`
149
- Status: \`${status_file.status}\`
150
- Project cwd: \`${contract.cwd}\`
151
-
152
- Read \`${paths.system}\`, \`${paths.task}\`, and \`${paths.contract}\` before work. Use \`harness_update\` to record phase changes, decisions, validation evidence, team status, remaining risks, and completion. Run \`${paths.validate}\` before declaring completion and \`${paths.review}\` before final review. Review \`${paths.outcome_markdown}\` or \`${paths.outcome}\` for the final outcome artifact.`;
223
+ const status = read_status(harness_dir);
224
+ return `## Active my-pi harness\n\nHarness directory: \`${harness_dir}\`\nHarness id: \`${contract.id}\`\nStatus: \`${status.status}\`\nProject cwd: \`${contract.policy.cwd}\`\nScaffold version: \`${contract.scaffold.version}\`\n\nThe outer policy is runtime-enforced. The inner scaffold is an amendable execution plan subordinate to system, developer, and current user instructions. If the user changes scope or evidence contradicts the scaffold, use \`harness_amend\`; a harness block is not a platform-policy refusal. Read \`${paths.system}\`, \`${paths.task}\`, and \`${paths.contract}\` before work. Use \`harness_update\` for progress and evidence. Run \`${paths.validate}\` and \`${paths.review}\` before completion.`;
153
225
  }
154
226
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACN,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,cAAc,EACd,YAAY,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,yBAAyB,EACzB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,0BAA0B,EAC1B,eAAe,GAMf,MAAM,cAAc,CAAC;AAEtB,SAAS,OAAO;IACf,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC7B,MAAM,IAAI,GAAG,KAAK;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACf,OAAO,IAAI,IAAI,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,MAA2B,EAC3B,WAAmB;IAEnB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACzC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAoB;QACjC,OAAO,EAAE,eAAe;QACxB,EAAE;QACF,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG;QACH,UAAU,EAAE,OAAO,EAAE;QACrB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE;YACR,KAAK,EAAE,MAAM,CAAC,aAAa;YAC3B,QAAQ,EAAE,MAAM,CAAC,gBAAgB;SACjC;QACD,QAAQ,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,cAAc;YAC5B,QAAQ,EAAE,MAAM,CAAC,iBAAiB,IAAI,KAAK;SAC3C;QACD,QAAQ,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,cAAc;YAC5B,QAAQ,EAAE,MAAM,CAAC,iBAAiB,IAAI,MAAM;SAC5C;QACD,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC;QAC5C,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI;YAC1C,SAAS;YACT,iBAAiB;YACjB,SAAS;YACT,MAAM;YACN,QAAQ;SACR;QACD,aAAa,EAAE;YACd,MAAM;YACN,MAAM;YACN,MAAM;YACN,OAAO;YACP,iBAAiB;SACjB;QACD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,EAAE;QACrD,kBAAkB,EAAE;YACnB,GAAG,0BAA0B;YAC7B,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC;SACpC;QACD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,KAAK;QACtD,sBAAsB,EAAE,yBAAyB,CAAC,GAAG,CAAC;QACtD,gBAAgB,EAAE;YACjB,uDAAuD;YACvD,mDAAmD;YACnD,uFAAuF;YACvF,uDAAuD;SACvD;KACD,CAAC;IAEF,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACtC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzD,YAAY,CAAC,WAAW,EAAE;QACzB,EAAE;QACF,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE;YACJ;gBACC,SAAS,EAAE,QAAQ,CAAC,UAAU;gBAC9B,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,iBAAiB;aACvB;SACD;KACD,CAAC,CAAC;IACH,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC5D,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACrC,aAAa,CACZ,KAAK,CAAC,MAAM,EACZ,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAChE,CAAC;IACF,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/B,YAAY,CAAC,WAAW,EAAE;QACzB,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,6BAA6B;KACnC,CAAC,CAAC;IACH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,MAA2B;IAE3B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,KAAK,GAAoB;QAC9B,SAAS,EAAE,OAAO,EAAE;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,aAAa,EAAE,MAAM,CAAC,aAAa;KACnC,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,CAAC;IACD,IAAI,MAAM,CAAC,KAAK;QAAE,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACnD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC9C,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACxC,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACzD,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO;QACN,YAAY,QAAQ,CAAC,EAAE,EAAE;QACzB,cAAc,WAAW,EAAE;QAC3B,WAAW,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpF,SAAS,QAAQ,CAAC,IAAI,EAAE;QACxB,kBAAkB,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;QACjE,eAAe,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE;QACtE,YAAY,aAAa,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE;KACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACzD,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO;;uBAEe,WAAW;gBAClB,QAAQ,CAAC,EAAE;YACf,WAAW,CAAC,MAAM;iBACb,QAAQ,CAAC,GAAG;;SAEpB,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,QAAQ,uJAAuJ,KAAK,CAAC,QAAQ,wCAAwC,KAAK,CAAC,MAAM,oCAAoC,KAAK,CAAC,gBAAgB,WAAW,KAAK,CAAC,OAAO,oCAAoC,CAAC;AACnZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -46,7 +46,7 @@ function latest_log_value(log, key) {
46
46
  export function collect_harness_outcome(harness_dir, cwd = process.env.HARNESS_CWD) {
47
47
  const contract = read_contract(harness_dir);
48
48
  const status_file = read_status(harness_dir);
49
- const execution_cwd = resolve(cwd ?? contract.cwd);
49
+ const execution_cwd = resolve(cwd ?? contract.policy.cwd);
50
50
  const validation_evidence = status_file.log
51
51
  .filter((entry) => entry.evidence)
52
52
  .map((entry) => ({
@@ -62,14 +62,14 @@ export function collect_harness_outcome(harness_dir, cwd = process.env.HARNESS_C
62
62
  id: contract.id,
63
63
  status: status_file.status,
64
64
  phase: status_file.phase,
65
- task: contract.task,
66
- cwd: contract.cwd,
65
+ task: contract.scaffold.task,
66
+ cwd: contract.policy.cwd,
67
67
  execution_cwd,
68
68
  generated_at: now_iso(),
69
- changed_files: changed_files(execution_cwd, status_file.log, contract.baseline_changed_files),
70
- baseline_changed_files: contract.baseline_changed_files,
69
+ changed_files: changed_files(execution_cwd, status_file.log, contract.policy.baseline_changed_files),
70
+ baseline_changed_files: contract.policy.baseline_changed_files,
71
71
  validation: {
72
- commands: contract.validation_commands,
72
+ commands: contract.scaffold.validation_commands,
73
73
  evidence: validation_evidence,
74
74
  },
75
75
  team_status: latest_log_value(status_file.log, 'team_status') ??
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../src/runtime/outcome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../src/runtime/outcome.ts"],"names":[],"mappings":"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"}
@@ -2,24 +2,30 @@ import { shell_quote } from './files.js';
2
2
  export function build_system_markdown(contract) {
3
3
  return `# Executor system prompt: ${contract.id}
4
4
 
5
- You are working inside a my-pi task harness. The harness directory is external control state, not the project source.
5
+ You are working inside a my-pi task harness. The harness directory is external control state, not project source. System, developer, and current user instructions remain authoritative.
6
6
 
7
- ## Execution contract
7
+ ## Outer policy (runtime-enforced)
8
8
 
9
- - Project cwd: \`${contract.cwd}\`
10
- - Allowed edit paths: ${contract.allowed_paths.map((path) => `\`${path}\``).join(', ') || 'none'}
11
- - Forbidden edit paths: ${contract.forbidden_paths.map((path) => `\`${path}\``).join(', ') || 'none'}
12
- - Test changes allowed: ${contract.allow_test_changes ? 'yes' : 'no'}
13
- - Validation: ${contract.validation_commands.map((command) => `\`${command}\``).join(', ') || 'none'}
9
+ - Project cwd: \`${contract.policy.cwd}\`
10
+ - Forbidden edit paths: ${contract.policy.forbidden_paths.map((path) => `\`${path}\``).join(', ') || 'none'}
11
+
12
+ The outer policy protects the workspace and verifier. It cannot be weakened by the executor or by \`harness_amend\`.
13
+
14
+ ## Inner scaffold v${contract.scaffold.version} (amendable execution plan)
15
+
16
+ - Allowed edit paths: ${contract.scaffold.allowed_paths.map((path) => `\`${path}\``).join(', ') || 'none'}
17
+ - Test changes allowed: ${contract.scaffold.allow_test_changes ? 'yes' : 'no'}
18
+ - Validation: ${contract.scaffold.validation_commands.map((command) => `\`${command}\``).join(', ') || 'none'}
14
19
 
15
20
  ## Rules
16
21
 
17
22
  1. Recover context from source-of-truth files before editing.
18
- 2. Challenge assumptions and record decisions in \`status.json\` through \`harness_update\`.
19
- 3. Edit only allowed paths.
20
- 4. Do not weaken tests, fake outputs, or bypass validation.
21
- 5. Run \`validate.sh\` before completion.
22
- 6. Escalate instead of silently expanding scope.
23
+ 2. Challenge assumptions and record decisions through \`harness_update\`.
24
+ 3. Treat the scaffold as subordinate to later user instructions. Use \`harness_amend\` when legitimate scope or strategy changes; a harness block is not a platform-policy refusal.
25
+ 4. Edit only allowed paths.
26
+ 5. Do not weaken tests, fake outputs, or bypass validation.
27
+ 6. Run \`validate.sh\` before completion.
28
+ 7. Escalate instead of silently expanding the outer policy.
23
29
  `;
24
30
  }
25
31
  export function build_task_markdown(contract) {
@@ -27,7 +33,7 @@ export function build_task_markdown(contract) {
27
33
 
28
34
  ## Task
29
35
 
30
- ${contract.task}
36
+ ${contract.scaffold.task}
31
37
 
32
38
  ## Required loop
33
39
 
@@ -42,26 +48,28 @@ ${contract.task}
42
48
 
43
49
  ## Escalation rules
44
50
 
45
- ${contract.escalation_rules.map((rule) => `- ${rule}`).join('\n')}
51
+ ${contract.scaffold.escalation_rules.map((rule) => `- ${rule}`).join('\n')}
46
52
  `;
47
53
  }
48
54
  function build_resolve_cwd_script(contract) {
49
- return `contract_cwd=${shell_quote(contract.cwd)}
50
- run_cwd="\${HARNESS_CWD:-$(pwd)}"
51
- if git -C "$run_cwd" rev-parse --git-common-dir >/dev/null 2>&1 && git -C "$contract_cwd" rev-parse --git-common-dir >/dev/null 2>&1; then
52
- run_common=$(git -C "$run_cwd" rev-parse --path-format=absolute --git-common-dir)
53
- contract_common=$(git -C "$contract_cwd" rev-parse --path-format=absolute --git-common-dir)
54
- if [ "$run_common" != "$contract_common" ]; then
55
+ return `contract_cwd=${shell_quote(contract.policy.cwd)}
56
+ run_cwd="$(pwd)"
57
+ contract_common=$(git -C "$contract_cwd" rev-parse --path-format=absolute --git-common-dir 2>/dev/null || true)
58
+ run_common=$(git -C "$run_cwd" rev-parse --path-format=absolute --git-common-dir 2>/dev/null || true)
59
+ if [ -z "$contract_common" ] || [ "$run_common" != "$contract_common" ]; then
60
+ candidate="\${HARNESS_CWD:-$contract_cwd}"
61
+ candidate_common=$(git -C "$candidate" rev-parse --path-format=absolute --git-common-dir 2>/dev/null || true)
62
+ if [ -n "$contract_common" ] && [ "$candidate_common" = "$contract_common" ]; then
63
+ run_cwd="$candidate"
64
+ else
55
65
  run_cwd="$contract_cwd"
56
66
  fi
57
- else
58
- run_cwd="$contract_cwd"
59
67
  fi
60
68
  export HARNESS_CWD="$run_cwd"`;
61
69
  }
62
70
  export function build_validate_script(contract) {
63
- const commands = contract.validation_commands.length
64
- ? contract.validation_commands
71
+ const commands = contract.scaffold.validation_commands.length
72
+ ? contract.scaffold.validation_commands
65
73
  : ['echo "No validation commands configured"'];
66
74
  return `#!/usr/bin/env bash
67
75
  set -euo pipefail
@@ -79,8 +87,20 @@ import { readFileSync } from 'node:fs';
79
87
  import { isAbsolute, relative, resolve } from 'node:path';
80
88
 
81
89
  const contract = JSON.parse(readFileSync(new URL('./harness.json', import.meta.url), 'utf8'));
82
- const cwd = resolve(process.env.HARNESS_CWD || contract.cwd);
83
- const baseline = new Set(contract.baseline_changed_files || []);
90
+
91
+ function resolve_cwd() {
92
+ const contract_cwd = resolve(contract.policy.cwd);
93
+ const candidate = process.env.HARNESS_CWD ? resolve(process.env.HARNESS_CWD) : contract_cwd;
94
+ try {
95
+ const common = (cwd) => execFileSync('git', ['-C', cwd, 'rev-parse', '--path-format=absolute', '--git-common-dir'], { encoding: 'utf8' }).trim();
96
+ return common(candidate) === common(contract_cwd) ? candidate : contract_cwd;
97
+ } catch {
98
+ return contract_cwd;
99
+ }
100
+ }
101
+
102
+ const cwd = resolve_cwd();
103
+ const baseline = new Set(contract.policy.baseline_changed_files || []);
84
104
 
85
105
  function changed_paths() {
86
106
  const status = execFileSync('git', ['-C', cwd, 'status', '--short', '--untracked-files=all'], { encoding: 'utf8' })
@@ -128,9 +148,9 @@ for (const path of changed_paths()) {
128
148
  if (baseline.has(path)) continue;
129
149
  const absolute_path = resolve(cwd, path);
130
150
  if (absolute_path !== cwd && !absolute_path.startsWith(cwd + '/')) violations.push(path + ' is outside cwd');
131
- if (contract.forbidden_paths.some((pattern) => pattern_matches(pattern, path))) violations.push(path + ' matches forbidden_paths');
132
- if (!contract.allow_test_changes && is_test_path(path)) violations.push(path + ' is a test change but allow_test_changes is false');
133
- if (!contract.allowed_paths.some((pattern) => pattern_matches(pattern, path))) violations.push(path + ' is outside allowed_paths');
151
+ if (contract.policy.forbidden_paths.some((pattern) => pattern_matches(pattern, path))) violations.push(path + ' matches forbidden_paths');
152
+ if (!contract.scaffold.allow_test_changes && is_test_path(path)) violations.push(path + ' is a test change but allow_test_changes is false');
153
+ if (!contract.scaffold.allowed_paths.some((pattern) => pattern_matches(pattern, path))) violations.push(path + ' is outside allowed_paths');
134
154
  }
135
155
 
136
156
  if (violations.length) {
@@ -144,14 +164,25 @@ console.log('Harness guard passed');
144
164
  export function build_outcome_script() {
145
165
  return `import { execFileSync } from 'node:child_process';
146
166
  import { readFileSync, writeFileSync } from 'node:fs';
147
- import { dirname, join } from 'node:path';
167
+ import { dirname, join, resolve } from 'node:path';
148
168
  import { fileURLToPath } from 'node:url';
149
169
 
150
170
  const harness_dir = dirname(fileURLToPath(import.meta.url));
151
171
  const contract = JSON.parse(readFileSync(join(harness_dir, 'harness.json'), 'utf8'));
152
172
  const status = JSON.parse(readFileSync(join(harness_dir, 'status.json'), 'utf8'));
153
- const cwd = process.env.HARNESS_CWD || contract.cwd;
154
- const baseline = new Set(contract.baseline_changed_files || []);
173
+ function resolve_cwd() {
174
+ const contract_cwd = resolve(contract.policy.cwd);
175
+ const candidate = process.env.HARNESS_CWD ? resolve(process.env.HARNESS_CWD) : contract_cwd;
176
+ try {
177
+ const common = (cwd) => execFileSync('git', ['-C', cwd, 'rev-parse', '--path-format=absolute', '--git-common-dir'], { encoding: 'utf8' }).trim();
178
+ return common(candidate) === common(contract_cwd) ? candidate : contract_cwd;
179
+ } catch {
180
+ return contract_cwd;
181
+ }
182
+ }
183
+
184
+ const cwd = resolve_cwd();
185
+ const baseline = new Set(contract.policy.baseline_changed_files || []);
155
186
 
156
187
  function git_lines(args) {
157
188
  try {
@@ -176,14 +207,14 @@ const outcome = {
176
207
  id: contract.id,
177
208
  status: status.status,
178
209
  phase: status.phase,
179
- task: contract.task,
180
- cwd: contract.cwd,
210
+ task: contract.scaffold.task,
211
+ cwd: contract.policy.cwd,
181
212
  execution_cwd: cwd,
182
213
  generated_at: new Date().toISOString(),
183
214
  changed_files: unique([...status_files, ...diff_files, ...logged_files]).filter((file) => !baseline.has(file)).sort(),
184
- baseline_changed_files: contract.baseline_changed_files || [],
215
+ baseline_changed_files: contract.policy.baseline_changed_files || [],
185
216
  validation: {
186
- commands: contract.validation_commands,
217
+ commands: contract.scaffold.validation_commands,
187
218
  evidence: status.log
188
219
  .filter((entry) => entry.evidence)
189
220
  .map((entry) => ({ timestamp: entry.timestamp, phase: entry.phase, evidence: entry.evidence })),
@@ -1 +1 @@
1
- {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../src/runtime/renderers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,UAAU,qBAAqB,CACpC,QAAyB;IAEzB,OAAO,6BAA6B,QAAQ,CAAC,EAAE;;;;;;mBAM7B,QAAQ,CAAC,GAAG;wBACP,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;0BACtE,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;0BAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBACpD,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;;;;;;;;;CAUnG,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,QAAyB;IAEzB,OAAO,mBAAmB,QAAQ,CAAC,EAAE;;;;EAIpC,QAAQ,CAAC,IAAI;;;;;;;;;;;;;;;EAeb,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAChE,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAyB;IAC1D,OAAO,gBAAgB,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;;;;;;;;;;;8BAWnB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,QAAyB;IAEzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,mBAAmB,CAAC,MAAM;QACnD,CAAC,CAAC,QAAQ,CAAC,mBAAmB;QAC9B,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;IAChD,OAAO;;EAEN,wBAAwB,CAAC,QAAQ,CAAC;;EAElC,QAAQ;SACR,GAAG,CACH,CACC,OAAO,EACP,KAAK,EACJ,EAAE,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;WACrE,WAAW,CAAC,OAAO,CAAC,EAAE,CAC/B;SACA,IAAI,CAAC,IAAI,CAAC;CACX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEP,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoEP,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,QAAyB,EACzB,UAAkB,EAClB,mBAA2B;IAE3B,OAAO;;EAEN,wBAAwB,CAAC,QAAQ,CAAC;;;;;;;;;OAS7B,WAAW,CAAC,mBAAmB,CAAC;;;OAGhC,WAAW,CAAC,UAAU,CAAC;;;OAGvB,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC9B,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../src/runtime/renderers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CACpC,QAAyB;IAEzB,OAAO,6BAA6B,QAAQ,CAAC,EAAE;;;;;;mBAM7B,QAAQ,CAAC,MAAM,CAAC,GAAG;0BACZ,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;;;qBAItF,QAAQ,CAAC,QAAQ,CAAC,OAAO;;wBAEtB,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;0BAC/E,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBAC7D,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;;;;;;;;;;CAW5G,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,QAAyB;IAEzB,OAAO,mBAAmB,QAAQ,CAAC,EAAE;;;;EAIpC,QAAQ,CAAC,QAAQ,CAAC,IAAI;;;;;;;;;;;;;;;EAetB,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACzE,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAyB;IAC1D,OAAO,gBAAgB,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;;;;;;;;;;;;;8BAa1B,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,QAAyB;IAEzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM;QAC5D,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB;QACvC,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;IAChD,OAAO;;EAEN,wBAAwB,CAAC,QAAQ,CAAC;;EAElC,QAAQ;SACR,GAAG,CACH,CACC,OAAO,EACP,KAAK,EACJ,EAAE,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;WACrE,WAAW,CAAC,OAAO,CAAC,EAAE,CAC/B;SACA,IAAI,CAAC,IAAI,CAAC;CACX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6EP,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+EP,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,QAAyB,EACzB,UAAkB,EAClB,mBAA2B;IAE3B,OAAO;;EAEN,wBAAwB,CAAC,QAAQ,CAAC;;;;;;;;;OAS7B,WAAW,CAAC,mBAAmB,CAAC;;;OAGhC,WAAW,CAAC,UAAU,CAAC;;;OAGvB,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC9B,CAAC;AACF,CAAC"}
package/dist/schema.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Type, type Static } from 'typebox';
2
- export declare const HARNESS_VERSION = 1;
2
+ export declare const HARNESS_VERSION = 2;
3
3
  export declare const HARNESS_CUSTOM_TYPE = "pi-harness-state";
4
4
  export declare const DEFAULT_FORBIDDEN_COMMANDS: string[];
5
5
  export declare const thinking_levels_schema: Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"xhigh">]>;
@@ -31,19 +31,39 @@ export declare const harness_update_params_schema: Type.TObject<{
31
31
  changed_files: Type.TOptional<Type.TArray<Type.TString>>;
32
32
  }>;
33
33
  export type HarnessUpdateParams = Static<typeof harness_update_params_schema>;
34
+ export declare const harness_amend_params_schema: Type.TObject<{
35
+ harness_dir: Type.TString;
36
+ reason: Type.TString;
37
+ requested_by: Type.TOptional<Type.TUnion<[Type.TLiteral<"user">, Type.TLiteral<"planner">]>>;
38
+ task: Type.TOptional<Type.TString>;
39
+ allowed_paths: Type.TOptional<Type.TArray<Type.TString>>;
40
+ validation_commands: Type.TOptional<Type.TArray<Type.TString>>;
41
+ allow_test_changes: Type.TOptional<Type.TBoolean>;
42
+ escalation_rules: Type.TOptional<Type.TArray<Type.TString>>;
43
+ planner_model: Type.TOptional<Type.TString>;
44
+ planner_thinking: Type.TOptional<Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"xhigh">]>>;
45
+ executor_model: Type.TOptional<Type.TString>;
46
+ executor_thinking: Type.TOptional<Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"xhigh">]>>;
47
+ reviewer_model: Type.TOptional<Type.TString>;
48
+ reviewer_thinking: Type.TOptional<Type.TUnion<[Type.TLiteral<"off">, Type.TLiteral<"minimal">, Type.TLiteral<"low">, Type.TLiteral<"medium">, Type.TLiteral<"high">, Type.TLiteral<"xhigh">]>>;
49
+ }>;
50
+ export type HarnessAmendParams = Static<typeof harness_amend_params_schema>;
34
51
  export declare const harness_read_params_schema: Type.TObject<{
35
52
  harness_dir: Type.TString;
36
53
  }>;
37
54
  export type HarnessReadParams = Static<typeof harness_read_params_schema>;
38
55
  export type HarnessStatus = 'created' | 'running' | 'reviewing' | 'completed' | 'failed';
39
56
  export type HarnessThinking = Static<typeof thinking_levels_schema>;
40
- export interface HarnessContract {
41
- version: typeof HARNESS_VERSION;
42
- id: string;
43
- task: string;
57
+ export interface HarnessPolicy {
44
58
  cwd: string;
45
- created_at: string;
46
- status: HarnessStatus;
59
+ forbidden_paths: string[];
60
+ allowed_tools: string[];
61
+ forbidden_commands: string[];
62
+ baseline_changed_files: string[];
63
+ }
64
+ export interface HarnessScaffold {
65
+ version: number;
66
+ task: string;
47
67
  planner: {
48
68
  model?: string;
49
69
  thinking?: HarnessThinking;
@@ -57,13 +77,26 @@ export interface HarnessContract {
57
77
  thinking?: HarnessThinking;
58
78
  };
59
79
  allowed_paths: string[];
60
- forbidden_paths: string[];
61
- allowed_tools: string[];
62
80
  validation_commands: string[];
63
- forbidden_commands: string[];
64
81
  allow_test_changes: boolean;
65
82
  escalation_rules: string[];
66
- baseline_changed_files: string[];
83
+ }
84
+ export interface HarnessAmendment {
85
+ timestamp: string;
86
+ requested_by: 'user' | 'planner';
87
+ reason: string;
88
+ from_version: number;
89
+ to_version: number;
90
+ changes: string[];
91
+ }
92
+ export interface HarnessContract {
93
+ version: typeof HARNESS_VERSION;
94
+ id: string;
95
+ created_at: string;
96
+ status: HarnessStatus;
97
+ policy: HarnessPolicy;
98
+ scaffold: HarnessScaffold;
99
+ amendments: HarnessAmendment[];
67
100
  }
68
101
  export interface HarnessLogEntry {
69
102
  timestamp: string;
package/dist/schema.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Type } from 'typebox';
2
- export const HARNESS_VERSION = 1;
2
+ export const HARNESS_VERSION = 2;
3
3
  export const HARNESS_CUSTOM_TYPE = 'pi-harness-state';
4
4
  export const DEFAULT_FORBIDDEN_COMMANDS = [
5
5
  'rm -rf .git',
@@ -54,6 +54,26 @@ export const harness_update_params_schema = Type.Object({
54
54
  remaining_risks: Type.Optional(Type.Array(Type.String())),
55
55
  changed_files: Type.Optional(Type.Array(Type.String())),
56
56
  });
57
+ export const harness_amend_params_schema = Type.Object({
58
+ harness_dir: Type.String({
59
+ description: 'Harness directory in /tmp',
60
+ }),
61
+ reason: Type.String({
62
+ description: 'Why the scaffold must change',
63
+ }),
64
+ requested_by: Type.Optional(Type.Union([Type.Literal('user'), Type.Literal('planner')])),
65
+ task: Type.Optional(Type.String()),
66
+ allowed_paths: Type.Optional(Type.Array(Type.String())),
67
+ validation_commands: Type.Optional(Type.Array(Type.String())),
68
+ allow_test_changes: Type.Optional(Type.Boolean()),
69
+ escalation_rules: Type.Optional(Type.Array(Type.String())),
70
+ planner_model: Type.Optional(Type.String()),
71
+ planner_thinking: Type.Optional(thinking_levels_schema),
72
+ executor_model: Type.Optional(Type.String()),
73
+ executor_thinking: Type.Optional(thinking_levels_schema),
74
+ reviewer_model: Type.Optional(Type.String()),
75
+ reviewer_thinking: Type.Optional(thinking_levels_schema),
76
+ });
57
77
  export const harness_read_params_schema = Type.Object({
58
78
  harness_dir: Type.String({
59
79
  description: 'Harness directory in /tmp',
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spences10/pi-harness",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Ephemeral task harness runtime for my-pi agent workflows",
5
5
  "keywords": [
6
6
  "agent",
@@ -36,11 +36,11 @@
36
36
  "access": "public"
37
37
  },
38
38
  "devDependencies": {
39
- "@earendil-works/pi-coding-agent": "0.80.3",
39
+ "@earendil-works/pi-coding-agent": "0.80.6",
40
40
  "@types/node": "^25.8.0",
41
41
  "typebox": "^1.1.38",
42
- "typescript": "^6.0.3",
43
- "vitest": "4.1.9"
42
+ "typescript": "^7.0.2",
43
+ "vitest": "4.1.10"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@earendil-works/pi-coding-agent": "*",
@@ -20,15 +20,25 @@ after context gathering.
20
20
  or evidence the harness is grounded in.
21
21
  3. Challenge assumptions: identify uncertainties and whether the
22
22
  executor may decide or must escalate.
23
- 4. Define the execution contract: allowed paths, forbidden paths,
24
- validation commands, test-change policy, and forbidden shortcuts.
23
+ 4. Define both layers: the outer policy contains workspace/verifier
24
+ protections; the inner scaffold contains task scope, validation,
25
+ test strategy, and model roles.
25
26
  5. Call `harness_create` with the task and contract fields.
26
27
  6. If the `team` tool is available, create or reuse a team and call
27
28
  `task_create` with the harness directory in the description.
28
29
  7. Read back the created harness path and report how to run it with
29
30
  `/harness run <dir>`.
30
31
 
31
- ## Contract Guidance
32
+ ## Policy and Scaffold Guidance
33
+
34
+ - Outer policy fields (`cwd`, forbidden paths/commands, tool surface,
35
+ dirty baseline) are runtime-owned and cannot be weakened by
36
+ `harness_amend`.
37
+ - Inner scaffold fields (task, allowed paths, validation, test policy,
38
+ model roles, escalation rules) are versioned and amendable when user
39
+ direction or evidence changes.
40
+ - The scaffold is subordinate to system, developer, and current user
41
+ instructions.
32
42
 
33
43
  - Keep `allowed_paths` narrow. Use `.` only when the task genuinely
34
44
  spans the repo.
@@ -8,8 +8,10 @@ compatibility:
8
8
 
9
9
  # Execute Harness
10
10
 
11
- Run the task through an existing my-pi harness. The harness is the
12
- execution contract.
11
+ Run the task through an existing my-pi harness. Its outer policy is
12
+ the runtime trust boundary; its versioned inner scaffold is an
13
+ amendable execution plan subordinate to system, developer, and current
14
+ user instructions.
13
15
 
14
16
  ## Workflow
15
17
 
@@ -30,8 +32,10 @@ execution contract.
30
32
  evidence, and report changed files plus risks. If using a worktree,
31
33
  set `HARNESS_CWD` to that worktree for validation and review.
32
34
  6. Recover any remaining source-of-truth context needed to act safely.
33
- 7. Execute surgically inside `allowed_paths`; do not fight
34
- enforcement.
35
+ 7. Execute surgically inside `scaffold.allowed_paths`. If user
36
+ direction or source evidence changes legitimate scope or strategy,
37
+ use `harness_amend` and record the reason rather than treating the
38
+ scaffold as immutable.
35
39
  8. Record decisions, phase changes, and validation evidence with
36
40
  `harness_update`, including team status and remaining risks when
37
41
  known.
@@ -47,10 +51,12 @@ execution contract.
47
51
 
48
52
  ## Rules
49
53
 
50
- - Do not edit outside the harness contract.
54
+ - Do not bypass the outer policy. Do not edit outside the active
55
+ scaffold without first recording an authorized amendment.
51
56
  - Do not weaken tests, fake outputs, or bypass validation.
52
- - If enforcement blocks an action, update the harness as failed or ask
53
- for a planner/user amendment.
57
+ - An enforcement block is a harness mismatch, not a platform-policy
58
+ refusal. Amend the scaffold when authorized; otherwise ask the user.
59
+ Mark failed only when the task cannot proceed.
54
60
  - If validation fails after one focused fix attempt, escalate.
55
61
  - If team mode is unavailable, run the harness directly in the current
56
62
  session and say that no teammate was spawned.
@@ -8,7 +8,8 @@ compatibility:
8
8
 
9
9
  # Review Harness
10
10
 
11
- Review the completed or failed work against the harness contract.
11
+ Review completed or failed work against the immutable outer policy and
12
+ the complete versioned scaffold/amendment history.
12
13
 
13
14
  ## Workflow
14
15
 
@@ -17,15 +18,18 @@ Review the completed or failed work against the harness contract.
17
18
  `logs/events.jsonl` if present.
18
19
  2. Run or inspect `<harness_dir>/review.sh`.
19
20
  3. Inspect git diff and changed files.
20
- 4. Compare changes against `allowed_paths`, `forbidden_paths`,
21
- test-change policy, and escalation rules.
21
+ 4. Compare changes against `policy.forbidden_paths`, the active
22
+ `scaffold.allowed_paths`, test policy, escalation rules, and all
23
+ recorded amendments.
22
24
  5. Verify validation evidence from `status.json`, logs, and command
23
25
  output.
24
26
  6. Decide: pass, needs executor fix, or escalate to planner/user.
25
27
 
26
28
  ## Review Checks
27
29
 
28
- - Did work stay inside allowed paths?
30
+ - Did work stay inside the outer policy and active scaffold?
31
+ - Were scaffold changes authorized, versioned, and honestly recorded?
32
+ - Did any amendment attempt to weaken the outer trust boundary?
29
33
  - Were tests changed when `allow_test_changes` is false?
30
34
  - Were validators weakened, deleted, skipped, or bypassed?
31
35
  - Were outputs faked or hardcoded to satisfy checks?