open-research-protocol 0.4.26 → 0.4.27

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.
@@ -40,20 +40,24 @@ If the agent only remembers one ORP loop, it should be this:
40
40
  ```bash
41
41
  orp status --json
42
42
  ```
43
- 3. resolve the right secret
43
+ 3. classify dirty worktree state before expansion
44
+ ```bash
45
+ orp hygiene --json
46
+ ```
47
+ 4. resolve the right secret
44
48
  ```bash
45
49
  orp secrets ensure --alias <alias> --provider <provider> --current-project --json
46
50
  ```
47
- 4. inspect the current frontier
51
+ 5. inspect the current frontier
48
52
  ```bash
49
53
  orp frontier state --json
50
54
  ```
51
- 5. if the work feels confusing or too large, break it down before moving
55
+ 6. if the work feels confusing or too large, break it down before moving
52
56
  ```bash
53
57
  orp mode breakdown granular-breakdown --json
54
58
  ```
55
- 6. do the next honest move
56
- 7. checkpoint it honestly
59
+ 7. do the next honest move
60
+ 8. checkpoint it honestly
57
61
  ```bash
58
62
  orp checkpoint create -m "checkpoint note" --json
59
63
  ```
@@ -62,6 +66,7 @@ That is the ORP rhythm in one line:
62
66
 
63
67
  - recover continuity
64
68
  - inspect repo safety
69
+ - classify dirty state and stop if anything is unowned
65
70
  - resolve access
66
71
  - inspect context
67
72
  - break down complexity when comprehension would help
@@ -98,6 +103,11 @@ artifact paths (code/data/proofs/logs/papers).
98
103
  - Treat **failed paths** as assets: record dead ends as a `Failed Path Record` with the blocking reason/counterexample and a
99
104
  next hook.
100
105
  - Resolve disputes by **verification or downgrade**, not argument.
106
+ - Run `orp hygiene --json` before long delegation, after material writeback, before API/remote/paid compute, and when dirty
107
+ state grows unexpectedly.
108
+ - Stop long-running expansion while hygiene reports `dirty_unclassified`; classify, refresh generated surfaces, canonicalize
109
+ useful scratch, or write a blocker before continuing.
110
+ - Hygiene is non-destructive: never reset, checkout, or delete files merely to hide dirty state.
101
111
 
102
112
  ### How to work in an ORP repo
103
113
 
package/CHANGELOG.md CHANGED
@@ -6,6 +6,36 @@ There was no prior in-repo changelog file, so the first formal entry starts
6
6
  with the currently shipped `v0.4.4` release and summarizes the full release
7
7
  delta reflected in this repo.
8
8
 
9
+ ## v0.4.27 - 2026-04-18
10
+
11
+ This release adds a staged OpenAI research profile and default-on worktree
12
+ hygiene for agent loops. ORP-initialized repos now teach agents when to stop,
13
+ classify dirty paths, refresh generated surfaces, canonicalize scratch, or
14
+ write a blocker instead of letting unowned worktree state become invisible.
15
+
16
+ ### Added
17
+
18
+ - Added the built-in `deep-think-web-think-deep` research profile: Deep
19
+ Research, high-reasoning think, think plus web synthesis, high-reasoning
20
+ think, and a final Deep Research pass.
21
+ - Added profile listing/show commands and MCP exposure so Codex-like clients
22
+ can discover staged research templates and fill project-specific fields.
23
+ - Added `orp hygiene --json` and the `orp workspace hygiene --json` alias for
24
+ non-destructive worktree classification with dirty counts, categories,
25
+ unclassified and scratch counts, required action, and recommended next checks.
26
+ - Added `orp/hygiene-policy.json` scaffolding during `orp init` so each project
27
+ can customize canonical surfaces, artifact roots, scratch paths, and
28
+ classification rules.
29
+
30
+ ### Changed
31
+
32
+ - Updated ORP agent docs, generated handoffs, agent policy, project context,
33
+ home/about metadata, and workspace help to include the hygiene stop rule:
34
+ no long-running expansion while dirty paths are unclassified.
35
+ - Research runs now persist generated lane prompts and can pass prior lane
36
+ outputs into later staged prompts while skipping live later-stage calls when
37
+ prerequisites are incomplete.
38
+
9
39
  ## v0.4.26 - 2026-04-17
10
40
 
11
41
  This release adds ORP-native project context and OpenAI research-loop support,
package/bin/orp.js CHANGED
@@ -36,24 +36,14 @@ async function runWorkspace(args) {
36
36
  process.exit(code == null ? 0 : code);
37
37
  }
38
38
 
39
- async function main() {
40
- if (argv[0] === "compute") {
41
- await runCompute(argv.slice(1));
42
- return;
43
- }
44
- if (argv[0] === "workspace") {
45
- await runWorkspace(argv.slice(1));
46
- return;
47
- }
48
-
49
- const captureOutput = isTopLevelHelp(argv);
39
+ function runPythonCli(args, { captureOutput }) {
50
40
  let lastErr = null;
51
41
 
52
42
  for (const py of candidates) {
53
- const args = py === "py" ? ["-3", cliPath, ...argv] : [cliPath, ...argv];
43
+ const pyArgs = py === "py" ? ["-3", cliPath, ...args] : [cliPath, ...args];
54
44
  const result = spawnSync(
55
45
  py,
56
- args,
46
+ pyArgs,
57
47
  captureOutput
58
48
  ? { encoding: "utf8" }
59
49
  : { stdio: "inherit" },
@@ -68,7 +58,7 @@ async function main() {
68
58
  process.stderr.write(result.stderr);
69
59
  }
70
60
  if (result.status === 0) {
71
- process.stdout.write("\nAdditional wrapper surface:\n orp compute -h\n orp workspace tabs -h\n");
61
+ process.stdout.write("\nAdditional wrapper surface:\n orp compute -h\n orp workspace tabs -h\n orp workspace hygiene --json\n");
72
62
  }
73
63
  }
74
64
  process.exit(result.status == null ? 1 : result.status);
@@ -88,6 +78,23 @@ async function main() {
88
78
  process.exit(1);
89
79
  }
90
80
 
81
+ async function main() {
82
+ if (argv[0] === "compute") {
83
+ await runCompute(argv.slice(1));
84
+ return;
85
+ }
86
+ if (argv[0] === "workspace" && argv[1] === "hygiene") {
87
+ runPythonCli(["hygiene", ...argv.slice(2)], { captureOutput: false });
88
+ return;
89
+ }
90
+ if (argv[0] === "workspace") {
91
+ await runWorkspace(argv.slice(1));
92
+ return;
93
+ }
94
+
95
+ runPythonCli(argv, { captureOutput: isTopLevelHelp(argv) });
96
+ }
97
+
91
98
  main().catch((error) => {
92
99
  console.error(String(error && error.stack ? error.stack : error));
93
100
  process.exit(1);