lossless-openclaw-orchestrator 1.2.0 → 1.2.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.
package/README.md CHANGED
@@ -20,10 +20,10 @@ safe action without rereading raw transcripts.
20
20
  | --- | --- |
21
21
  | Searchable local session memory | Find plans, finals, touched files, and refs without raw transcript rereads. |
22
22
  | Bounded evidence expansion | Read compact public-safe briefs before opening larger source material. |
23
- | Approval-gated control | Dry-run Codex actions and verify matching audit ids before live control. |
24
- | OpenClaw/MCP tools | Use the same local-first recall and control surfaces from agent workflows. |
23
+ | Approval-gated boundaries | Dry-run Codex actions and verify matching audit ids before any live control. |
24
+ | OpenClaw/MCP tools | Use the same local-first recall and approval-bounded surfaces from agent workflows. |
25
25
 
26
- [Setup](docs/SETUP.md) · [Contributing](CONTRIBUTING.md) · [Agent Instructions](AGENTS.md) · [Agent Skill](skills/lossless-openclaw-orchestrator/SKILL.md) · [OpenClaw Plugin](docs/OPENCLAW_PLUGIN.md) · [Security](SECURITY.md) · [Code of Conduct](CODE_OF_CONDUCT.md) · [Vision](VISION.md) · [Privacy](docs/PRIVACY.md) · [Claude Boundary](docs/CLAUDE_ADAPTER_BOUNDARY.md) · [Claim Audit](docs/CLAIM_AUDIT.md) · [Release Notes](docs/RELEASE_NOTES_1.2.0-beta.0.md) · [1.1.4 Notes](docs/RELEASE_NOTES_1.1.4.md) · [1.0 Notes](docs/RELEASE_NOTES_1.0.0.md) · [License](LICENSE)
26
+ [Setup](docs/SETUP.md) · [Contributing](CONTRIBUTING.md) · [Agent Instructions](AGENTS.md) · [Agent Skill](skills/lossless-openclaw-orchestrator/SKILL.md) · [OpenClaw Plugin](docs/OPENCLAW_PLUGIN.md) · [Security](SECURITY.md) · [Code of Conduct](CODE_OF_CONDUCT.md) · [Vision](VISION.md) · [Privacy](docs/PRIVACY.md) · [Claude Boundary](docs/CLAUDE_ADAPTER_BOUNDARY.md) · [Claim Audit](docs/CLAIM_AUDIT.md) · [Release Notes](docs/RELEASE_NOTES_1.2.1.md) · [1.2.0 Notes](docs/RELEASE_NOTES_1.2.0.md) · [1.1.4 Notes](docs/RELEASE_NOTES_1.1.4.md) · [1.0 Notes](docs/RELEASE_NOTES_1.0.0.md) · [License](LICENSE)
27
27
 
28
28
  ## Why It Matters
29
29
 
@@ -322,18 +322,18 @@ connector URLs, or customer data into public issues or PRs. Use
322
322
  ## Roadmap And Proof Status
323
323
 
324
324
  The stable public product is Codex-first local orchestration: index, search,
325
- describe, expand, OpenClaw/MCP tools, and approval-gated dry-run/live-control
326
- boundaries.
327
-
328
- Current deeper product work is the 1.2 prepared-state and summary-leaves lane.
329
- It is tracked in GitHub issues, summarized in [VISION.md](VISION.md), and
330
- handed off in
325
+ describe, expand, prepared-state recall, OpenClaw/MCP tools, and
326
+ approval-gated dry-run/control boundaries.
327
+
328
+ The 1.2 prepared-state and summary-leaves lane is shipped in stable `1.2.1`.
329
+ Current launch work is the M11 GA assurance sprint, tracked in GitHub and
330
+ summarized in [VISION.md](VISION.md). Keep sprint and agent-operator details
331
+ there, in [AGENTS.md](AGENTS.md), and in the packaged
332
+ [agent skill](skills/lossless-openclaw-orchestrator/SKILL.md), not in this
333
+ public landing page. The historical 1.2 architecture handoff remains in
331
334
  [docs/sprints/brief-lco-1.2-prepared-state-summary-leaves-2026-07-03.md](docs/sprints/brief-lco-1.2-prepared-state-summary-leaves-2026-07-03.md).
332
- Keep sprint and agent-operator details there, in [AGENTS.md](AGENTS.md), and in
333
- the packaged [agent skill](skills/lossless-openclaw-orchestrator/SKILL.md), not
334
- in this public landing page.
335
335
 
336
- The 1.2 lane is local, deterministic, and opt-in. It is building
336
+ The shipped 1.2 layer is local, deterministic, and opt-in. It provides
337
337
  source-ref-backed ranges, summary leaves, prepared cards, persisted watcher
338
338
  observations, execute-false local attention queue items, and hook capture so an
339
339
  OpenClaw/Eva agent can start from compact prepared state rather than rereading
@@ -359,9 +359,9 @@ path:
359
359
  - [Claim Audit](docs/CLAIM_AUDIT.md)
360
360
  - [QA Demo](docs/BETA_RELEASE_DEMO.md)
361
361
 
362
- For `1.0`, the general release checklist requires fresh npm clean-profile
363
- evidence, agent dogfood evidence through gateway tools, CI, scorecards, and
364
- claim-audit proof before `latest` promotion.
362
+ For stable releases, the general release checklist requires fresh npm
363
+ clean-profile evidence, agent dogfood evidence through gateway tools, CI,
364
+ scorecards, and claim-audit proof before `latest` promotion.
365
365
 
366
366
  Versioned proof contracts live in `evals/scorecards/v1.0` and
367
367
  `evals/scenarios/v1`; runtime-required scenario contracts live in
@@ -402,6 +402,4 @@ under those terms.
402
402
  Commercial, internal-business, hosted-service, or product use requires a
403
403
  separate commercial license from the project owner.
404
404
 
405
- Earlier prerelease artifacts that previously carried MIT metadata are no longer
406
- published on npm. Any copies already downloaded remain governed by the license
407
- terms distributed with those copies.
405
+ Email admin@electricsheephq.com for licensing information.
package/VISION.md CHANGED
@@ -8,19 +8,22 @@ An OpenClaw agent can understand, search, summarize, and safely coordinate a use
8
8
 
9
9
  The stable product should feel like a local orchestration cockpit: OpenClaw can see what Codex sessions exist, what each session is working on, which plans and final messages matter, which files were touched, and which next action would be safe to dry-run or execute only after explicit approval.
10
10
 
11
- ## Current Milestone: 1.2 Prepared State And Summary Leaves
11
+ ## Current Milestone: 1.2.0 GA Assurance And Global Launch Readiness
12
12
 
13
- The current design/build lane is LCO 1.2: prepared state, summary leaves, watcher observations, and hook capture foundations. The sprint brief is [docs/sprints/brief-lco-1.2-prepared-state-summary-leaves-2026-07-03.md](docs/sprints/brief-lco-1.2-prepared-state-summary-leaves-2026-07-03.md). GitHub milestone, tracker, and child issues own implementation truth once filed; this file owns the product and eval boundary.
13
+ The current release-readiness lane is Milestone 11: LCO 1.2.0 GA Assurance And Global Launch Readiness. GitHub tracker [#478](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/478) and children [#479](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/479)-[#493](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/493) own implementation truth; this file owns the product and eval boundary.
14
14
 
15
- The stable 1.0.0, 1.1.0, 1.1.1, 1.1.2, 1.1.3, and 1.1.4 packages have shipped on npm `latest` and their GitHub Releases are published. The post-GA Desktop claim-validation lane [#306](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/306) records that Desktop-visible classification and fallback readiness/status are proven, while actual Codex GUI mutation remains excluded. Desktop parity [#307](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/307) added the coherence classifier; desktop fallback [#308](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/308) added the CUA-first and Peekaboo-secondary readiness report. The 1.1 collaboration cockpit [#309](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/309) is completed proof for read-only collaboration summaries and execute-false next steps, not the current active child-work list.
15
+ The stable 1.0.0, 1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.2.0, and 1.2.1 packages have shipped on npm `latest` and their GitHub Releases are published. The post-GA Desktop claim-validation lane [#306](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/306) records that Desktop-visible classification and fallback readiness/status are proven, while actual Codex GUI mutation remains excluded. Desktop parity [#307](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/307) added the coherence classifier; desktop fallback [#308](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/308) added the CUA-first and Peekaboo-secondary readiness report. The 1.1 collaboration cockpit [#309](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/309) is completed proof for read-only collaboration summaries and execute-false next steps, not the current active child-work list.
16
16
 
17
17
  The Codex Autonomy Cockpit [#254](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/254) and Eva Operating Picture [#255](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/255) P0 lanes are completed beta foundation, not the current active child-work list. Completed P0 children include shared contracts [#256](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/256), source authority [#258](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/258), watcher/resume requests [#259](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/259), visible Codex map joins [#260](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/260), deterministic GitHub operating inputs [#264](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/264)/[#265](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/265), current-lane source balancing [#269](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/269), GitHub check-state fidelity [#270](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/270), cockpit card cleanup [#271](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/271), and end-to-end Eva cockpit dogfood [#272](https://github.com/100yenadmin/Lossless-Codex-Orchestrator-LCO/issues/272). The sprint brief remains the historical handoff for that P0 work: [docs/sprints/brief-lco-codex-autonomy-cockpit-sprint-2026-07-01.md](docs/sprints/brief-lco-codex-autonomy-cockpit-sprint-2026-07-01.md).
18
18
 
19
- The core Codex recall, M9 handoff paths, Codex Autonomy Cockpit, Eva Operating Picture P0 paths, 1.1 Desktop collaboration cockpit paths, release metadata, package/gateway setup proof, docs truth, release gates, public-safe scorecards, post-publish fresh npm `@latest` install proof, and stable publication lanes are no longer the main gap. The next gap is reducing reread cost for huge local Codex histories: make an OpenClaw/Eva agent start from deterministic prepared state, summary leaves, source ranges, freshness, confidence, and authority coverage before it asks for bounded expansion.
19
+ The core Codex recall, M9 handoff paths, Codex Autonomy Cockpit, Eva Operating Picture P0 paths, 1.1 Desktop collaboration cockpit paths, 1.2 prepared-state and summary-leaf paths, release metadata, package/gateway setup proof, docs truth, release gates, public-safe scorecards, post-publish fresh npm `@latest` install proof, and stable publication lanes are no longer the main product gap. The current gap is no-bug-left-behind launch assurance: prove the published `1.2.1` package is installable, discoverable, public-safe, and honest for global users before broad rollout.
20
20
 
21
21
  The current target is:
22
22
 
23
- - File and execute the 1.2 prepared-state tracker and child issues from the sprint brief, using test/eval-first slices and public-safe evidence.
23
+ - Execute the M11 GA assurance tracker and children using public-safe evidence under `/Volumes/LEXAR/Codex/lossless-openclaw-orchestrator/2026-07-05/m11-ga-assurance/`.
24
+ - Keep the launch claim scoped to local Codex prepared-state recall, search/describe/expand, summary leaves, prepared inbox/cards, OpenClaw gateway use, and approval-gated dry-run/control boundaries.
25
+ - Fix or defer every P0-P3 launch finding with terminal disposition before calling the release globally ready.
26
+ - Keep the 1.2 prepared-state tracker as completed proof, not the current active child-work list. The sprint brief remains the historical architecture handoff: [docs/sprints/brief-lco-1.2-prepared-state-summary-leaves-2026-07-03.md](docs/sprints/brief-lco-1.2-prepared-state-summary-leaves-2026-07-03.md).
24
27
  - Keep prepared state as advisory cache: cards, inbox items, and summary leaves route an agent to source refs; they do not become authority for PR/CI/release/runtime/customer truth.
25
28
  - Classify mutations explicitly: pure reads use empty `mutationClasses`, LCO-owned indexing/audit/prepared-state writes use `mode: "local_cache_write"` with `derived_cache`, and source-store, external-system, live-control, GUI, release, and npm mutations stay non-default.
26
29
  - Add source ranges and summary leaves as an additive DB layer behind the existing search/describe/expand tools instead of rewriting the current session-level DB in one migration. Source ranges are the first 1.2 proof slice; summary leaves sit on top as metadata-only routing/evidence cards with bounded DAG expansion.
@@ -35,7 +38,7 @@ The current target is:
35
38
  - Keep P1 source adapters, including Notion, support-control, Company Brain, Stripe, dashboard/export, and model summarization, behind separate adapters and proof gates; P0 tools report those sources as `not_configured` instead of fabricating summaries.
36
39
  - Use the [source authority profile](docs/SOURCE_AUTHORITY_PROFILE.md) to distinguish "this source returned data" from "this source owns the current truth"; unavailable or cache-only sources must degrade claims to `unknown` or low confidence.
37
40
 
38
- The sprint remains Codex-first, local-first, read-only-first, and public-safe by default. It does not claim full business truth, customer readiness, Claude Code parity, remote sync, generic GUI mutation, unattended desktop control, permission bypass, or enterprise/customer-ready security. npm `latest` promotion and GitHub Release creation are complete for 1.0.0. Desktop-visible classification and fallback readiness/status are proven by #307/#308; actual Codex GUI mutation remains excluded until a future action-bound proof gate records the exact backend, target, action hash, approval, and observation.
41
+ The sprint remains Codex-first, local-first, read-only-first, and public-safe by default. It does not claim full business truth, customer readiness, Claude Code parity, remote sync, generic GUI mutation, unattended desktop control, permission bypass, or enterprise/customer-ready security. npm `latest` promotion and GitHub Release creation are complete for 1.2.1. Desktop-visible classification and fallback readiness/status are proven by #307/#308; actual Codex GUI mutation remains excluded until a future action-bound proof gate records the exact backend, target, action hash, approval, and observation.
39
42
 
40
43
  What 1.2 should let a local OpenClaw agent do next:
41
44
 
@@ -291,9 +294,9 @@ Release candidates follow [docs/BETA_RELEASE_RUNBOOK.md](docs/BETA_RELEASE_RUNBO
291
294
 
292
295
  ## Proof Boundary
293
296
 
294
- Allowed public beta claim:
297
+ Allowed stable 1.2.1 claim:
295
298
 
296
- > Control and collaborate with local Codex sessions through OpenClaw using local indexing, bounded recall, and approval-gated controls.
299
+ > Collaborate with local Codex sessions through OpenClaw using local indexing, prepared-state recall, bounded expansion, and approval-gated dry-run/control boundaries.
297
300
 
298
301
  Do not claim:
299
302
 
@@ -107,7 +107,13 @@ export function runOpenClawToolSmoke(options = {}) {
107
107
  tokenBudget,
108
108
  desktopFallbackCoherence: options.desktopFallbackCoherence
109
109
  });
110
- if (toolName === "loo_describe_session" || toolName === "loo_expand_session" || toolName === "loo_codex_control_dry_run" || toolName === "loo_codex_desktop_coherence" || toolName === "loo_codex_desktop_fallback_status") {
110
+ if (toolName === "loo_describe_ref"
111
+ || toolName === "loo_describe_session"
112
+ || toolName === "loo_expand_session"
113
+ || toolName === "loo_codex_control_dry_run"
114
+ || toolName === "loo_codex_resume_thread"
115
+ || toolName === "loo_codex_desktop_coherence"
116
+ || toolName === "loo_codex_desktop_fallback_status") {
111
117
  if (!args) {
112
118
  blockers.push("openclaw_tool_smoke_missing_thread_ref");
113
119
  continue;
@@ -413,6 +419,8 @@ function sanitizeEvidencePath(evidencePath) {
413
419
  function buildToolArgs(params) {
414
420
  if (params.toolName === "loo_search_sessions")
415
421
  return { query: params.query, limit: 3 };
422
+ if (params.toolName === "loo_describe_ref")
423
+ return params.threadId ? { source_ref: `codex_thread:${params.threadId}` } : null;
416
424
  if (params.toolName === "loo_describe_session")
417
425
  return params.threadId ? { thread_id: params.threadId } : null;
418
426
  if (params.toolName === "loo_expand_session") {
@@ -560,6 +568,12 @@ function buildToolArgs(params) {
560
568
  message: CONTROL_DRY_RUN_MESSAGE
561
569
  } : null;
562
570
  }
571
+ if (params.toolName === "loo_codex_resume_thread") {
572
+ return params.threadId ? {
573
+ thread_id: params.threadId,
574
+ dry_run: true
575
+ } : null;
576
+ }
563
577
  return {};
564
578
  }
565
579
  const TOOL_SMOKE_NOW = "2026-07-01T12:00:00.000Z";
@@ -794,7 +808,7 @@ function summarizeInvocation(toolName, call, requestArgs = {}) {
794
808
  if (tokenBudget !== undefined)
795
809
  summary.tokenBudget = tokenBudget;
796
810
  }
797
- if (toolName === "loo_codex_control_dry_run") {
811
+ if (toolName === "loo_codex_control_dry_run" || toolName === "loo_codex_resume_thread") {
798
812
  const upstreamBlocked = blockers.length > 0;
799
813
  const dryRunOutput = details ?? output;
800
814
  summary.live = booleanPath(dryRunOutput, ["live"]);
@@ -813,7 +827,11 @@ function summarizeInvocation(toolName, call, requestArgs = {}) {
813
827
  summary.method = method;
814
828
  if (action)
815
829
  summary.action = action;
816
- if (!upstreamBlocked && (summary.live !== false || !approvalAuditId || !paramsHash || !messageHash)) {
830
+ const messageHashRequired = action === "codex_send_message"
831
+ || action === "codex_steer_thread"
832
+ || method === "turn/start"
833
+ || method === "turn/steer";
834
+ if (!upstreamBlocked && (summary.live !== false || !approvalAuditId || !paramsHash || (messageHashRequired && !messageHash))) {
817
835
  blockers.push("openclaw_control_dry_run_not_proven");
818
836
  }
819
837
  }
@@ -7,7 +7,7 @@ import { createLooToolDeclarations, executeLooToolForOpenClaw, createLooTools }
7
7
  export const pluginMetadata = {
8
8
  id: "lossless-openclaw-orchestrator",
9
9
  name: "Lossless OpenClaw Orchestrator",
10
- description: "Control and collaborate with local Codex sessions through OpenClaw using local indexing, bounded recall, and approval-gated controls.",
10
+ description: "Collaborate with local Codex sessions through OpenClaw using local indexing, prepared-state recall, bounded expansion, and approval-gated dry-run/control boundaries.",
11
11
  kind: "tool",
12
12
  mcp: {
13
13
  command: "loo-mcp-server",
@@ -381,8 +381,11 @@ separate operations are actually approved and executed.
381
381
  Record `npm dist-tag ls lossless-openclaw-orchestrator` in the release evidence
382
382
  after every npm publication. Stable releases publish with
383
383
  `npm publish --tag latest`; public betas publish with `npm publish --tag beta`;
384
- release candidates publish with `npm publish --tag next`. The first stable release must move `latest` to the stable version and keep beta and other
385
- prereleases on prerelease tags. Do not publish a fake stable package just to move a dist-tag. Release candidates must publish with `npm publish --tag next`;
384
+ release candidates publish with `npm publish --tag next`. The stable channel
385
+ currently points at `1.2.1`; future stable releases move `latest` only after the
386
+ separate stable-promotion gate proves the exact candidate. Keep beta and other
387
+ prereleases on prerelease tags. Do not publish a fake stable package just to
388
+ move a dist-tag. Release candidates must publish with `npm publish --tag next`;
386
389
  RC branches also carry `package.json` `publishConfig.tag` set to `next` as a
387
390
  fail-closed guard against accidental untagged publication. Stable branches carry
388
391
  `package.json` `publishConfig.tag` set to `latest`. Do not run untagged
@@ -1,10 +1,10 @@
1
- # Public Beta Claim Audit
1
+ # Public Claim Audit
2
2
 
3
- ## Allowed Public Beta Claim
3
+ ## Allowed Stable 1.2.1 Claim
4
4
 
5
- Control and collaborate with local Codex sessions through OpenClaw using local indexing, bounded recall, and approval-gated controls.
5
+ Collaborate with local Codex sessions through OpenClaw using local indexing, prepared-state recall, bounded expansion, and approval-gated dry-run/control boundaries.
6
6
 
7
- This claim is limited to the Codex beta path that has tests and local smoke coverage: indexing, search, describe, bounded expansion, read-only LCM peer recall, Codex direct protocol diagnostics, dry-run approval audits, and read-only CUA/Peekaboo readiness.
7
+ This claim is limited to the Codex stable path that has tests and local smoke coverage: indexing, search, describe, prepared-state cards/inbox, summary leaves, bounded expansion, read-only LCM peer recall, Codex direct protocol diagnostics, dry-run approval audits, and read-only CUA/Peekaboo readiness.
8
8
 
9
9
  When a release candidate is scoped to read/search/describe/expand plus dry-run
10
10
  control only, use `--claim-scope codex-read-search-expand-dry-run` on release
@@ -74,8 +74,11 @@ blockers instead of allowing a working-app claim.
74
74
  ## npm dist-tag policy
75
75
 
76
76
  Install stable releases through the `latest` dist-tag, public betas through the
77
- `beta` dist-tag, and release candidates through `next`. The first stable release moves `latest` to `1.0.0` only after the separate stable-promotion gate
78
- proves the exact candidate. Keep beta and other prereleases on prerelease tags. Do not publish a fake stable package just to move a dist-tag.
77
+ `beta` dist-tag, and release candidates through `next`. The stable channel
78
+ currently points at `1.2.1`; future stable releases move `latest` only after the
79
+ separate stable-promotion gate proves the exact candidate. Keep beta and other
80
+ prereleases on prerelease tags. Do not publish a fake stable package just to
81
+ move a dist-tag.
79
82
 
80
83
  ## Release Checklist
81
84
 
@@ -0,0 +1,127 @@
1
+ # Release Notes 1.2.1
2
+
3
+ `1.2.1` is a patch release for the LCO 1.2 prepared-state sprint and
4
+ Codex-first local orchestration. It publishes the OpenClaw facade dogfood fix
5
+ from #497 / #498 to the stable npm `latest` channel without widening the 1.2
6
+ claim boundary.
7
+
8
+ This release is focused on local Codex sessions. Prepared state remains an
9
+ advisory local derived cache, not source authority for PR, CI, release,
10
+ runtime, customer, or business truth.
11
+
12
+ ## What Changed
13
+
14
+ - Fixes the OpenClaw facade smoke validator so `loo_codex_resume_thread`
15
+ dry-run proof accepts the actual resume packet shape: `live: false`,
16
+ `approvalAuditId`, `paramsHash`, `method: "thread/resume"`, and
17
+ `action: "codex_resume_thread"`.
18
+ - Keeps message hashes required for message-carrying send/steer dry-run
19
+ proofs such as `loo_codex_control_dry_run` with `turn/start` or
20
+ `turn/steer`.
21
+ - Adds regression coverage proving resume dry-run proof does not require a
22
+ message hash while send-message dry-runs still fail closed without one.
23
+ - Carries forward additive prepared-state storage for source events, source
24
+ ranges, summary leaves, summary edges, prepared cards, watcher observations,
25
+ hook capture packets, and state-prep jobs.
26
+ - Carries forward deterministic summary leaves from user prompts, proposed
27
+ plans, finals, closeout envelopes, touched-file metadata, tool-call metadata,
28
+ and compaction markers while ignoring huge raw tool-call payloads by default.
29
+ - Carries forward bounded summary expansion with source ranges, max-depth and
30
+ max-node limits, cycle rejection, and explicit omission markers.
31
+ - Carries forward prepared cards and prepared inbox routing with freshness,
32
+ confidence, privacy class, source coverage, authority coverage, and
33
+ stale/partial/unknown downgrades.
34
+ - Carries forward persisted watcher observations and an execute-false local
35
+ attention queue for safe advisory automation.
36
+ - Carries forward hook sidecar commands for closeout capture, state prep, and
37
+ compaction marker capture without opening transcript paths by default.
38
+ - Carries forward OpenClaw gateway dogfood coverage for the prepared-state
39
+ workflow.
40
+ - Carries forward optional local model compaction spike gates and a
41
+ Codex-native compaction-summary capture proposal without claiming true native
42
+ capture.
43
+ - Carries forward semantic lifecycle states for prepared cards and prepared
44
+ inbox routing: `completed`, `blocked_missing_info`, `waiting_approval`,
45
+ `watching_external_check`, `needs_resume`, `dirty_worktree_handoff`,
46
+ `ready_for_review`, `stale_or_partial`, and `unknown_lifecycle`.
47
+ - Carries forward the shared core lifecycle registry, MCP tool schema,
48
+ OpenClaw plugin manifests, and OpenClaw gateway smoke validation.
49
+ - Carries forward deterministic lifecycle reason codes, lifecycle-aware next
50
+ actions, and urgency ranking for advisory prepared cards.
51
+ - Carries forward the completed-card summary counter so finished lanes remain
52
+ visible in prepared-card summaries.
53
+ - Carries forward lifecycle classification hardening so generic words such as
54
+ `resume`, `monitor`, and `ci` do not become lifecycle states without
55
+ operator-action context.
56
+ - Carries forward completed prepared-card target coverage so a fresh public
57
+ completed card counts as target coverage `ok` and does not make
58
+ `loo_prepared_state_status` report stale/partial coverage for a fully
59
+ materialized completed lane.
60
+ - Carries forward stale, partial, unknown, unsafe-row, and stale-freshness
61
+ downgrades for incomplete or unsafe prepared-state evidence.
62
+ - Carries forward the #160 desktop proof-action release boundary:
63
+ `loo_desktop_proof_action` / `loo desktop proof-action` validates the
64
+ CUA Driver TextEdit scratch proof gate and does not prove generic GUI
65
+ mutation.
66
+ The proof action still requires exact backend, target app, target window, action hash, approval ref, permission state, scratch file path, and `execute: true` before the backend can run.
67
+ Generic gateway invocation without exact proof args fails closed. The desktop
68
+ proof action keeps the same proof boundary as beta.35.
69
+ - Carries forward strict OpenClaw gateway result handling: plugin output with
70
+ `output.details.ok: false` is reported as
71
+ `openclaw_tool_result_not_ok:<tool>` rather than successful tool proof.
72
+
73
+ ## Current Claim Scope
74
+
75
+ Allowed stable claim:
76
+
77
+ > Local prepared Codex state and summary-leaf recall for OpenClaw/Eva, including
78
+ > semantic prepared-card lifecycle routing, prepared inbox prioritization,
79
+ > bounded summary expansion, visible Codex sidebar inventory, hook sidecar
80
+ > foundations, watcher observations, and approval-gated start-thread proof
81
+ > packets without raw transcript reads.
82
+
83
+ The stable channel means the scoped prepared-state and cockpit-management
84
+ surface is ready as a public local-Codex release. It does not broaden the
85
+ control, GUI, Claude, customer, or enterprise-security proof boundary.
86
+
87
+ ## Release Gate Notes
88
+
89
+ - Parent 1.2 tracker: #405.
90
+ - GA assurance tracker: #478.
91
+ - Patch-release issue: #500.
92
+ - Facade dogfood bug: #497.
93
+ - Patch PRs: #498 and the 1.2.1 release PR.
94
+ - Baseline stable release: `v1.2.0`.
95
+ - Candidate package: `lossless-openclaw-orchestrator@1.2.1`.
96
+ - Expected npm dist-tag: `latest`.
97
+ - Expected git tag: `v1.2.1`.
98
+ - Required stable gates: focused OpenClaw tool-smoke tests, release claim
99
+ audit, build/typecheck, `npm pack --dry-run`, release bundle/status checks,
100
+ GitHub CI, CodeQL, current-head review threads clear, npm publish to
101
+ `latest`, GitHub release, and post-publish finalization status.
102
+ - Bundle/status/finalization dry-run checks do not publish to npm and do not create a GitHub Release.
103
+ - Working-app status example:
104
+ `loo release status --claim-scope codex-working-app-proof --runtime-proof-dir <path> --approved-live-control-evidence <path> --npm-publish-approval-evidence <path> --github-release-approval-evidence <path> --candidate-sha <sha> --github-ci-evidence <path> --codeql-evidence <path> --evidence-dir <path> --strict`
105
+ - Reduced-scope status example:
106
+ `loo release status --claim-scope codex-read-search-expand-dry-run --npm-publish-approval-evidence <path> --github-release-approval-evidence <path> --candidate-sha <sha> --github-ci-evidence <path> --codeql-evidence <path> --evidence-dir <path> --strict`
107
+ - `approved_live_control_smoke_missing` remains the expected blocker when a
108
+ working-app or live-control claim is attempted without approved live-control
109
+ smoke evidence for the exact candidate SHA.
110
+
111
+ ## Explicit Non-Claims
112
+
113
+ No new live Codex control smoke is run by this release.
114
+ It does not run generic GUI mutation and does not run Codex GUI mutation.
115
+ No automatic gateway authorization.
116
+ No broad gateway scope approval. No prompt typing. No clicking. No arbitrary app control.
117
+ No screenshots or videos are part of the public release evidence.
118
+ Claude Code remains an adapter stub, not an adapter-equivalence claim.
119
+ No true Codex compaction-summary capture.
120
+ No raw model compaction by default and no default model access to raw transcript
121
+ or current `safe_text`.
122
+ No raw transcript upload and no OpenClaw LCM merge.
123
+ No source-store mutation.
124
+ No Notion, support-control, Stripe, or Company Brain P1 adapter proof.
125
+ No cloud sync.
126
+ No unattended desktop takeover.
127
+ No release-grade enterprise security or customer-ready security claim.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "id": "lossless-openclaw-orchestrator",
3
3
  "name": "Lossless OpenClaw Orchestrator",
4
- "description": "Control and collaborate with local Codex sessions through OpenClaw using local indexing, bounded recall, and approval-gated controls.",
5
- "version": "1.2.0",
4
+ "description": "Collaborate with local Codex sessions through OpenClaw using local indexing, prepared-state recall, bounded expansion, and approval-gated dry-run/control boundaries.",
5
+ "version": "1.2.1",
6
6
  "kind": "tool",
7
7
  "tools": {
8
8
  "prefix": "loo_"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lossless-openclaw-orchestrator",
3
- "version": "1.2.0",
4
- "description": "Index, search, and control local Codex sessions through OpenClaw with approval-gated safety; Claude Code remains an experimental adapter stub.",
3
+ "version": "1.2.1",
4
+ "description": "Index, search, and prepare local Codex sessions for OpenClaw with approval-gated dry-run/control boundaries.",
5
5
  "type": "module",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",
7
7
  "private": false,
@@ -235,7 +235,15 @@ export function runOpenClawToolSmoke(options: OpenClawToolSmokeOptions = {}): Op
235
235
  tokenBudget,
236
236
  desktopFallbackCoherence: options.desktopFallbackCoherence
237
237
  });
238
- if (toolName === "loo_describe_session" || toolName === "loo_expand_session" || toolName === "loo_codex_control_dry_run" || toolName === "loo_codex_desktop_coherence" || toolName === "loo_codex_desktop_fallback_status") {
238
+ if (
239
+ toolName === "loo_describe_ref"
240
+ || toolName === "loo_describe_session"
241
+ || toolName === "loo_expand_session"
242
+ || toolName === "loo_codex_control_dry_run"
243
+ || toolName === "loo_codex_resume_thread"
244
+ || toolName === "loo_codex_desktop_coherence"
245
+ || toolName === "loo_codex_desktop_fallback_status"
246
+ ) {
239
247
  if (!args) {
240
248
  blockers.push("openclaw_tool_smoke_missing_thread_ref");
241
249
  continue;
@@ -570,6 +578,7 @@ function buildToolArgs(params: {
570
578
  desktopFallbackCoherence?: "fixture" | "omit";
571
579
  }): Record<string, unknown> | null {
572
580
  if (params.toolName === "loo_search_sessions") return { query: params.query, limit: 3 };
581
+ if (params.toolName === "loo_describe_ref") return params.threadId ? { source_ref: `codex_thread:${params.threadId}` } : null;
573
582
  if (params.toolName === "loo_describe_session") return params.threadId ? { thread_id: params.threadId } : null;
574
583
  if (params.toolName === "loo_expand_session") {
575
584
  return params.threadId ? { thread_id: params.threadId, profile: params.expandProfile, token_budget: params.tokenBudget } : null;
@@ -708,6 +717,12 @@ function buildToolArgs(params: {
708
717
  message: CONTROL_DRY_RUN_MESSAGE
709
718
  } : null;
710
719
  }
720
+ if (params.toolName === "loo_codex_resume_thread") {
721
+ return params.threadId ? {
722
+ thread_id: params.threadId,
723
+ dry_run: true
724
+ } : null;
725
+ }
711
726
  return {};
712
727
  }
713
728
 
@@ -954,7 +969,7 @@ function summarizeInvocation(
954
969
  const tokenBudget = numberPath(summarySource, ["limits", "tokenBudget"]) ?? numberPath(summarySource, ["tokenBudget"]) ?? numberPath(summarySource, ["token_budget"]);
955
970
  if (tokenBudget !== undefined) summary.tokenBudget = tokenBudget;
956
971
  }
957
- if (toolName === "loo_codex_control_dry_run") {
972
+ if (toolName === "loo_codex_control_dry_run" || toolName === "loo_codex_resume_thread") {
958
973
  const upstreamBlocked = blockers.length > 0;
959
974
  const dryRunOutput = details ?? output;
960
975
  summary.live = booleanPath(dryRunOutput, ["live"]);
@@ -968,7 +983,12 @@ function summarizeInvocation(
968
983
  if (messageHash) summary.messageHash = messageHash;
969
984
  if (method) summary.method = method;
970
985
  if (action) summary.action = action;
971
- if (!upstreamBlocked && (summary.live !== false || !approvalAuditId || !paramsHash || !messageHash)) {
986
+ const messageHashRequired =
987
+ action === "codex_send_message"
988
+ || action === "codex_steer_thread"
989
+ || method === "turn/start"
990
+ || method === "turn/steer";
991
+ if (!upstreamBlocked && (summary.live !== false || !approvalAuditId || !paramsHash || (messageHashRequired && !messageHash))) {
972
992
  blockers.push("openclaw_control_dry_run_not_proven");
973
993
  }
974
994
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "id": "lossless-openclaw-orchestrator",
3
3
  "name": "Lossless OpenClaw Orchestrator",
4
- "description": "Control and collaborate with local Codex sessions through OpenClaw using local indexing, bounded recall, and approval-gated controls.",
5
- "version": "1.2.0",
4
+ "description": "Collaborate with local Codex sessions through OpenClaw using local indexing, prepared-state recall, bounded expansion, and approval-gated dry-run/control boundaries.",
5
+ "version": "1.2.1",
6
6
  "kind": "tool",
7
7
  "tools": {
8
8
  "prefix": "loo_"
@@ -18,7 +18,7 @@ import {
18
18
  export const pluginMetadata = {
19
19
  id: "lossless-openclaw-orchestrator",
20
20
  name: "Lossless OpenClaw Orchestrator",
21
- description: "Control and collaborate with local Codex sessions through OpenClaw using local indexing, bounded recall, and approval-gated controls.",
21
+ description: "Collaborate with local Codex sessions through OpenClaw using local indexing, prepared-state recall, bounded expansion, and approval-gated dry-run/control boundaries.",
22
22
  kind: "tool",
23
23
  mcp: {
24
24
  command: "loo-mcp-server",